@@ -40,16 +40,33 @@ bool ESP8266WiFiMulti::addAP(const char* ssid, const char *passphrase) {
4040
4141wl_status_t ESP8266WiFiMulti::run (void ) {
4242
43- int8_t scanResult;
4443 wl_status_t status = WiFi.status ();
4544 if (status == WL_DISCONNECTED || status == WL_NO_SSID_AVAIL || status == WL_IDLE_STATUS || status == WL_CONNECT_FAILED) {
4645
47- scanResult = WiFi.scanComplete ();
46+ int8_t scanResult = WiFi.scanComplete ();
47+
4848 if (scanResult == WIFI_SCAN_RUNNING) {
49- // scan is running
50- return WL_NO_SSID_AVAIL;
51- } else if (scanResult > 0 ) {
52- // scan done analyze
49+ // scan is running, do nothing yet
50+ status = WL_NO_SSID_AVAIL;
51+ return status;
52+ }
53+
54+ if (scanResult == 0 ) {
55+ // scan done, no ssids found. Start another scan.
56+ DEBUG_WIFI_MULTI (" [WIFI] scan done\n " );
57+ DEBUG_WIFI_MULTI (" [WIFI] no networks found\n " );
58+ WiFi.scanDelete ();
59+ DEBUG_WIFI_MULTI (" \n\n " );
60+ delay (0 );
61+ WiFi.disconnect ();
62+ DEBUG_WIFI_MULTI (" [WIFI] start scan\n " );
63+ // scan wifi async mode
64+ WiFi.scanNetworks (true );
65+ return status;
66+ }
67+
68+ if (scanResult > 0 ) {
69+ // scan done, analyze
5370 WifiAPlist_t bestNetwork { NULL , NULL };
5471 int bestNetworkDb = INT_MIN;
5572 uint8 bestBSSID[6 ];
@@ -58,48 +75,44 @@ wl_status_t ESP8266WiFiMulti::run(void) {
5875 DEBUG_WIFI_MULTI (" [WIFI] scan done\n " );
5976 delay (0 );
6077
61- if (scanResult <= 0 ) {
62- DEBUG_WIFI_MULTI (" [WIFI] no networks found\n " );
63- } else {
64- DEBUG_WIFI_MULTI (" [WIFI] %d networks found\n " , scanResult);
65- for (int8_t i = 0 ; i < scanResult; ++i) {
66-
67- String ssid_scan;
68- int32_t rssi_scan;
69- uint8_t sec_scan;
70- uint8_t * BSSID_scan;
71- int32_t chan_scan;
72- bool hidden_scan;
73-
74- WiFi.getNetworkInfo (i, ssid_scan, sec_scan, rssi_scan, BSSID_scan, chan_scan, hidden_scan);
75-
76- bool known = false ;
77- for (uint32_t x = 0 ; x < APlist.size (); x++) {
78- WifiAPlist_t entry = APlist[x];
79-
80- if (ssid_scan == entry.ssid ) { // SSID match
81- known = true ;
82- if (rssi_scan > bestNetworkDb) { // best network
83- if (sec_scan == ENC_TYPE_NONE || entry.passphrase ) { // check for passphrase if not open wlan
84- bestNetworkDb = rssi_scan;
85- bestChannel = chan_scan;
86- memcpy ((void *) &bestNetwork, (void *) &entry, sizeof (bestNetwork));
87- memcpy ((void *) &bestBSSID, (void *) BSSID_scan, sizeof (bestBSSID));
88- }
78+ DEBUG_WIFI_MULTI (" [WIFI] %d networks found\n " , scanResult);
79+ for (int8_t i = 0 ; i < scanResult; ++i) {
80+
81+ String ssid_scan;
82+ int32_t rssi_scan;
83+ uint8_t sec_scan;
84+ uint8_t * BSSID_scan;
85+ int32_t chan_scan;
86+ bool hidden_scan;
87+
88+ WiFi.getNetworkInfo (i, ssid_scan, sec_scan, rssi_scan, BSSID_scan, chan_scan, hidden_scan);
89+
90+ bool known = false ;
91+ for (uint32_t x = 0 ; x < APlist.size (); x++) {
92+ WifiAPlist_t entry = APlist[x];
93+
94+ if (ssid_scan == entry.ssid ) { // SSID match
95+ known = true ;
96+ if (rssi_scan > bestNetworkDb) { // best network
97+ if (sec_scan == ENC_TYPE_NONE || entry.passphrase ) { // check for passphrase if not open wlan
98+ bestNetworkDb = rssi_scan;
99+ bestChannel = chan_scan;
100+ memcpy ((void *) &bestNetwork, (void *) &entry, sizeof (bestNetwork));
101+ memcpy ((void *) &bestBSSID, (void *) BSSID_scan, sizeof (bestBSSID));
89102 }
90- break ;
91103 }
104+ break ;
92105 }
106+ }
93107
94- if (known) {
95- DEBUG_WIFI_MULTI (" ---> " );
96- } else {
97- DEBUG_WIFI_MULTI (" " );
98- }
99-
100- DEBUG_WIFI_MULTI (" %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) %c\n " , 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 == ENC_TYPE_NONE) ? ' ' : ' *' );
101- delay (0 );
108+ if (known) {
109+ DEBUG_WIFI_MULTI (" ---> " );
110+ } else {
111+ DEBUG_WIFI_MULTI (" " );
102112 }
113+
114+ DEBUG_WIFI_MULTI (" %d: [%d][%02X:%02X:%02X:%02X:%02X:%02X] %s (%d) %c\n " , 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 == ENC_TYPE_NONE) ? ' ' : ' *' );
115+ delay (0 );
103116 }
104117
105118 // clean up ram
@@ -146,15 +159,18 @@ wl_status_t ESP8266WiFiMulti::run(void) {
146159 } else {
147160 DEBUG_WIFI_MULTI (" [WIFI] no matching wifi found!\n " );
148161 }
149- } else {
150- // start scan
151- DEBUG_WIFI_MULTI (" [WIFI] delete old wifi config...\n " );
152- WiFi.disconnect ();
153162
154- DEBUG_WIFI_MULTI (" [WIFI] start scan\n " );
155- // scan wifi async mode
156- WiFi.scanNetworks (true );
163+ return status;
157164 }
165+
166+
167+ // scan failed, or some other condition not handled above. Start another scan.
168+ DEBUG_WIFI_MULTI (" [WIFI] delete old wifi config...\n " );
169+ WiFi.disconnect ();
170+
171+ DEBUG_WIFI_MULTI (" [WIFI] start scan\n " );
172+ // scan wifi async mode
173+ WiFi.scanNetworks (true );
158174 }
159175 return status;
160176}
0 commit comments