@@ -53,6 +53,36 @@ CHIP_ERROR ESP32Utils::IsStationEnabled(bool & staEnabled)
53
53
return CHIP_NO_ERROR;
54
54
}
55
55
56
+ CHIP_ERROR ESP32Utils::EnableStationMode (void )
57
+ {
58
+ wifi_mode_t curWiFiMode;
59
+
60
+ // Get the current ESP WiFI mode.
61
+ esp_err_t err = esp_wifi_get_mode (&curWiFiMode);
62
+ if (err != ESP_OK)
63
+ {
64
+ ChipLogError (DeviceLayer, " esp_wifi_get_mode() failed: %s" , esp_err_to_name (err));
65
+ return ESP32Utils::MapError (err);
66
+ }
67
+
68
+ // If station mode is not already enabled (implying the current mode is WIFI_MODE_AP), change
69
+ // the mode to WIFI_MODE_APSTA.
70
+ if (curWiFiMode == WIFI_MODE_AP)
71
+ {
72
+ ChipLogProgress (DeviceLayer, " Changing ESP WiFi mode: %s -> %s" , WiFiModeToStr (WIFI_MODE_AP),
73
+ WiFiModeToStr (WIFI_MODE_APSTA));
74
+
75
+ err = esp_wifi_set_mode (WIFI_MODE_APSTA);
76
+ if (err != ESP_OK)
77
+ {
78
+ ChipLogError (DeviceLayer, " esp_wifi_set_mode() failed: %s" , esp_err_to_name (err));
79
+ return ESP32Utils::MapError (err);
80
+ }
81
+ }
82
+
83
+ return CHIP_NO_ERROR;
84
+ }
85
+
56
86
bool ESP32Utils::IsStationProvisioned (void )
57
87
{
58
88
wifi_config_t stationConfig;
@@ -126,6 +156,10 @@ const char * ESP32Utils::WiFiModeToStr(wifi_mode_t wifiMode)
126
156
return " NULL" ;
127
157
case WIFI_MODE_STA:
128
158
return " STA" ;
159
+ case WIFI_MODE_AP:
160
+ return " AP" ;
161
+ case WIFI_MODE_APSTA:
162
+ return " STA+AP" ;
129
163
default :
130
164
return " (unknown)" ;
131
165
}
@@ -173,6 +207,10 @@ CHIP_ERROR ESP32Utils::SetWiFiStationProvision(const Internal::DeviceNetworkInfo
173
207
char wifiSSID[kMaxWiFiSSIDLength + 1 ];
174
208
size_t netInfoSSIDLen = strlen (netInfo.WiFiSSID );
175
209
210
+ // Ensure that ESP station mode is enabled. This is required before esp_wifi_set_config(ESP_IF_WIFI_STA,...)
211
+ // can be called.
212
+ ReturnErrorOnFailure (ESP32Utils::EnableStationMode ());
213
+
176
214
// Enforce that wifiSSID is null terminated before copying it
177
215
memcpy (wifiSSID, netInfo.WiFiSSID , min (netInfoSSIDLen + 1 , sizeof (wifiSSID)));
178
216
if (netInfoSSIDLen + 1 < sizeof (wifiSSID))
@@ -244,18 +282,6 @@ CHIP_ERROR ESP32Utils::InitWiFiStack(void)
244
282
return ESP32Utils::MapError (err);
245
283
}
246
284
247
- esp_wifi_get_mode (&mode);
248
- if (mode == WIFI_MODE_AP)
249
- {
250
- esp_fill_random (ap_mac, sizeof (ap_mac));
251
- /* Bit 0 of the first octet of MAC Address should always be 0 */
252
- ap_mac[0 ] &= (uint8_t ) ~0x01 ;
253
- err = esp_wifi_set_mac (WIFI_IF_AP, ap_mac);
254
- if (err != ESP_OK)
255
- {
256
- return ESP32Utils::MapError (err);
257
- }
258
- }
259
285
err = esp_event_handler_register (WIFI_EVENT, ESP_EVENT_ANY_ID, PlatformManagerImpl::HandleESPSystemEvent, NULL );
260
286
if (err != ESP_OK)
261
287
{
0 commit comments