diff --git a/doc/esp8266wifi/station-examples.rst b/doc/esp8266wifi/station-examples.rst index 6af6f1f80e..5a4dd38dab 100644 --- a/doc/esp8266wifi/station-examples.rst +++ b/doc/esp8266wifi/station-examples.rst @@ -14,6 +14,7 @@ Table of Contents - `Prepare Access Points <#prepare-access-points>`__ - `Try it Out <#try-it-out>`__ - `Can we Make it Simpler? <#can-we-make-it-simpler>`__ +- `Per-SSID configuration <#per-ssid-configuration>`__ - `Conclusion <#conclusion>`__ Introduction @@ -195,6 +196,36 @@ After uploading the sketch and opening the serial monitor, the messages will loo dhcp client start... ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9 + +Per-SSID configuration +~~~~~~~~~~~~~~~~~~~~~~ + +Whenever network SSID is selected by the 'ESP8266WiFiMulti', it can be instructed to call a user function before connection is attempted. + +For example, to allow static IP configuration, declare the following function + +.. code:: cpp + + void onSSIDSelected(const char *ssid) { + if (strcmp(ssid, "sensor-net-2") == 0) { + IPAddress ip(10, 0, 0, 2); + IPAddress gw(10, 0, 0, 1); + IPAddress subnet(255, 255, 255, 0); + WiFi.config(ip, gw, subnet); + return; + } + + // revert to DHCP configuration + WiFi.config(0U, 0U, 0U); + } + +Then, register it after ``addAP(...)`` lines + +.. code:: cpp + + wifiMulti.onSSIDSelected(onSSIDSelected); + + Conclusion ~~~~~~~~~~ diff --git a/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino b/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino index fe93d98a43..54bef3f8ea 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 + - Connect to WiFi using a static IP configuration To enable debugging output, select in the Arduino iDE: - Tools | Debug Port: Serial @@ -35,7 +36,25 @@ 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"); - // More is possible + + // Register custom SSID callback + wifiMulti.onSSIDSelected(onSSIDSelected); + + // Insert more sketch code +} + +void onSSIDSelected(const char *ssid) { + // Before 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; + } + + // Make sure that DHCP is used for other networks. + WiFi.config(0U, 0U, 0U); } void loop() { 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);