diff --git a/.gitignore b/.gitignore index d155341..1065d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -PersWiFiManager.ino \ No newline at end of file +PersWiFiManager.ino +data/* +!data/wifi* \ No newline at end of file diff --git a/PersWiFiManager.cpp b/PersWiFiManager.cpp index 0ab4ce8..d4898b6 100644 --- a/PersWiFiManager.cpp +++ b/PersWiFiManager.cpp @@ -1,7 +1,7 @@ /* PersWiFiManager - * version 2.0.2 - * https://r-downing.github.io/PersWiFiManager/ - */ + version 3.0.0 + https://r-downing.github.io/PersWiFiManager/ +*/ #include "PersWiFiManager.h" @@ -16,11 +16,6 @@ PersWiFiManager::PersWiFiManager(ESP8266WebServer& s, DNSServer& d) { } //PersWiFiManager bool PersWiFiManager::attemptConnection(const String& ssid, const String& pass) { - IPAddress apIP(192, 168, 1, 1); - //moved dns start to here - _dnsServer->setErrorReplyCode(DNSReplyCode::NoError); - _dnsServer->start((byte)53, "*", apIP); //used for captive portal in AP mode - //attempt to connect to wifi WiFi.mode(WIFI_STA); if (ssid.length()) { @@ -29,19 +24,53 @@ bool PersWiFiManager::attemptConnection(const String& ssid, const String& pass) } else { WiFi.begin(); } - unsigned long connectTime = millis(); - //while ((millis() - connectTime) < 1000 * WIFI_CONNECT_TIMEOUT && WiFi.status() != WL_CONNECTED) - while (WiFi.status() != WL_CONNECT_FAILED && WiFi.status() != WL_CONNECTED && (millis() - connectTime) < 1000 * WIFI_CONNECT_TIMEOUT) + + //if in nonblock mode, skip this loop + _connectStartTime = millis();// + 1; + while (!_connectNonBlock && _connectStartTime) { + handleWiFi(); delay(10); - if (WiFi.status() == WL_CONNECTED) return true;// { //if timed out, switch to AP mode + } + + return (WiFi.status() == WL_CONNECTED); + +} //attemptConnection + +void PersWiFiManager::handleWiFi() { + if (!_connectStartTime) return; + + if (WiFi.status() == WL_CONNECTED) { + _connectStartTime = 0; + if (_connectHandler) _connectHandler(); + return; + } + + //if failed or not connected and time is up + if ((WiFi.status() == WL_CONNECT_FAILED) || ((WiFi.status() != WL_CONNECTED) && ((millis() - _connectStartTime) > (1000 * WIFI_CONNECT_TIMEOUT)))) { + startApMode(); + _connectStartTime = 0; //reset connect start time + } + +} //handleWiFi + +void PersWiFiManager::startApMode(){ + //start AP mode + IPAddress apIP(192, 168, 1, 1); WiFi.mode(WIFI_AP); WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); _apPass.length() ? WiFi.softAP(getApSsid().c_str(), _apPass.c_str()) : WiFi.softAP(getApSsid().c_str()); - return false;//} //if - //moved dns start from here -} //attemptConnection + if (_apHandler) _apHandler(); +}//startApMode + +void PersWiFiManager::setConnectNonBlock(bool b) { + _connectNonBlock = b; +} //setConnectNonBlock void PersWiFiManager::setupWiFiHandlers() { + IPAddress apIP(192, 168, 1, 1); + _dnsServer->setErrorReplyCode(DNSReplyCode::NoError); + _dnsServer->start((byte)53, "*", apIP); //used for captive portal in AP mode + _server->on("/wifi/list", [&] () { //scan for wifi networks int n = WiFi.scanNetworks(); @@ -85,6 +114,11 @@ void PersWiFiManager::setupWiFiHandlers() { attemptConnection(_server->arg("n"), _server->arg("p")); }); //_server->on /wifi/connect + _server->on("/wifi/ap", [&](){ + _server->send(200, "text/html", "access point: "+getApSsid()); + startApMode(); + }); //_server->on /wifi/ap + _server->on("/wifi/rst", [&]() { _server->send(200, "text/html", "Rebooting..."); delay(100); @@ -113,3 +147,12 @@ void PersWiFiManager::setApCredentials(const String& apSsid, const String& apPas if (apPass.length() >= 8) _apPass = apPass; } //setApCredentials +void PersWiFiManager::onConnect(WiFiChangeHandlerFunction fn) { + _connectHandler = fn; +} + +void PersWiFiManager::onAp(WiFiChangeHandlerFunction fn) { + _apHandler = fn; +} + + diff --git a/PersWiFiManager.h b/PersWiFiManager.h index 42c3a93..80fcf03 100644 --- a/PersWiFiManager.h +++ b/PersWiFiManager.h @@ -10,7 +10,9 @@ class PersWiFiManager { public: - //constructor - takes inputs for ESP8266WebServer and DNSServer, optional ap ssid + + typedef std::function WiFiChangeHandlerFunction; + PersWiFiManager(ESP8266WebServer& s, DNSServer& d); bool attemptConnection(const String& ssid = "", const String& pass = ""); @@ -23,12 +25,28 @@ class PersWiFiManager { void setApCredentials(const String& apSsid, const String& apPass = ""); + void setConnectNonBlock(bool b); + + void handleWiFi(); + + void startApMode(); + + void onConnect(WiFiChangeHandlerFunction fn); + + void onAp(WiFiChangeHandlerFunction fn); + private: ESP8266WebServer * _server; DNSServer * _dnsServer; String _apSsid, _apPass; + bool _connectNonBlock; + unsigned long _connectStartTime; + + WiFiChangeHandlerFunction _connectHandler; + WiFiChangeHandlerFunction _apHandler; + };//class #endif - + diff --git a/data/wifi.htm b/data/wifi.htm index c442573..5d08372 100644 --- a/data/wifi.htm +++ b/data/wifi.htm @@ -96,9 +96,11 @@

