/*! @file WiFiConnect.h This is the documentation for WiFiConnect for the Arduino platform. It is a WiFi connection manager for use with the popular ESP8266 and ESP32 chips. It contains a captive portal to allow easy connection and changing of WiFi netwoks via a web based interface and allows for additional user parameters. You can view the project at https://github.com/smurf0969/WiFiConnect. Further information is also available in the project Wiki. This is a heavily customised version from the origional WiFiManager developed by https://github.com/tzapu . This library depends on ESP8266 Arduino Core and ESP32 Arduino Core being present on your system. Please make sure you have installed the latest version before using this library. Written by Stuart Blair. GNU General Public License v3.0 licence, all text here must be included in any redistribution and you should receive a copy of the license file. */ #ifndef WiFiConnect_h #define WiFiConnect_h #include #if defined(ESP8266) #include #include #else #include #include using fs::FS; #include #endif #include #include #if defined(ESP8266) extern "C" { #include "user_interface.h" } #define ESP_getChipId() (ESP.getChipId()) ///< Gets an ID from the chip #else #include #define ESP_getChipId() ((uint32_t)ESP.getEfuseMac())///< Gets an ID from the chip #endif #include "WC_AP_HTML.h" #include "WiFiConnectParam.h" /** Options for how a access point should continue if no WiFi connected */ enum AP_Continue { AP_NONE, ///< No action, continues to run code AP_LOOP, ///< Stalls execution with an infinate loop AP_RESTART, ///< Restarts the chip, allowing it to try to setup again. Handy for sensors when wifi is lost. AP_RESET, ///< Same as AP_RESTART AP_WAIT // Keep the AP and webserver running, sit quietly and be patient. }; /**************************************************************************/ /*! @brief Class that helps to connect to WiFi networks, that also has captive portal web interface for configuration. This is the base class for WiFiConntectOLED which displays information on a OLED display. */ /**************************************************************************/ class WiFiConnect { public: /// Create WiFiConnect class WiFiConnect(); boolean startConfigurationPortal(); boolean startConfigurationPortal(AP_Continue apcontinue); boolean startConfigurationPortal(AP_Continue apcontinue, const char* apName, const char* apPassword = NULL, bool paramsMode = false); boolean startParamsPortal(); boolean startParamsPortal(AP_Continue apcontinue); boolean startParamsPortal(AP_Continue apcontinue, const char* apName, const char* apPassword = NULL); void addParameter(WiFiConnectParam *p); void setAPName(const char* apName); const char* getAPName(); void resetSettings(); boolean autoConnect(); boolean autoConnect(const char* ssidName, const char* ssidPassword = NULL, WiFiMode_t acWiFiMode = WIFI_STA); //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)(WiFiConnect*) ); //called when settings have been changed and connection was successful void setSaveConfigCallback( void (*func)(void) ); void setDebug(boolean isDebug); void setRetryAttempts(int attempts); void setConnectionTimeoutSecs(int timeout); void setAPModeTimeoutMins(int mins); boolean captivePortal(); //helpers const char* statusToString(int state); int getRSSIasQuality(int RSSI); boolean isIp(String str); String toStringIp(IPAddress ip); virtual void displayTurnOFF(int ms = 5000); ///< Virtual method overriden in WiFiConnectOLED virtual void displayLoop(); ///< Virtual method overriden in WiFiConnectOLED virtual void displayON(); ///< Virtual method overriden in WiFiConnectOLED protected: boolean _debug = false; ///< Flag to determine wheter to output mesages or not template void DEBUG_WC(Generic text); virtual void displayConnecting(int attempt, int totalAttempts); ///< Virtual method overriden in WiFiConnectOLED virtual void displayConnected(); ///< Virtual method overriden in WiFiConnectOLED virtual void displayAP(); ///< Virtual method overriden in WiFiConnectOLED virtual void displayParams(); ///< Virtual method overriden in WiFiConnectOLED virtual void displayManualReset(); ///< Virtual method overriden in WiFiConnectOLED private: int _retryAttempts = 3; ///< Number of attempts when trying to connect to WiFi network int _connectionTimeoutSecs = 10; ///< How log to wait for the connection to succeed or fail int _apTimeoutMins = 3; ///< The amount of minutes of inactivity before the access point exits it routine // DNS server const byte DNS_PORT = 53; ///< Standard DNS Port number long _lastAPPage = 0; ///< The last time a page was accessed in the portal. Used for the inactivity timeout. boolean _removeDuplicateAPs = true; ///< Flag to remove duplicate networks from scan results. int _minimumQuality = 8; ///< The minimum netqork quality to be included in scan results. int _paramsCount = 0; ///< The amount of custom parameters added via addParameter boolean _readyToConnect = false; ///< Flag used in access point to determine if it should try to connect to the network. String _ssid = " "; ///< Tempory holder for the network ssid String _password = " "; ///< Tempory holder for the network password WiFiConnectParam* _params[WiFiConnect_MAX_PARAMS]; ///< Array to hold custom parameters std::unique_ptr dnsServer; ///< DNS Server for captive portal to redirect to Access Point #ifdef ESP8266 std::unique_ptr server; ///< Web server for serving access point pages #else std::unique_ptr server; ///< Web server for serving access point pages #endif char _apName[33] ; ///< Holder for the access point name char _apPassword[65] ; ///< Holder for the access point password IPAddress _ap_static_ip; ///< Variable for holding Static IP Address for the access point IPAddress _ap_static_gw; ///< Variable for holding Static Gateway IP Address for the access point IPAddress _ap_static_sn; ///< Variable for holding Static Subnet Mask IP Address for the access point IPAddress _sta_static_ip; ///< Variable for holding Static IP Address for the network connection IPAddress _sta_static_gw; ///< Variable for holding Static Gateway IP Address for the network connection IPAddress _sta_static_sn; ///< Variable for holding Static Subnet Mask IP Address for the network connection void (*_apcallback)(WiFiConnect*) = NULL; void (*_savecallback)(void) = NULL; void handleRoot(); void handleParamRoot(); void handleParams(); void handleWifi(boolean scan); void handleWifiSave(); void handleInfo(); void handleReset(); void handle204(); void handleNotFound(); template auto optionalIPFromString(T *obj, const char *s) -> decltype( obj->fromString(s) ) { return obj->fromString(s); } auto optionalIPFromString(...) -> bool { DEBUG_WC("NO fromString METHOD ON IPAddress, you need ESP8266 core 2.1.0 or newer for Custom IP configuration to work."); return false; } }; #endif