From 0d94b5f5607c973a97697ae0b46b16bed794b04e Mon Sep 17 00:00:00 2001 From: Erriez Date: Sat, 3 Oct 2020 15:46:59 +0200 Subject: [PATCH 1/2] Add support for hidden AP's --- .../examples/WiFiMulti/WiFiMulti.ino | 1 + .../ESP8266WiFi/src/ESP8266WiFiMulti.cpp | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino index 1aa6f25b8e..17dd4f550c 100644 --- a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino +++ b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino @@ -7,6 +7,7 @@ - Registering multiple networks (at least 1) - Connect to WiFi with strongest signal (RSSI) - Fall back to connect to next WiFi when a connection failed or lost + - Fall back to connect to hidden SSID's which are not reported by WiFi scan To enable debugging output, select in the Arduino iDE: - Tools | Debug Port: Serial diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp index f68045e6af..63ca5ca415 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp @@ -323,12 +323,18 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs) } DEBUG_WIFI_MULTI("\n"); + // Create indices for AP connection failures + uint8_t connectSkipIndex[_APlist.size()]; + memset(connectSkipIndex, 0, sizeof(connectSkipIndex)); + // Connect to known WiFi AP's sorted by RSSI for (int8_t i = 0; i < numNetworks; i++) { // Get network information WiFi.getNetworkInfo(known[i], ssid, encType, rssi, bssid, channel, hidden); - for (auto entry : _APlist) { + for (uint8_t j = 0; j < _APlist.size(); j++) { + auto &entry = _APlist[j]; + // Check SSID if (ssid == entry.ssid) { DEBUG_WIFI_MULTI("[WIFIM] Connecting %s\n", ssid); @@ -340,13 +346,33 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs) if (waitWiFiConnect(connectTimeoutMs) == WL_CONNECTED) { return WL_CONNECTED; } + + // Failed to connect, skip for hidden SSID connects + connectSkipIndex[j] = true; + } + } + } + + // Try to connect to hidden AP's which are not reported by WiFi scan + for (uint8_t i = 0; i < _APlist.size(); i++) { + auto &entry = _APlist[i]; + + if (!connectSkipIndex[i]) { + DEBUG_WIFI_MULTI("[WIFIM] Try hidden connect %s\n", entry.ssid); + + // Connect to WiFi + WiFi.begin(entry.ssid, entry.passphrase); + + // Wait for status change + if (waitWiFiConnect(connectTimeoutMs) == WL_CONNECTED) { + return WL_CONNECTED; } } } DEBUG_WIFI_MULTI("[WIFIM] Could not connect\n", ssid); - // Coult not connect to any WiFi network + // Could not connect to any WiFi network return WL_CONNECT_FAILED; } From c82c6840e41abcb82ae153f9f5b930928293c42e Mon Sep 17 00:00:00 2001 From: Erriez Date: Thu, 15 Oct 2020 20:03:26 +0200 Subject: [PATCH 2/2] Add WiFi persistent to WiFi Multi example --- libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino index 17dd4f550c..fe93d98a43 100644 --- a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino +++ b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino @@ -22,6 +22,9 @@ ESP8266WiFiMulti wifiMulti; const uint32_t connectTimeoutMs = 5000; void setup() { + // Don't save WiFi configuration in flash - optional + WiFi.persistent(false); + Serial.begin(115200); Serial.println("\nESP8266 Multi WiFi example");