diff --git a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino index fe93d98a43..34f1a85ed6 100644 --- a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino +++ b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino @@ -8,6 +8,7 @@ - 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 + - Static IP assigned depending on which SSID is connected To enable debugging output, select in the Arduino iDE: - Tools | Debug Port: Serial @@ -35,9 +36,26 @@ void setup() { wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); + + wifiMulti.onSSIDSelected(connectedToSSID); + // More is possible } +void connectedToSSID(const char *ssid) { + // On connecting to the second AP, assign static IP using config(...). + if (strcmp(ssid, "ssid_from_AP_2") == 0) { + IPAddress ip2(192, 168, 1, 123); + IPAddress gw2(192, 168, 1, 1); + IPAddress subnet2(255, 255, 255, 0); + WiFi.config(ip2, gw2, subnet2); + return; + } + + // For other SSID DHCP will be used. + WiFi.config(0U, 0U, 0U); +} + void loop() { // Maintain WiFi connection if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) { diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp index bcd433e1b1..a052d85c7f 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp @@ -329,6 +329,11 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs) if (ssid == entry.ssid) { DEBUG_WIFI_MULTI("[WIFIM] Connecting %s\n", ssid.c_str()); + // User-defined callback + if (_onSSIDSelected) { + _onSSIDSelected(entry.ssid); + } + // Connect to WiFi WiFi.begin(ssid, entry.passphrase, channel, bssid); @@ -350,6 +355,11 @@ wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t connectTimeoutMs) if (!connectSkipIndex[i]) { DEBUG_WIFI_MULTI("[WIFIM] Try hidden connect %s\n", entry.ssid); + // User-defined callback + if (_onSSIDSelected) { + _onSSIDSelected(entry.ssid); + } + // Connect to WiFi WiFi.begin(entry.ssid, entry.passphrase); diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h index 3c77df02d4..9d57345d27 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h @@ -50,29 +50,31 @@ #define WIFI_SCAN_TIMEOUT_MS 5000 #endif -struct WifiAPEntry { - char *ssid; - char *passphrase; -}; - -typedef std::vector WifiAPlist; - class ESP8266WiFiMulti { public: + using SSIDSelectedCallback = void (*)(const char *ssid); + ESP8266WiFiMulti(); ~ESP8266WiFiMulti(); bool addAP(const char *ssid, const char *passphrase = NULL); bool existsAP(const char *ssid, const char *passphrase = NULL); + void onSSIDSelected(SSIDSelectedCallback callback) { _onSSIDSelected = callback; } wl_status_t run(uint32_t connectTimeoutMs=WIFI_CONNECT_TIMEOUT_MS); void cleanAPlist(); int count() { return _APlist.size(); } private: - WifiAPlist _APlist; + struct WifiAPEntry { + char *ssid; + char *passphrase; + }; + + std::vector _APlist; bool _firstRun; + SSIDSelectedCallback _onSSIDSelected = NULL; bool APlistAdd(const char *ssid, const char *passphrase = NULL); bool APlistExists(const char *ssid, const char *passphrase = NULL);