1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-07-21 21:22:31 +03:00

Merge pull request #7629 from Erriez/feature/issue-2246-multi-wifi-hidden

Add support for hidden SSID's Multi WiFi
This commit is contained in:
Develo
2021-01-21 01:11:21 -03:00
committed by GitHub
2 changed files with 32 additions and 2 deletions

View File

@ -7,6 +7,7 @@
- Registering multiple networks (at least 1) - Registering multiple networks (at least 1)
- Connect to WiFi with strongest signal (RSSI) - 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 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: To enable debugging output, select in the Arduino iDE:
- Tools | Debug Port: Serial - Tools | Debug Port: Serial
@ -21,6 +22,9 @@ ESP8266WiFiMulti wifiMulti;
const uint32_t connectTimeoutMs = 5000; const uint32_t connectTimeoutMs = 5000;
void setup() { void setup() {
// Don't save WiFi configuration in flash - optional
WiFi.persistent(false);
Serial.begin(115200); Serial.begin(115200);
Serial.println("\nESP8266 Multi WiFi example"); Serial.println("\nESP8266 Multi WiFi example");

View File

@ -326,12 +326,18 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs)
} }
DEBUG_WIFI_MULTI("\n"); 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 // Connect to known WiFi AP's sorted by RSSI
for (int8_t i = 0; i < numNetworks; i++) { for (int8_t i = 0; i < numNetworks; i++) {
// Get network information // Get network information
WiFi.getNetworkInfo(known[i], ssid, encType, rssi, bssid, channel, hidden); 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 // Check SSID
if (ssid == entry.ssid) { if (ssid == entry.ssid) {
DEBUG_WIFI_MULTI("[WIFIM] Connecting %s\n", ssid); DEBUG_WIFI_MULTI("[WIFIM] Connecting %s\n", ssid);
@ -343,13 +349,33 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs)
if (waitWiFiConnect(connectTimeoutMs) == WL_CONNECTED) { if (waitWiFiConnect(connectTimeoutMs) == WL_CONNECTED) {
return 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); 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; return WL_CONNECT_FAILED;
} }