+ +

- Back | + Back | Home diff --git a/data/wifi.min.htm b/data/wifi.min.htm index c3d39c3..49a4a55 100644 --- a/data/wifi.min.htm +++ b/data/wifi.min.htm @@ -1 +1 @@ -ESP WiFi








Back |Home
\ No newline at end of file +ESP WiFi









Back | Home
\ No newline at end of file diff --git a/data/wifi.min.htm.gz b/data/wifi.min.htm.gz index 25cc191..c8b0d2f 100644 Binary files a/data/wifi.min.htm.gz and b/data/wifi.min.htm.gz differ diff --git a/examples/basic_rest_api/data/wifi.min.htm.gz b/examples/basic_rest_api/data/wifi.min.htm.gz index 25cc191..c8b0d2f 100644 Binary files a/examples/basic_rest_api/data/wifi.min.htm.gz and b/examples/basic_rest_api/data/wifi.min.htm.gz differ diff --git a/examples/spiffs_rest_api/data/wifi.min.htm.gz b/examples/spiffs_rest_api/data/wifi.min.htm.gz index 25cc191..c8b0d2f 100644 Binary files a/examples/spiffs_rest_api/data/wifi.min.htm.gz and b/examples/spiffs_rest_api/data/wifi.min.htm.gz differ diff --git a/examples/spiffs_rest_api_nonblocking/data/index.htm b/examples/spiffs_rest_api_nonblocking/data/index.htm new file mode 100644 index 0000000..c6f2be1 --- /dev/null +++ b/examples/spiffs_rest_api_nonblocking/data/index.htm @@ -0,0 +1,52 @@ +

Current Data

+x: + +
y: + + +
Last updated + seconds ago. + +
+ +

Update Data

+
+ x: + + +
+
+ y: + + +
+ +WiFi settings + + diff --git a/examples/spiffs_rest_api_nonblocking/data/wifi.htm b/examples/spiffs_rest_api_nonblocking/data/wifi.htm new file mode 100644 index 0000000..5d08372 --- /dev/null +++ b/examples/spiffs_rest_api_nonblocking/data/wifi.htm @@ -0,0 +1,108 @@ + + + + + + ESP WiFi + + + + + +
+ +

+
+ +
+ +
+
+ +
+
+
+ +
+ +
+ +
+ Back | + Home +
+ + + diff --git a/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm b/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm new file mode 100644 index 0000000..49a4a55 --- /dev/null +++ b/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm @@ -0,0 +1 @@ +ESP WiFi









