mirror of
				https://github.com/esp8266/Arduino.git
				synced 2025-11-03 14:33:37 +03:00 
			
		
		
		
	ESP8266WiFi extended functions
- begin changes
     allow setting BSSID/MAC and Channel of an AP for faster connection (#261)
     now checks if ssid and passphrase to big
     selecting Wifi mode in better way (fix for #28)
 - ESP8266WiFiMulti uses the new functions to auto select best AP even in a multi AP WiFi network (more the one AP has same SSID)
 - add new functions to get current Connected AP:
     uint8_t * BSSID(void);
     int32_t Channel(void);
 - add new functions to get infos from scanned networks:
     uint8_t * BSSID(uint8_t networkItem);
     int32_t Channel(uint8_t networkItem);
     bool isHidden(uint8_t networkItem);
     bool getNetworkInfo(uint8_t networkItem, const char** ssid, uint8_t * encryptionType, int32_t * RSSI, uint8_t ** BSSID, int32_t * channel, bool * isHidden);
			
			
This commit is contained in:
		@@ -44,6 +44,8 @@ wl_status_t ESP8266WiFiMulti::run(void) {
 | 
			
		||||
 | 
			
		||||
        WifiAPlist_t bestNetwork { NULL, NULL };
 | 
			
		||||
        int bestNetworkDb = INT_MIN;
 | 
			
		||||
        uint8 bestBSSID[6];
 | 
			
		||||
        int32_t bestChannel;
 | 
			
		||||
 | 
			
		||||
        // WiFi.scanNetworks will return the number of networks found
 | 
			
		||||
        int8_t n = WiFi.scanNetworks();
 | 
			
		||||
@@ -56,9 +58,16 @@ wl_status_t ESP8266WiFiMulti::run(void) {
 | 
			
		||||
        } else {
 | 
			
		||||
            DEBUG_WIFI_MULTI("[WIFI] %d networks found\n", n);
 | 
			
		||||
            for(int8_t i = 0; i < n; ++i) {
 | 
			
		||||
                const char * ssid_scan = WiFi.SSID(i);
 | 
			
		||||
                int32_t rssi_scan = WiFi.RSSI(i);
 | 
			
		||||
                uint8_t sec_scan = WiFi.encryptionType(i);
 | 
			
		||||
 | 
			
		||||
                const char * ssid_scan;
 | 
			
		||||
                int32_t rssi_scan;
 | 
			
		||||
                uint8_t sec_scan;
 | 
			
		||||
                uint8_t * BSSID_scan;
 | 
			
		||||
                int32_t chan_scan;
 | 
			
		||||
                bool hidden_scan;
 | 
			
		||||
 | 
			
		||||
                WiFi.getNetworkInfo(i, &ssid_scan, &sec_scan, &rssi_scan, &BSSID_scan, &chan_scan, &hidden_scan);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                bool known = false;
 | 
			
		||||
                for(uint32_t x = 0; x < APlist.size(); x++) {
 | 
			
		||||
@@ -69,7 +78,9 @@ wl_status_t ESP8266WiFiMulti::run(void) {
 | 
			
		||||
                        if(rssi_scan > bestNetworkDb) { // best network
 | 
			
		||||
                            if(sec_scan == ENC_TYPE_NONE || entry.passphrase) { // check for passphrase if not open wlan
 | 
			
		||||
                                bestNetworkDb = rssi_scan;
 | 
			
		||||
                                bestChannel = chan_scan;
 | 
			
		||||
                                memcpy((void*) &bestNetwork, (void*) &entry, sizeof(bestNetwork));
 | 
			
		||||
                                memcpy((void*) &bestBSSID, (void*) BSSID_scan, sizeof(bestBSSID));
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        break;
 | 
			
		||||
@@ -82,7 +93,7 @@ wl_status_t ESP8266WiFiMulti::run(void) {
 | 
			
		||||
                    DEBUG_WIFI_MULTI("      ");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                DEBUG_WIFI_MULTI(" %d: %s (%d) %c\n", i, ssid_scan, rssi_scan, (sec_scan == ENC_TYPE_NONE) ? ' ' : '*');
 | 
			
		||||
                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, rssi_scan, (sec_scan == ENC_TYPE_NONE) ? ' ' : '*');
 | 
			
		||||
                delay(0);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -91,9 +102,9 @@ wl_status_t ESP8266WiFiMulti::run(void) {
 | 
			
		||||
        delay(0);
 | 
			
		||||
 | 
			
		||||
        if(bestNetwork.ssid) {
 | 
			
		||||
            DEBUG_WIFI_MULTI("[WIFI] Connecting SSID: %s (%d)\n", bestNetwork.ssid, bestNetworkDb);
 | 
			
		||||
            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);
 | 
			
		||||
 | 
			
		||||
            WiFi.begin(bestNetwork.ssid, bestNetwork.passphrase);
 | 
			
		||||
            WiFi.begin(bestNetwork.ssid, bestNetwork.passphrase, bestChannel, bestBSSID);
 | 
			
		||||
            status = WiFi.status();
 | 
			
		||||
 | 
			
		||||
            // wait for connection or fail
 | 
			
		||||
@@ -103,12 +114,16 @@ wl_status_t ESP8266WiFiMulti::run(void) {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            IPAddress ip;
 | 
			
		||||
            uint8_t * mac;
 | 
			
		||||
            switch(status) {
 | 
			
		||||
                case WL_CONNECTED:
 | 
			
		||||
                    ip = WiFi.localIP();
 | 
			
		||||
                    mac = WiFi.BSSID();
 | 
			
		||||
                    DEBUG_WIFI_MULTI("[WIFI] Connecting done.\n");
 | 
			
		||||
                    DEBUG_WIFI_MULTI("[WIFI] SSID: %s\n", WiFi.SSID());
 | 
			
		||||
                    DEBUG_WIFI_MULTI("[WIFI] IP: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
 | 
			
		||||
                    DEBUG_WIFI_MULTI("[WIFI] MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
 | 
			
		||||
                    DEBUG_WIFI_MULTI("[WIFI] Channel: %d\n", WiFi.Channel());
 | 
			
		||||
                    break;
 | 
			
		||||
                case WL_NO_SSID_AVAIL:
 | 
			
		||||
                    DEBUG_WIFI_MULTI("[WIFI] Connecting Faild AP not found.\n");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user