@@ -40,16 +40,33 @@ bool ESP8266WiFiMulti::addAP(const char* ssid, const char *passphrase) {
40
40
41
41
wl_status_t ESP8266WiFiMulti::run (void ) {
42
42
43
- int8_t scanResult;
44
43
wl_status_t status = WiFi.status ();
45
44
if (status == WL_DISCONNECTED || status == WL_NO_SSID_AVAIL || status == WL_IDLE_STATUS || status == WL_CONNECT_FAILED) {
46
45
47
- scanResult = WiFi.scanComplete ();
46
+ int8_t scanResult = WiFi.scanComplete ();
47
+
48
48
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
53
70
WifiAPlist_t bestNetwork { NULL , NULL };
54
71
int bestNetworkDb = INT_MIN;
55
72
uint8 bestBSSID[6 ];
@@ -58,48 +75,44 @@ wl_status_t ESP8266WiFiMulti::run(void) {
58
75
DEBUG_WIFI_MULTI (" [WIFI] scan done\n " );
59
76
delay (0 );
60
77
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));
89
102
}
90
- break ;
91
103
}
104
+ break ;
92
105
}
106
+ }
93
107
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 (" " );
102
112
}
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 );
103
116
}
104
117
105
118
// clean up ram
@@ -146,15 +159,18 @@ wl_status_t ESP8266WiFiMulti::run(void) {
146
159
} else {
147
160
DEBUG_WIFI_MULTI (" [WIFI] no matching wifi found!\n " );
148
161
}
149
- } else {
150
- // start scan
151
- DEBUG_WIFI_MULTI (" [WIFI] delete old wifi config...\n " );
152
- WiFi.disconnect ();
153
162
154
- DEBUG_WIFI_MULTI (" [WIFI] start scan\n " );
155
- // scan wifi async mode
156
- WiFi.scanNetworks (true );
163
+ return status;
157
164
}
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 );
158
174
}
159
175
return status;
160
176
}
0 commit comments