Back | Home
\ No newline at end of file diff --git a/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm.gz b/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm.gz new file mode 100644 index 0000000..c8b0d2f Binary files /dev/null and b/examples/spiffs_rest_api_nonblocking/data/wifi.min.htm.gz differ diff --git a/examples/spiffs_rest_api_nonblocking/spiffs_rest_api_nonblocking.ino b/examples/spiffs_rest_api_nonblocking/spiffs_rest_api_nonblocking.ino new file mode 100644 index 0000000..bab08e5 --- /dev/null +++ b/examples/spiffs_rest_api_nonblocking/spiffs_rest_api_nonblocking.ino @@ -0,0 +1,111 @@ +/* +SPIFFS-served REST API example for PersWiFiManager v3.0 +*/ + +#define DEBUG_SERIAL //uncomment for Serial debugging statements + +#ifdef DEBUG_SERIAL +#define DEBUG_BEGIN Serial.begin(115200) +#define DEBUG_PRINT(x) Serial.println(x) +#else +#define DEBUG_PRINT(x) +#define DEBUG_BEGIN +#endif + +//includes +#include +#include +#include + +#include // http://ryandowning.net/EasySSDP/ + +//extension of ESP8266WebServer with SPIFFS handlers built in +#include // http://ryandowning.net/SPIFFSReadServer/ +// upload data folder to chip with Arduino ESP8266 filesystem uploader +// https://github.com/esp8266/arduino-esp8266fs-plugin + +#include +#include + +#define DEVICE_NAME "ESP8266 DEVICE" + + +//server objects +SPIFFSReadServer server(80); +DNSServer dnsServer; +PersWiFiManager persWM(server, dnsServer); + +////// Sample program data +int x; +String y; + +void setup() { + DEBUG_BEGIN; //for terminal debugging + DEBUG_PRINT(); + + //optional code handlers to run everytime wifi is connected... + persWM.onConnect([]() { + DEBUG_PRINT("wifi connected"); + DEBUG_PRINT(WiFi.localIP()); + EasySSDP::begin(server); + }); + //...or AP mode is started + persWM.onAp([](){ + DEBUG_PRINT("AP MODE"); + DEBUG_PRINT(persWM.getApSsid()); + }); + + //allows serving of files from SPIFFS + SPIFFS.begin(); + //sets network name for AP mode + persWM.setApCredentials(DEVICE_NAME); + //persWM.setApCredentials(DEVICE_NAME, "password"); optional password + + //make connecting/disconnecting non-blocking + persWM.setConnectNonBlock(true); + + //in non-blocking mode, program will continue past this point without waiting + persWM.begin(); + + //handles commands from webpage, sends live data in JSON format + server.on("/api", []() { + DEBUG_PRINT("server.on /api"); + if (server.hasArg("x")) { + x = server.arg("x").toInt(); + DEBUG_PRINT(String("x: ") + x); + } //if + if (server.hasArg("y")) { + y = server.arg("y"); + DEBUG_PRINT("y: " + y); + } //if + + //build json object of program data + StaticJsonBuffer<200> jsonBuffer; + JsonObject &json = jsonBuffer.createObject(); + json["x"] = x; + json["y"] = y; + + char jsonchar[200]; + json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece + server.send(200, "application/json", jsonchar); + + }); //server.on api + + + server.begin(); + DEBUG_PRINT("setup complete."); +} //void setup + +void loop() { + //in non-blocking mode, handleWiFi must be called in the main loop + persWM.handleWiFi(); + + dnsServer.processNextRequest(); + server.handleClient(); + + //DEBUG_PRINT(millis()); + + // do stuff with x and y + +} //void loop + diff --git a/keywords.txt b/keywords.txt index 90040d8..d03975b 100644 --- a/keywords.txt +++ b/keywords.txt @@ -17,6 +17,8 @@ setupWiFiHandlers KEYWORD2 begin KEYWORD2 getApSsid KEYWORD2 setApCredentials KEYWORD2 +handleWiFi KEYWORD2 +setConnectNonBlock KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/library.properties b/library.properties index 9437d6f..3b29653 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=PersWiFiManager -version=2.0.2 +version=3.0.0 author=Ryan Downing maintainer=Ryan Downing sentence=Persistent WiFi Manager paragraph=A non-blocking, persistant wifi manager for ESP8266 that allows network changes at any time category=Communication -url=https://r-downing.github.io/PersWiFiManager/ +url=https://ryandowning.net/PersWiFiManager/ architectures=esp8266