@@ -90,9 +90,10 @@ bool WiFiMulti::addAP(const char* ssid, const char *passphrase)
90
90
return true ;
91
91
}
92
92
93
- uint8_t WiFiMulti::run (uint32_t connectTimeout)
93
+ uint8_t WiFiMulti::run (uint32_t connectTimeout, bool scanHidden )
94
94
{
95
95
int8_t scanResult;
96
+ unsigned long startTime;
96
97
uint8_t status = WiFi.status ();
97
98
if (status == WL_CONNECTED) {
98
99
if (!_bWFMInit && _connectionTestCBFunc != NULL ){
@@ -116,13 +117,13 @@ uint8_t WiFiMulti::run(uint32_t connectTimeout)
116
117
status = WiFi.status ();
117
118
}
118
119
119
- scanResult = WiFi.scanNetworks ();
120
+ scanResult = WiFi.scanNetworks (false , scanHidden );
120
121
if (scanResult == WIFI_SCAN_RUNNING) {
121
122
// scan is running
122
123
return WL_NO_SSID_AVAIL;
123
124
} else if (scanResult >= 0 ) {
124
125
// scan done analyze
125
- int32_t bestIndex = 0 ;
126
+ int32_t bestIndex = - 1 ;
126
127
WifiAPlist_t bestNetwork { NULL , NULL , false };
127
128
int bestNetworkDb = INT_MIN;
128
129
int bestNetworkSec = WIFI_AUTH_MAX;
@@ -145,8 +146,10 @@ uint8_t WiFiMulti::run(uint32_t connectTimeout)
145
146
uint8_t sec_scan;
146
147
uint8_t * BSSID_scan;
147
148
int32_t chan_scan;
149
+ bool hidden_scan;
148
150
149
151
WiFi.getNetworkInfo (i, ssid_scan, sec_scan, rssi_scan, BSSID_scan, chan_scan);
152
+ hidden_scan = (ssid_scan.length () == 0 ) && scanHidden;
150
153
// add any Open WiFi AP to the list, if allowed with setAllowOpenAP(true)
151
154
if (_bAllowOpenAP && sec_scan == WIFI_AUTH_OPEN){
152
155
bool found = false ;
@@ -163,14 +166,49 @@ uint8_t WiFiMulti::run(uint32_t connectTimeout)
163
166
}
164
167
}
165
168
169
+ if (hidden_scan) {
170
+ log_v (" hidden ssid on channel %d found, trying to connect with known credentials..." , chan_scan);
171
+ }
172
+
166
173
bool known = false ;
167
174
for (uint32_t x = 0 ; x < APlist.size (); x++) {
168
175
WifiAPlist_t entry = APlist[x];
169
176
170
- if (ssid_scan == entry.ssid ) { // SSID match
171
- log_v (" known ssid: %s, has failed: %s" , entry.ssid , entry.hasFailed ? " yes" : " no" );
172
- foundCount++;
173
- if (!entry.hasFailed ){
177
+ if (ssid_scan == entry.ssid || hidden_scan) { // SSID match or hidden network found
178
+ if (!hidden_scan) {
179
+ log_v (" known ssid: %s, has failed: %s" , entry.ssid , entry.hasFailed ? " yes" : " no" );
180
+ foundCount++;
181
+ }
182
+ if (!entry.hasFailed ) {
183
+ if (hidden_scan) {
184
+ WiFi.begin (entry.ssid , entry.passphrase , chan_scan, BSSID_scan);
185
+
186
+ // If the ssid returned from the scan is empty, it is a hidden SSID
187
+ // it appears that the WiFi.begin() function is asynchronous and takes
188
+ // additional time to connect to a hidden SSID. Therefore a delay of 1000ms
189
+ // is added for hidden SSIDs before calling WiFi.status()
190
+ delay (1000 );
191
+
192
+ status = WiFi.status ();
193
+ startTime = millis ();
194
+
195
+ while (status != WL_CONNECTED && (millis () - startTime) <= connectTimeout)
196
+ {
197
+ delay (10 );
198
+ status = WiFi.status ();
199
+ }
200
+
201
+ WiFi.disconnect ();
202
+ delay (10 );
203
+
204
+ if (status == WL_CONNECTED) {
205
+ log_v (" hidden ssid %s found" , entry.ssid );
206
+ ssid_scan = entry.ssid ;
207
+ foundCount++;
208
+ } else {
209
+ continue ;
210
+ }
211
+ }
174
212
known = true ;
175
213
log_v (" rssi_scan: %d, bestNetworkDb: %d" , rssi_scan, bestNetworkDb);
176
214
if (rssi_scan > bestNetworkDb) { // best network
@@ -191,10 +229,24 @@ uint8_t WiFiMulti::run(uint32_t connectTimeout)
191
229
}
192
230
}
193
231
194
- if (known) {
195
- log_d (" ---> %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) %c" , i, chan_scan, BSSID_scan[0 ], BSSID_scan[1 ], BSSID_scan[2 ], BSSID_scan[3 ], BSSID_scan[4 ], BSSID_scan[5 ], ssid_scan.c_str (), rssi_scan, (sec_scan == WIFI_AUTH_OPEN) ? ' ' : ' *' );
232
+ if (known) {
233
+ log_d (" ---> %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) (%c) (%s)" ,
234
+ i,
235
+ chan_scan,
236
+ BSSID_scan[0 ], BSSID_scan[1 ], BSSID_scan[2 ], BSSID_scan[3 ], BSSID_scan[4 ], BSSID_scan[5 ],
237
+ ssid_scan.c_str (),
238
+ rssi_scan,
239
+ (sec_scan == WIFI_AUTH_OPEN) ? ' ' : ' *' ,
240
+ (hidden_scan) ? " hidden" : " visible" );
196
241
} else {
197
- log_d (" %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) %c" , i, chan_scan, BSSID_scan[0 ], BSSID_scan[1 ], BSSID_scan[2 ], BSSID_scan[3 ], BSSID_scan[4 ], BSSID_scan[5 ], ssid_scan.c_str (), rssi_scan, (sec_scan == WIFI_AUTH_OPEN) ? ' ' : ' *' );
242
+ log_d (" %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) (%c) (%s)" ,
243
+ i,
244
+ chan_scan,
245
+ BSSID_scan[0 ], BSSID_scan[1 ], BSSID_scan[2 ], BSSID_scan[3 ], BSSID_scan[4 ], BSSID_scan[5 ],
246
+ ssid_scan.c_str (),
247
+ rssi_scan,
248
+ (sec_scan == WIFI_AUTH_OPEN) ? ' ' : ' *' ,
249
+ (hidden_scan) ? " hidden" : " visible" );
198
250
}
199
251
}
200
252
log_v (" foundCount = %d, failCount = %d" , foundCount, failCount);
@@ -206,7 +258,7 @@ uint8_t WiFiMulti::run(uint32_t connectTimeout)
206
258
// clean up ram
207
259
WiFi.scanDelete ();
208
260
209
- if (bestNetwork. ssid ) {
261
+ if (bestIndex >= 0 ) {
210
262
log_i (" [WIFI] Connecting BSSID: %02X:%02X:%02X:%02X:%02X:%02X SSID: %s Channel: %d (%d)" , bestBSSID[0 ], bestBSSID[1 ], bestBSSID[2 ], bestBSSID[3 ], bestBSSID[4 ], bestBSSID[5 ], bestNetwork.ssid , bestChannel, bestNetworkDb);
211
263
212
264
if (ipv6_support == true ) {
@@ -218,7 +270,7 @@ uint8_t WiFiMulti::run(uint32_t connectTimeout)
218
270
status = WiFi.status ();
219
271
_bWFMInit = true ;
220
272
221
- auto startTime = millis ();
273
+ startTime = millis ();
222
274
// wait for connection, fail, or timeout
223
275
while (status != WL_CONNECTED && (millis () - startTime) <= connectTimeout) { // && status != WL_NO_SSID_AVAIL && status != WL_CONNECT_FAILED
224
276
delay (10 );
0 commit comments