@@ -40,107 +40,119 @@ 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;
43
44
wl_status_t status = WiFi.status ();
44
45
if (status == WL_DISCONNECTED || status == WL_NO_SSID_AVAIL || status == WL_IDLE_STATUS || status == WL_CONNECT_FAILED) {
45
46
46
- WifiAPlist_t bestNetwork { NULL , NULL } ;
47
- int bestNetworkDb = INT_MIN;
48
- uint8 bestBSSID[ 6 ];
49
- int32_t bestChannel ;
50
-
51
- DEBUG_WIFI_MULTI ( " [WIFI] delete old wifi config... \n " );
52
- WiFi. disconnect () ;
53
-
54
- DEBUG_WIFI_MULTI ( " [WIFI] start scan \n " ) ;
55
- // WiFi.scanNetworks will return the number of networks found
56
- int8_t n = WiFi. scanNetworks ();
57
-
58
- DEBUG_WIFI_MULTI ( " [WIFI] scan done \n " );
59
- delay ( 0 );
60
-
61
- if (n <= 0 ) {
62
- DEBUG_WIFI_MULTI ( " [WIFI] no networks found \n " );
63
- } else {
64
- DEBUG_WIFI_MULTI ( " [WIFI] %d networks found \n " , n);
65
- for ( int8_t i = 0 ; i < n; ++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));
47
+ scanResult = WiFi. scanComplete () ;
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
53
+ WifiAPlist_t bestNetwork { NULL , NULL } ;
54
+ int bestNetworkDb = INT_MIN;
55
+ uint8 bestBSSID[ 6 ] ;
56
+ int32_t bestChannel;
57
+
58
+ DEBUG_WIFI_MULTI ( " [WIFI] scan done \n " );
59
+ delay ( 0 );
60
+
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
+ }
88
89
}
90
+ break ;
89
91
}
90
- break ;
91
92
}
92
- }
93
93
94
- if (known) {
95
- DEBUG_WIFI_MULTI (" ---> " );
96
- } else {
97
- DEBUG_WIFI_MULTI (" " );
98
- }
94
+ if (known) {
95
+ DEBUG_WIFI_MULTI (" ---> " );
96
+ } else {
97
+ DEBUG_WIFI_MULTI (" " );
98
+ }
99
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 );
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 );
102
+ }
102
103
}
103
- }
104
104
105
- DEBUG_WIFI_MULTI ( " \n\n " );
106
- delay ( 0 );
105
+ // clean up ram
106
+ WiFi. scanDelete ( );
107
107
108
- if (bestNetwork. ssid ) {
109
- DEBUG_WIFI_MULTI ( " [WIFI] Connecting BSSID: %02X:%02X:%02X:%02X:%02X:%02X SSID: %s Channal: %d (%d) \n " , bestBSSID[ 0 ], bestBSSID[ 1 ], bestBSSID[ 2 ], bestBSSID[ 3 ], bestBSSID[ 4 ], bestBSSID[ 5 ], bestNetwork. ssid , bestChannel, bestNetworkDb );
108
+ DEBUG_WIFI_MULTI ( " \n\n " );
109
+ delay ( 0 );
110
110
111
- WiFi. begin (bestNetwork.ssid , bestNetwork. passphrase , bestChannel, bestBSSID);
112
- status = WiFi. status ( );
111
+ if (bestNetwork.ssid ) {
112
+ DEBUG_WIFI_MULTI ( " [WIFI] Connecting BSSID: %02X:%02X:%02X:%02X:%02X:%02X SSID: %s Channal: %d (%d) \n " , bestBSSID[ 0 ], bestBSSID[ 1 ], bestBSSID[ 2 ], bestBSSID[ 3 ], bestBSSID[ 4 ], bestBSSID[ 5 ], bestNetwork. ssid , bestChannel, bestNetworkDb );
113
113
114
- // wait for connection or fail
115
- while (status != WL_CONNECTED && status != WL_NO_SSID_AVAIL && status != WL_CONNECT_FAILED) {
116
- delay (10 );
114
+ WiFi.begin (bestNetwork.ssid , bestNetwork.passphrase , bestChannel, bestBSSID);
117
115
status = WiFi.status ();
118
- }
119
116
120
- IPAddress ip;
121
- uint8_t * mac;
122
- switch (status) {
123
- case WL_CONNECTED:
124
- ip = WiFi.localIP ();
125
- mac = WiFi.BSSID ();
126
- DEBUG_WIFI_MULTI (" [WIFI] Connecting done.\n " );
127
- DEBUG_WIFI_MULTI (" [WIFI] SSID: %s\n " , WiFi.SSID ());
128
- DEBUG_WIFI_MULTI (" [WIFI] IP: %d.%d.%d.%d\n " , ip[0 ], ip[1 ], ip[2 ], ip[3 ]);
129
- DEBUG_WIFI_MULTI (" [WIFI] MAC: %02X:%02X:%02X:%02X:%02X:%02X\n " , mac[0 ], mac[1 ], mac[2 ], mac[3 ], mac[4 ], mac[5 ]);
130
- DEBUG_WIFI_MULTI (" [WIFI] Channel: %d\n " , WiFi.channel ());
131
- break ;
132
- case WL_NO_SSID_AVAIL:
133
- DEBUG_WIFI_MULTI (" [WIFI] Connecting Faild AP not found.\n " );
134
- break ;
135
- case WL_CONNECT_FAILED:
136
- DEBUG_WIFI_MULTI (" [WIFI] Connecting Faild.\n " );
137
- break ;
138
- default :
139
- DEBUG_WIFI_MULTI (" [WIFI] Connecting Faild (%d).\n " , status);
140
- break ;
117
+ // wait for connection or fail
118
+ while (status != WL_CONNECTED && status != WL_NO_SSID_AVAIL && status != WL_CONNECT_FAILED) {
119
+ delay (10 );
120
+ status = WiFi.status ();
121
+ }
122
+
123
+ IPAddress ip;
124
+ uint8_t * mac;
125
+ switch (status) {
126
+ case WL_CONNECTED:
127
+ ip = WiFi.localIP ();
128
+ mac = WiFi.BSSID ();
129
+ DEBUG_WIFI_MULTI (" [WIFI] Connecting done.\n " );
130
+ DEBUG_WIFI_MULTI (" [WIFI] SSID: %s\n " , WiFi.SSID ());
131
+ DEBUG_WIFI_MULTI (" [WIFI] IP: %d.%d.%d.%d\n " , ip[0 ], ip[1 ], ip[2 ], ip[3 ]);
132
+ DEBUG_WIFI_MULTI (" [WIFI] MAC: %02X:%02X:%02X:%02X:%02X:%02X\n " , mac[0 ], mac[1 ], mac[2 ], mac[3 ], mac[4 ], mac[5 ]);
133
+ DEBUG_WIFI_MULTI (" [WIFI] Channel: %d\n " , WiFi.channel ());
134
+ break ;
135
+ case WL_NO_SSID_AVAIL:
136
+ DEBUG_WIFI_MULTI (" [WIFI] Connecting Faild AP not found.\n " );
137
+ break ;
138
+ case WL_CONNECT_FAILED:
139
+ DEBUG_WIFI_MULTI (" [WIFI] Connecting Faild.\n " );
140
+ break ;
141
+ default :
142
+ DEBUG_WIFI_MULTI (" [WIFI] Connecting Faild (%d).\n " , status);
143
+ break ;
144
+ }
145
+ } else {
146
+ DEBUG_WIFI_MULTI (" [WIFI] no matching wifi found!\n " );
141
147
}
142
148
} else {
143
- DEBUG_WIFI_MULTI (" [WIFI] no matching wifi found!\n " );
149
+ // start scan
150
+ DEBUG_WIFI_MULTI (" [WIFI] delete old wifi config...\n " );
151
+ WiFi.disconnect ();
152
+
153
+ DEBUG_WIFI_MULTI (" [WIFI] start scan\n " );
154
+ // scan wifi async mode
155
+ WiFi.scanNetworks (true );
144
156
}
145
157
}
146
158
return status;
0 commit comments