diff --git a/WiFiManager.cpp b/WiFiManager.cpp index 6a214b7..f9747dd 100644 --- a/WiFiManager.cpp +++ b/WiFiManager.cpp @@ -49,16 +49,7 @@ void WiFiManager::addParameter(WiFiManagerParameter *p) { DEBUG_WM(p->getID()); } - -void WiFiManager::begin() { - begin("NoNetESP"); -} - -void WiFiManager::begin(char const *apName) { - begin(apName, NULL); -} - -void WiFiManager::begin(char const *apName, char const *apPasswd) { +void WiFiManager::setupConfigPortal(char const *apName, char const *apPasswd) { dnsServer.reset(new DNSServer()); server.reset(new ESP8266WebServer(80)); @@ -114,42 +105,38 @@ boolean WiFiManager::autoConnect() { return autoConnect(ssid.c_str(), NULL); } -boolean WiFiManager::autoConnect(char const *apName) { - return autoConnect(apName, NULL); -} - -boolean WiFiManager::autoConnect(char const *apName, char const *apPasswd) { +boolean WiFiManager::autoConnect(char const *apName, char const *apPassword) { DEBUG_WM(F("")); DEBUG_WM(F("AutoConnect")); // read eeprom for ssid and pass String ssid = getSSID(); String pass = getPassword(); - //use SDK functions to get SSID and pass - //String ssid = WiFi.SSID(); - //String pass = WiFi.psk(); + // attempt to connect; should it fail, fall back to AP WiFi.mode(WIFI_STA); - connectWifi(ssid, pass); - int s = WiFi.status(); - if (s == WL_CONNECTED) { + if (connectWifi(ssid, pass) == WL_CONNECTED) { DEBUG_WM(F("IP Address:")); DEBUG_WM(WiFi.localIP()); //connected return true; } - //not connected + return startConfigPortal(apName, apPassword); +} + +boolean WiFiManager::startConfigPortal(char const *apName, char const *apPassword) { //setup AP WiFi.mode(WIFI_AP); + //notify we entered AP mode if ( _apcallback != NULL) { _apcallback(); } + connect = false; - begin(apName, apPasswd); + setupConfigPortal(apName, apPassword); - bool looping = true; while (timeout == 0 || millis() < start + timeout) { //DNS dnsServer->processNextRequest(); @@ -161,16 +148,9 @@ boolean WiFiManager::autoConnect(char const *apName, char const *apPasswd) { delay(2000); DEBUG_WM(F("Connecting to new AP")); connect = false; - //ssid = getSSID(); - //pass = getPassword(); - connectWifi(_ssid, _pass); - int s = WiFi.status(); - if (s != WL_CONNECTED) { + // using user-provided _ssid, _pass in place of system-stored ssid amd pass + if (connectWifi(_ssid, _pass) != WL_CONNECTED) { DEBUG_WM(F("Failed to connect.")); - //not connected, should retry everything - //ESP.reset(); - //delay(1000); - //return false; } else { //connected WiFi.mode(WIFI_STA); @@ -188,24 +168,26 @@ boolean WiFiManager::autoConnect(char const *apName, char const *apPasswd) { server.reset(); dnsServer.reset(); + return WiFi.status() == WL_CONNECTED; } -void WiFiManager::connectWifi(String ssid, String pass) { +int WiFiManager::connectWifi(String ssid, String pass) { DEBUG_WM(F("Connecting as wifi client...")); //WiFi.disconnect(); WiFi.begin(ssid.c_str(), pass.c_str()); int connRes = WiFi.waitForConnectResult(); DEBUG_WM ("Connection result: "); DEBUG_WM ( connRes ); + return connRes; } String WiFiManager::getSSID() { if (_ssid == "") { DEBUG_WM(F("Reading SSID")); - _ssid = WiFi.SSID();//getEEPROMString(0, 32); + _ssid = WiFi.SSID(); DEBUG_WM(F("SSID: ")); DEBUG_WM(_ssid); } @@ -215,47 +197,13 @@ String WiFiManager::getSSID() { String WiFiManager::getPassword() { if (_pass == "") { DEBUG_WM(F("Reading Password")); - _pass = WiFi.psk();//getEEPROMString(32, 64); + _pass = WiFi.psk(); DEBUG_WM("Password: " + _pass); //DEBUG_WM(_pass); } return _pass; } -/* - String WiFiManager::getEEPROMString(int start, int len) { - EEPROM.begin(512); - delay(10); - String string = ""; - for (int i = _eepromStart + start; i < _eepromStart + start + len; i++) { - //DEBUG_WM(i); - string += char(EEPROM.read(i)); - } - EEPROM.end(); - return string; - } -*/ -/* - void WiFiManager::setEEPROMString(int start, int len, String string) { - EEPROM.begin(512); - delay(10); - int si = 0; - for (int i = _eepromStart + start; i < _eepromStart + start + len; i++) { - char c; - if (si < string.length()) { - c = string[si]; - //DEBUG_WM(F("Wrote: "); - //DEBUG_WM(c); - } else { - c = 0; - } - EEPROM.write(i, c); - si++; - } - EEPROM.end(); - DEBUG_WM(F("Wrote " + string); - }*/ - String WiFiManager::urldecode(const char *src) { String decoded = ""; @@ -348,7 +296,7 @@ void WiFiManager::handleRoot() { } /** Wifi config page handler */ -void WiFiManager::handleWifi(bool scan) { +void WiFiManager::handleWifi(boolean scan) { server->sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server->sendHeader("Pragma", "no-cache"); server->sendHeader("Expires", "-1"); diff --git a/WiFiManager.h b/WiFiManager.h index 26fd882..42ee500 100644 --- a/WiFiManager.h +++ b/WiFiManager.h @@ -1,21 +1,18 @@ /************************************************************** - * WiFiManager is a library for the ESP8266/Arduino platform - * (https://github.com/esp8266/Arduino) to enable easy - * configuration and reconfiguration of WiFi credentials and - * store them in EEPROM. - * inspired by http://www.esp8266.com/viewtopic.php?f=29&t=2520 - * https://github.com/chriscook8/esp-arduino-apboot - * Built by AlexT https://github.com/tzapu - * Licensed under MIT license + WiFiManager is a library for the ESP8266/Arduino platform + (https://github.com/esp8266/Arduino) to enable easy + configuration and reconfiguration of WiFi credentials and + store them in EEPROM. + inspired by http://www.esp8266.com/viewtopic.php?f=29&t=2520 + https://github.com/chriscook8/esp-arduino-apboot + Built by AlexT https://github.com/tzapu + Licensed under MIT license **************************************************************/ #ifndef WiFiManager_h #define WiFiManager_h #include - -#include -//#include #include #include #include @@ -39,125 +36,112 @@ const char HTTP_END[] PROGMEM = ""; #define WIFI_MANAGER_MAX_PARAMS 10 class WiFiManagerParameter { -public: - WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length); + public: + WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length); - const char* getID(); - const char* getValue(); - const char* getPlaceholder(); - int getValueLength(); -private: - const char* _id; - const char* _placeholder; - char* _value; - int _length; + const char* getID(); + const char* getValue(); + const char* getPlaceholder(); + int getValueLength(); + private: + const char* _id; + const char* _placeholder; + char* _value; + int _length; -friend class WiFiManager; + friend class WiFiManager; }; class WiFiManager { -public: + public: WiFiManager(); - - boolean autoConnect(); - boolean autoConnect(char const *apName); - boolean autoConnect(char const *apName, char const *apPasswd); - String getSSID(); - String getPassword(); + boolean autoConnect(); + boolean autoConnect(char const *apName, char const *apPasswd = NULL); - void resetSettings(); + //if you want to always start the config portal, without trying to connect first + boolean startConfigPortal(char const *apName, char const *apPassword = NULL); + + String getSSID(); + String getPassword(); + + void resetSettings(); //for convenience - String urldecode(const char*); + String urldecode(const char*); - //sets timeout before webserver loop ends and exits even if there has been no setup. + //sets timeout before webserver loop ends and exits even if there has been no setup. //usefully for devices that failed to connect at some point and got stuck in a webserver loop //in seconds - void setTimeout(unsigned long seconds); - void setDebugOutput(boolean debug); + void setTimeout(unsigned long seconds); + void setDebugOutput(boolean debug); //sets a custom ip /gateway /subnet configuration - void setAPConfig(IPAddress ip, IPAddress gw, IPAddress sn); + void setAPConfig(IPAddress ip, IPAddress gw, IPAddress sn); //called when AP mode and config portal is started - void setAPCallback( void (*func)(void) ); - //called when settings have been changed and connection was successful - void setSaveConfigCallback( void (*func)(void) ); + void setAPCallback( void (*func)(void) ); + //called when settings have been changed and connection was successful + void setSaveConfigCallback( void (*func)(void) ); //adds a custom parameter - void addParameter(WiFiManagerParameter *p); + void addParameter(WiFiManagerParameter *p); -private: - std::unique_ptr dnsServer; + private: + std::unique_ptr dnsServer; std::unique_ptr server; - const int WM_DONE = 0; - const int WM_WAIT = 10; - - //const char PROGMEM HTTP_404[] = "HTTP/1.1 404 Not Found\r\n\r\n"; - //const String HTTP_200 = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; - const String HTTP_HEAD = "{v}"; - //const String HTTP_STYLE = ""; - //const String HTTP_SCRIPT = ""; - //const String HTTP_HEAD_END = ""; - //const String HTTP_ITEM = ""; - //const String HTTP_FORM = "

"; - //const String HTTP_SAVED = "
Credentials Saved
Trying to connect ESP to network.
If it fails reconnect to AP to try again
"; - //const String HTTP_END = ""; - //const char HTTP_END[] PROGMEM = R"=====( - // - //)====="; + const int WM_DONE = 0; + const int WM_WAIT = 10; - void begin(); - void begin(char const *apName); - void begin(char const *apName, char const *apPasswd); - - int _eepromStart; - const char* _apName = "no-net"; - const char* _apPasswd = NULL; - String _ssid = ""; - String _pass = ""; + const String HTTP_HEAD = "{v}"; + + void setupConfigPortal(char const *apName, char const *apPasswd); + + int _eepromStart; + const char* _apName = "no-net"; + const char* _apPasswd = NULL; + String _ssid = ""; + String _pass = ""; unsigned long timeout = 0; unsigned long start = 0; - IPAddress _ip; - IPAddress _gw; - IPAddress _sn; - int _paramsCount = 0; - - String getEEPROMString(int start, int len); - void setEEPROMString(int start, int len, String string); + IPAddress _ip; + IPAddress _gw; + IPAddress _sn; + int _paramsCount = 0; - bool keepLooping = true; - int status = WL_IDLE_STATUS; - void connectWifi(String ssid, String pass); + String getEEPROMString(int start, int len); + void setEEPROMString(int start, int len, String string); + +// boolean keepLooping = true; + int status = WL_IDLE_STATUS; + int connectWifi(String ssid, String pass); + + void handleRoot(); + void handleWifi(boolean scan); + void handleWifiSave(); + void handleNotFound(); + void handle204(); + boolean captivePortal(); - void handleRoot(); - void handleWifi(bool scan); - void handleWifiSave(); - void handleNotFound(); - void handle204(); - boolean captivePortal(); - // DNS server - const byte DNS_PORT = 53; + const byte DNS_PORT = 53; //helpers - int getRSSIasQuality(int RSSI); - boolean isIp(String str); - String toStringIp(IPAddress ip); + int getRSSIasQuality(int RSSI); + boolean isIp(String str); + String toStringIp(IPAddress ip); - boolean connect; - boolean _debug = true; + boolean connect; + boolean _debug = true; void (*_apcallback)(void) = NULL; void (*_savecallback)(void) = NULL; WiFiManagerParameter* _params[WIFI_MANAGER_MAX_PARAMS]; - //int _eepromLength; template - void DEBUG_WM(Generic text); + void DEBUG_WM(Generic text); };