/** * WiFiManager.h * * WiFiManager, a library for the ESP8266/Arduino platform * for configuration of WiFi credentials using a Captive Portal * * @author Creator tzapu * @author tablatronix * @version 0.0.0 * @license MIT */ #ifndef WiFiManager_h #define WiFiManager_h #define WEBSERVERSHIM // use webserver shim lib #ifdef ESP8266 extern "C" { #include "user_interface.h" } #include #include #define WIFI_getChipId() ESP.getChipId() #define WIFI_AUTH_OPEN ENC_TYPE_NONE #elif defined(ESP32) #include #include #define WIFI_getChipId() (uint32_t)ESP.getEfuseMac() #define WIFI_AUTH_OPEN WIFI_AUTH_OPEN #ifndef WEBSERVER_H #warning "WEBSERVER not implemented in espressif/esp32, see readme notes" #ifdef WEBSERVERSHIM #include #else #include // Forthcoming official // https://github.com/esp8266/ESPWebServer #endif #endif #else #endif #include #include #include "strings_en.h" #ifndef WIFI_MANAGER_MAX_PARAMS #define WIFI_MANAGER_MAX_PARAMS 5 // params will autoincrement and realloc by this amount when max is reached #endif #define WFM_LABEL_BEFORE 1 #define WFM_LABEL_AFTER 2 #define WFM_NO_LABEL 0 class WiFiManagerParameter { public: /** Create custom parameters that can be added to the WiFiManager setup web page @id is used for HTTP queries and must not contain spaces nor other special characters */ WiFiManagerParameter(const char *custom); WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length); WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom); WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom, int labelPlacement); ~WiFiManagerParameter(); const char *getID(); const char *getValue(); const char *getPlaceholder(); int getValueLength(); int getLabelPlacement(); const char *getCustomHTML(); private: const char *_id; const char *_placeholder; char *_value; int _length; int _labelPlacement; const char *_customHTML; void init(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom); void init(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom, int labelPlacement); friend class WiFiManager; }; class WiFiManager { public: WiFiManager(Stream& consolePort); WiFiManager(); ~WiFiManager(); // auto connect to saved wifi, or custom, and start config portal on failures boolean autoConnect(); boolean autoConnect(char const *apName, char const *apPassword = NULL); //manually start the config portal, autoconnect does this automatically on connect failure boolean startConfigPortal(); // auto generates apname boolean startConfigPortal(char const *apName, char const *apPassword = NULL); //manually start the web portal, autoconnect does this automatically on connect failure void startWebPortal(); //manually stop the web portal if started manually void stopWebPortal(); // Run webserver processing, if setConfigPortalBlocking(false) boolean process(); // get the AP name of the config portal, so it can be used in the callback String getConfigPortalSSID(); // erase wifi credentials void resetSettings(); // reboot esp void reboot(); // disconnect wifi, without persistent saving or erasing bool disconnect(); //sets timeout before AP,webserver loop ends and exits even if there has been no setup. //useful for devices that failed to connect at some point and got stuck in a webserver loop //in seconds setConfigPortalTimeout is a new name for setTimeout void setConfigPortalTimeout(unsigned long seconds); void setTimeout(unsigned long seconds); // @deprecated, alias //sets timeout for which to attempt connecting, useful if you get a lot of failed connects void setConnectTimeout(unsigned long seconds); // toggle debug output void setDebugOutput(boolean debug); //defaults to not showing anything under 8% signal quality if called void setMinimumSignalQuality(int quality = 8); //sets a custom ip /gateway /subnet configuration void setAPStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn); //sets config for a static IP void setSTAStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn); //called when AP mode and config portal is started void setAPCallback( void (*func)(WiFiManager*) ); //called when settings have been changed and connection was successful void setSaveConfigCallback( void (*func)(void) ); //adds a custom parameter, returns false on failure bool addParameter(WiFiManagerParameter *p); //if this is set, it will exit after config, even if connection is unsuccessful. void setBreakAfterConfig(boolean shouldBreak); //if this is set, portal will be blocking and wait until save or exit, is false user must manually `process()` to handle config portal void setConfigPortalBlocking(boolean shouldBlock); //if this is set, customise style void setCustomHeadElement(const char* element); //if this is true, remove duplicated Access Points - defaut true void setRemoveDuplicateAPs(boolean removeDuplicates); //setter for ESP wifi.persistent so we can remember it and restore user preference, as WIFi._persistent is protected void setRestorePersistent(boolean persistent); //if true, always show static net inputs, IP, subnet, gateway, if false, only show when already set. void setShowStaticFields(boolean alwaysShow); //if true disable captive portal redirection void setCaptivePortalEnable(boolean enabled); //if true, timeout captive portal even if a STA client connected (true), suggest disabling if captiveportal is open void setCaptivePortalClientCheck(boolean enabled); //if true, reset timeout when webclient connects (true), suggest disabling if captiveportal is open void setWebPortalClientCheck(boolean enabled); // if true enable autoreconnecting void setWiFiAutoReconnect(boolean enabled); // if true, wifiscan will show percentage instead of quality icons, until we have better templating void setScanDispPerc(boolean enabled); // set a custom hostname, sets sta and ap dhcp client id for esp32, and sta for esp8266 bool setHostname(const char * hostname); // get last connection result, includes autoconnect and wifisave uint8_t getLastConxResult(); // get a status as string String getWLStatusString(uint8_t status); // check if the module has a saved ap to connect to bool getWiFiIsSaved(); // debug output the softap config void debugSoftAPConfig(); // debug output platform info and versioning void debugPlatformInfo(); private: std::unique_ptr dnsServer; #if defined(ESP32) && defined(WEBSERVERSHIM) std::unique_ptr server; #else std::unique_ptr server; #endif // ip configs IPAddress _ap_static_ip; IPAddress _ap_static_gw; IPAddress _ap_static_sn; IPAddress _sta_static_ip; IPAddress _sta_static_gw; IPAddress _sta_static_sn; // defaults const byte DNS_PORT = 53; String _apName = "no-net"; String _apPassword = ""; String _ssid = ""; String _pass = ""; // options flags unsigned long _configPortalTimeout = 0; // ms close config portal loop if set (depending on _cp/webClientCheck options) unsigned long _connectTimeout = 0; // ms stop trying to connect to ap if set unsigned long _configPortalStart = 0; // ms config portal start time (updated for timeouts) unsigned long _webPortalAccessed = 0; // ms last web access time WiFiMode_t _usermode = WIFI_OFF; String _wifissidprefix = FPSTR(S_ssidpre); // auto apname prefix prefix+chipid uint8_t _lastconxresult = WL_IDLE_STATUS; // option parameters int _minimumQuality = -1; // filter wifiscan ap by this rssi boolean _removeDuplicateAPs = true; // remove dup aps from wifiscan boolean _shouldBreakAfterConfig = false; // stop configportal on save failure boolean _tryWPS = false; // try WPS on save failure, unsupported boolean _configPortalIsBlocking = true; // configportal enters blocking loop boolean _staShowStaticFields = false; // always show static ip fields, even if not set in code boolean _enableCaptivePortal = true; // enable captive portal redirection boolean _userpersistent = true; // users preffered persistence to restore boolean _wifiAutoReconnect = true; // there is no platform getter for this, we must assume its true and make it so boolean _cpClientCheck = false; // keep cp alive if cp have station boolean _webClientCheck = true; // keep cp alive if web have client boolean _scanDispOptions = false; // show percentage in scans not icons const char * _hostname = "wmtest"; const char* _customHeadElement = ""; // store custom head element html from user void setupConfigPortal(); void startWPS(); bool startAP(); int status = WL_IDLE_STATUS; int connectWifi(String ssid, String pass); uint8_t waitForConnectResult(); uint8_t waitForConnectResult(uint16_t timeout); // webserver handlers void handleRoot(); void handleWifi(boolean scan); void handleWifiSave(); void handleInfo(); void handleReset(); void handleNotFound(); void handleExit(); void handleErase(); void handleWiFiStatus(); void handleRequest(); boolean captivePortal(); boolean configPortalHasTimeout(); boolean stopConfigPortal(); uint8_t handleConfigPortal(); void stopCaptivePortal(); // wifi platform abstractions bool WiFi_Mode(WiFiMode_t m); bool WiFi_Mode(WiFiMode_t m,bool persistent); bool WiFi_Disconnect(); bool WiFi_enableSTA(bool enable); bool WiFi_enableSTA(bool enable,bool persistent); bool WiFi_eraseConfig(); uint8_t WiFi_softap_num_stations(); bool WiFi_hasAutoConnect(); void WiFi_autoReconnect(); String WiFi_SSID(); static void WiFiEvent(WiFiEvent_t event); // output helpers String getParamOut(); String getIpForm(String id, String title, String value); String getScanItemOut(); String getStaticOut(); String getHTTPHead(String title); //helpers int getRSSIasQuality(int RSSI); boolean isIp(String str); String toStringIp(IPAddress ip); boolean validApPassword(); String encryptionTypeStr(uint8_t authmode); void reportStatus(String &page); String getInfoData(String id); // flags boolean connect; boolean abort; boolean reset = false; boolean configPortalActive = false; boolean webPortalActive = false; boolean portalTimeoutResult = false; boolean portalAbortResult = false; boolean storeSTAmode = true; // option store persistent STA mode in connectwifi int timer = 0; // WiFiManagerParameter int _paramsCount = 0; int _max_params; WiFiManagerParameter** _params; // debugging boolean _debug = true; uint8_t _debugLevel = 1; Stream& _debugPort; // debug output stream ref template void DEBUG_WM(Generic text); template void DEBUG_WM(Generic text,Genericb textb); // callbacks void (*_apcallback)(WiFiManager*) = NULL; void (*_savecallback)(void) = NULL; template auto optionalIPFromString(T *obj, const char *s) -> decltype( obj->fromString(s) ) { return obj->fromString(s); } auto optionalIPFromString(...) -> bool { // DEBUG_WM("NO fromString METHOD ON IPAddress, you need ESP8266 core 2.1.0 or newer for Custom IP configuration to work."); return false; } }; #endif