diff --git a/FingerprintDoorbell/src/main.cpp b/FingerprintDoorbell/src/main.cpp index 2cecb2b..798abbc 100644 --- a/FingerprintDoorbell/src/main.cpp +++ b/FingerprintDoorbell/src/main.cpp @@ -251,14 +251,83 @@ bool checkPairingValid() { } } +uint32_t WiFi_scanNetworks(void ){ + uint32_t _numNetworks = 0; + + int8_t res; + res = WiFi.scanNetworks(); + if(res == WIFI_SCAN_FAILED){ + addLogMessage(F("NetworkScanFailed")); + }else if(res == WIFI_SCAN_RUNNING){ + while(WiFi.scanComplete() == WIFI_SCAN_RUNNING){ + delay(100); + } + _numNetworks = WiFi.scanComplete(); + }else if(res >=0 ) { + _numNetworks = res; + } + return _numNetworks; +} + bool initWifi() { + uint32_t _numNetworks = 0; // Connect to Wi-Fi WifiSettings wifiSettings = settingsManager.getWifiSettings(); WiFi.mode(WIFI_STA); WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE); + WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); + WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); + WiFi.persistent(false); + WiFi.mode(WIFI_OFF); + WiFi.mode(WIFI_STA); + WiFi.disconnect(true); // delete old config + WiFi.begin(); + delay(500); // 500ms seems to work in most cases, may depend on AP + WiFi.disconnect(true); // delete old config + WiFi.setHostname(wifiSettings.hostname.c_str()); //define hostname - WiFi.begin(wifiSettings.ssid.c_str(), wifiSettings.password.c_str()); + _numNetworks = WiFi_scanNetworks(); // scan in case this gets called before any scans + + if (_numNetworks == 0) { + addLogMessage(F("No networks found")); + WiFi.begin(wifiSettings.ssid.c_str(), wifiSettings.password.c_str()); + } else { +#ifdef WM_DEBUG_LEVEL + DEBUG_WM(n, F("networks found")); +#endif + int bestConnection = -1; + // Find best RSSI AP for given SSID + for (int i = 0; i < _numNetworks; i++) { + if (wifiSettings.ssid == WiFi.SSID(i)) { + addLogMessage(String(F("SSID ")) + wifiSettings.ssid + String(F(" found with RSSI: ")) + + String(WiFi.RSSI(i)) + String(F("(")) + + String(constrain((100.0 + WiFi.RSSI(i)) * 2, 0, 100)) + + String(F(" %) and BSSID: ")) + WiFi.BSSIDstr(i) + + String(F(" and channel: ")) + String(WiFi.channel(i))); + if (bestConnection == -1) { + bestConnection = i; + } else { + if (WiFi.RSSI(i) > WiFi.RSSI(bestConnection)) { + bestConnection = i; + } + } + } + } + if (bestConnection == -1) { + addLogMessage(String(F("No network found with SSID: "))+wifiSettings.ssid.c_str()); + WiFi.begin(wifiSettings.ssid.c_str(), wifiSettings.password.c_str()); + } else { + addLogMessage(String(F("Trying to connect to SSID ")) + wifiSettings.ssid + String(F(" found with RSSI: ")) + + String(WiFi.RSSI(bestConnection)) + String(F("(")) + + String(constrain((100.0 + WiFi.RSSI(bestConnection)) * 2, 0, 100)) + + String(F(" %) and BSSID: ")) + WiFi.BSSIDstr(bestConnection) + + String(F(" and channel: ")) + String(WiFi.channel(bestConnection))); + WiFi.begin(wifiSettings.ssid.c_str(), wifiSettings.password.c_str(), 0, + WiFi.BSSID(bestConnection)); + } + } + //WiFi.begin(wifiSettings.ssid.c_str(), wifiSettings.password.c_str()); int counter = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000);