@@ -40,107 +40,119 @@ bool ESP8266WiFiMulti::addAP(const char* ssid, const char *passphrase) {
4040
4141wl_status_t ESP8266WiFiMulti::run (void ) {
4242
43+ int8_t scanResult;
4344 wl_status_t status = WiFi.status ();
4445 if (status == WL_DISCONNECTED || status == WL_NO_SSID_AVAIL || status == WL_IDLE_STATUS || status == WL_CONNECT_FAILED) {
4546
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+ }
8889 }
90+ break ;
8991 }
90- break ;
9192 }
92- }
9393
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+ }
9999
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+ }
102103 }
103- }
104104
105- DEBUG_WIFI_MULTI ( " \n\n " );
106- delay ( 0 );
105+ // clean up ram
106+ WiFi. scanDelete ( );
107107
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 );
110110
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 );
113113
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);
117115 status = WiFi.status ();
118- }
119116
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 " );
141147 }
142148 } 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 );
144156 }
145157 }
146158 return status;
0 commit comments