/*
Credential . ino , AutoConnect for ESP8266 .
https : //github.com/Hieromon/AutoConnect
Copyright 2018 , Hieromon Ikasamo .
Licensed under The MIT License .
https : //opensource.org/licenses/MIT
An example sketch for an Arduino library for ESP8266 WLAN configuration
via the Web interface . This sketch provides a conservation measures
utility for saved credentials in EEPROM .
By accessing the root path , you can see the list of currently saved
credentials via the browser . Enter an entry number of the credential ,
that entry will be deleted from EEPROM .
This sketch uses PageBuilder to support handling of operation pages .
*/
# if defined(ARDUINO_ARCH_ESP8266)
# include <ESP8266WiFi.h>
# include <ESP8266WebServer.h>
# elif defined(ARDUINO_ARCH_ESP32)
# include <WiFi.h>
# include <WebServer.h>
# endif
# include <AutoConnect.h>
# include <AutoConnectCredential.h>
# include <PageBuilder.h>
# if defined(ARDUINO_ARCH_ESP8266)
ESP8266WebServer Server ;
# elif defined(ARDUINO_ARCH_ESP32)
WebServer Server ;
# endif
AutoConnect Portal ( Server ) ;
String viewCredential ( PageArgument & ) ;
String delCredential ( PageArgument & ) ;
// Specified the offset if the user data exists.
// The following two lines define the boundalyOffset value to be supplied to
// AutoConnectConfig respectively. It may be necessary to adjust the value
// accordingly to the actual situation.
# define CREDENTIAL_OFFSET 0
//#define CREDENTIAL_OFFSET 64
/**
* An HTML for the operation page .
* In PageBuilder , the token { { SSID } } contained in an HTML template below is
* replaced by the actual SSID due to the action of the token handler ' s
* ' viewCredential ' function .
* The number of the entry to be deleted is passed to the function in the
* POST method .
*/
static const char PROGMEM html [ ] = R " *lit(
< ! DOCTYPE html >
< html >
< head >
< meta charset = " UTF-8 " name = " viewport " content = " width=device-width, initial-scale=1 " >
< style >
html {
font - family : Helvetica , Arial , sans - serif ;
- ms - text - size - adjust : 100 % ;
- webkit - text - size - adjust : 100 % ;
}
. menu > a : link {
position : absolute ;
display : inline - block ;
right : 12 px ;
padding : 0 6 px ;
text - decoration : none ;
}
< / style >
< / head >
< body >
< div class = " menu " >{{AUTOCONNECT_MENU}}</div>
< form action = " /del " method = " POST " >
< ol >
{ { SSID } }
< / ol >
< p > Enter deleting entry : < / p >
< input type = " number " min = " 1 " name = " num " >
< input type = " submit " >
< / form >
< / body >
< / html >
) * lit " ;
static const char PROGMEM autoconnectMenu [ ] = { AUTOCONNECT_LINK ( BAR_24 ) } ;
// URL path as '/'
PageElement elmList ( html ,
{ { " SSID " , viewCredential } ,
{ " AUTOCONNECT_MENU " , [ ] ( PageArgument & args ) {
return String ( FPSTR ( autoconnectMenu ) ) ; } }
} ) ;
PageBuilder rootPage ( " / " , { elmList } ) ;
// URL path as '/del'
PageElement elmDel ( " {{DEL}} " , { { " DEL " , delCredential } } ) ;
PageBuilder delPage ( " /del " , { elmDel } ) ;
// Retrieve the credential entries from EEPROM, Build the SSID line
// with the <li> tag.
String viewCredential ( PageArgument & args ) {
AutoConnectCredential ac ( CREDENTIAL_OFFSET ) ;
struct station_config entry ;
String content = " " ;
uint8_t count = ac . entries ( ) ; // Get number of entries.
for ( int8_t i = 0 ; i < count ; i + + ) { // Loads all entries.
ac . load ( i , & entry ) ;
// Build a SSID line of an HTML.
content + = String ( " <li> " ) + String ( ( char * ) entry . ssid ) + String ( " </li> " ) ;
}
// Returns the '<li>SSID</li>' container.
return content ;
}
// Delete a credential entry, the entry to be deleted is passed in the
// request parameter 'num'.
String delCredential ( PageArgument & args ) {
AutoConnectCredential ac ( CREDENTIAL_OFFSET ) ;
if ( args . hasArg ( " num " ) ) {
int8_t e = args . arg ( " num " ) . toInt ( ) ;
if ( e > 0 ) {
struct station_config entry ;
// If the input number is valid, delete that entry.
int8_t de = ac . load ( e - 1 , & entry ) ; // A base of entry num is 0.
if ( de > 0 ) {
ac . del ( ( char * ) entry . ssid ) ;
// Returns the redirect response. The page is reloaded and its contents
// are updated to the state after deletion. It returns 302 response
// from inside this token handler.
Server . sendHeader ( " Location " , String ( " http:// " ) + Server . client ( ) . localIP ( ) . toString ( ) + String ( " / " ) ) ;
Server . send ( 302 , " text/plain " , " " ) ;
Server . client ( ) . flush ( ) ;
Server . client ( ) . stop ( ) ;
// Cancel automatic submission by PageBuilder.
delPage . cancel ( ) ;
}
}
}
return " " ;
}
void setup ( ) {
delay ( 1000 ) ;
Serial . begin ( 115200 ) ;
Serial . println ( ) ;
rootPage . insert ( Server ) ; // Instead of Server.on("/", ...);
delPage . insert ( Server ) ; // Instead of Server.on("/del", ...);
// Set an address of the credential area.
AutoConnectConfig Config ;
Config . boundaryOffset = CREDENTIAL_OFFSET ;
Portal . config ( Config ) ;
// Start
if ( Portal . begin ( ) ) {
Serial . println ( " WiFi connected: " + WiFi . localIP ( ) . toString ( ) ) ;
}
}
void loop ( ) {
Portal . handleClient ( ) ;
}