From d6cf117f3cdca25a75208fd7f722ca294199c7ce Mon Sep 17 00:00:00 2001 From: seopyoon Date: Tue, 17 Jan 2017 11:11:43 +0900 Subject: [PATCH 1/4] smartConfig support --- libraries/WiFi/src/WiFiSTA.cpp | 59 ++++++++++++++++++++++++++++++++++ libraries/WiFi/src/WiFiSTA.h | 10 ++++++ 2 files changed, 69 insertions(+) diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index c570d82c394..1571320c469 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -498,3 +498,62 @@ IPv6Address WiFiSTAClass::localIPv6() } return IPv6Address(addr.addr); } + + +bool WiFiSTAClass::_smartConfigStarted = false; +bool WiFiSTAClass::_smartConfigDone = false; + + +bool WiFiSTAClass::beginSmartConfig() { + if (_smartConfigStarted) { + return false; + } + + if (!WiFi.mode(WIFI_STA)) { + return false; + } + + + esp_err_t err; + err = esp_smartconfig_start(reinterpret_cast(&WiFiSTAClass::_smartConfigCallback), 1); + if (err == ESP_OK) { + _smartConfigStarted = true; + _smartConfigDone = false; + return true; + } + return false; +} + +bool WiFiSTAClass::stopSmartConfig() { + if (!_smartConfigStarted) { + return true; + } + + if (esp_smartconfig_stop() == ESP_OK) { + _smartConfigStarted = false; + return true; + } + + return false; +} + +bool WiFiSTAClass::smartConfigDone() { + if (!_smartConfigStarted) { + return false; + } + + return _smartConfigDone; +} + +void WiFiSTAClass::_smartConfigCallback(uint32_t st, void* result) { + smartconfig_status_t status = (smartconfig_status_t) st; + if (status == SC_STATUS_LINK) { + wifi_sta_config_t *sta_conf = reinterpret_cast(result); + + esp_wifi_set_config(WIFI_IF_AP, (wifi_config_t *)sta_conf); + esp_wifi_disconnect(); + esp_wifi_connect(); + } else if (status == SC_STATUS_LINK_OVER) { + WiFi.stopSmartConfig(); + } +} diff --git a/libraries/WiFi/src/WiFiSTA.h b/libraries/WiFi/src/WiFiSTA.h index 5e1fcab4295..28b0aa6f92a 100644 --- a/libraries/WiFi/src/WiFiSTA.h +++ b/libraries/WiFi/src/WiFiSTA.h @@ -85,6 +85,16 @@ class WiFiSTAClass static wl_status_t _status; static bool _useStaticIp; +public: + bool beginSmartConfig(); + bool stopSmartConfig(); + bool smartConfigDone(); + +protected: + static bool _smartConfigStarted; + static bool _smartConfigDone; + static void _smartConfigCallback(uint32_t status, void* result); + }; From 96f6e1a01e3052e80fc02c2e591ae41003faee88 Mon Sep 17 00:00:00 2001 From: seopyoon Date: Wed, 18 Jan 2017 15:43:24 +0900 Subject: [PATCH 2/4] fixed bug, added example --- .../examples/WiFiSmartConfig/SmartConfig.ino | 30 +++++++++++++++++++ libraries/WiFi/src/WiFiSTA.cpp | 1 + 2 files changed, 31 insertions(+) create mode 100644 libraries/WiFi/examples/WiFiSmartConfig/SmartConfig.ino diff --git a/libraries/WiFi/examples/WiFiSmartConfig/SmartConfig.ino b/libraries/WiFi/examples/WiFiSmartConfig/SmartConfig.ino new file mode 100644 index 00000000000..564a6e6c8e5 --- /dev/null +++ b/libraries/WiFi/examples/WiFiSmartConfig/SmartConfig.ino @@ -0,0 +1,30 @@ +#include "WiFi.h" + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + delay(100); + + WiFi.mode(WIFI_AP_STA); + delay(500); + + WiFi.beginSmartConfig(); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + Serial.println(WiFi.smartConfigDone()); + } + + Serial.println(""); + Serial.println("WiFi Connected."); + Serial.print("IP Address: "); + Serial.println(WiFi.localIP()); +} + +int value = 0; + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index 1571320c469..1034dabee25 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -40,6 +40,7 @@ extern "C" { #include #include "lwip/err.h" #include "lwip/dns.h" +#include } extern "C" void esp_schedule(); From 98414817cd8573a0a9db7ed8b56449170c85c637 Mon Sep 17 00:00:00 2001 From: seopyoon Date: Wed, 18 Jan 2017 21:47:43 +0900 Subject: [PATCH 3/4] added _smartConfigDone = ture --- libraries/WiFi/src/WiFiSTA.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index 1034dabee25..7d84d9a7ec6 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -554,6 +554,8 @@ void WiFiSTAClass::_smartConfigCallback(uint32_t st, void* result) { esp_wifi_set_config(WIFI_IF_AP, (wifi_config_t *)sta_conf); esp_wifi_disconnect(); esp_wifi_connect(); + + _smartConfigDone = true; } else if (status == SC_STATUS_LINK_OVER) { WiFi.stopSmartConfig(); } From 2fc2ff7051a272e424b2b1e7249e498963b57372 Mon Sep 17 00:00:00 2001 From: seopyoon Date: Fri, 20 Jan 2017 11:47:45 +0900 Subject: [PATCH 4/4] changed example name, added explanation --- .../{SmartConfig.ino => WiFiSmartConfig.ino} | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) rename libraries/WiFi/examples/WiFiSmartConfig/{SmartConfig.ino => WiFiSmartConfig.ino} (54%) diff --git a/libraries/WiFi/examples/WiFiSmartConfig/SmartConfig.ino b/libraries/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino similarity index 54% rename from libraries/WiFi/examples/WiFiSmartConfig/SmartConfig.ino rename to libraries/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino index 564a6e6c8e5..4c1f1a8ce6d 100644 --- a/libraries/WiFi/examples/WiFiSmartConfig/SmartConfig.ino +++ b/libraries/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino @@ -1,29 +1,35 @@ #include "WiFi.h" void setup() { - // put your setup code here, to run once: Serial.begin(115200); - delay(100); + //Init WiFi as Station, start SmartConfig WiFi.mode(WIFI_AP_STA); - delay(500); - WiFi.beginSmartConfig(); - while (WiFi.status() != WL_CONNECTED) { + //Wait for SmartConfig packet from mobile + Serial.println("Waiting for SmartConfig."); + while (!WiFi.smartConfigDone()) { delay(500); Serial.print("."); - Serial.println(WiFi.smartConfigDone()); } Serial.println(""); + Serial.println("SmartConfig received."); + + //Wait for WiFi to connect to AP + Serial.println("Waiting for WiFi"); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("WiFi Connected."); + Serial.print("IP Address: "); Serial.println(WiFi.localIP()); } -int value = 0; - void loop() { // put your main code here, to run repeatedly: