Files
TEF6686_ESP32/lib/WiFiConnect/WiFiConnect.h

190 lines
8.0 KiB
C++

/*!
@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 <a href="https://github.com/smurf0969/WiFiConnect">https://github.com/smurf0969/WiFiConnect</a>.
Further information is also available in the project <a href="https://github.com/smurf0969/WiFiConnect/wiki">Wiki</a>.
This is a heavily customised version from the origional <a href="https://github.com/tzapu/WiFiManager">WiFiManager</a>
developed by https://github.com/tzapu .
This library depends on <a href="https://github.com/esp8266/Arduino">
ESP8266 Arduino Core</a> and <a href="https://github.com/espressif/arduino-esp32">ESP32 Arduino Core</a> 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 <Arduino.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#else
#include <WiFi.h>
#include <FS.h>
using fs::FS;
#include <WebServer.h>
#endif
#include <DNSServer.h>
#include <memory>
#if defined(ESP8266)
extern "C" {
#include "user_interface.h"
}
#define ESP_getChipId() (ESP.getChipId()) ///< Gets an ID from the chip
#else
#include <esp_wifi.h>
#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 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 <typename Generic>
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> dnsServer; ///< DNS Server for captive portal to redirect to Access Point
#ifdef ESP8266
std::unique_ptr<ESP8266WebServer> server; ///< Web server for serving access point pages
#else
std::unique_ptr<WebServer> 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)() = NULL;
void handleRoot();
void handleParamRoot();
void handleParams();
void handleWifi(boolean scan);
void handleWifiSave();
void handleInfo();
void handleReset();
void handle204();
void handleNotFound();
template <class T>
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