123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /*
- 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: 12px;
- padding: 0 6px;
- 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);
- station_config_t 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();
- Serial.printf("Request deletion #%d\n", e);
- if (e > 0) {
- station_config_t 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) {
- Serial.printf("Delete for %s ", (char *)entry.ssid);
- Serial.printf("%s\n", ac.del((char *)entry.ssid) ? "completed" : "failed");
- // 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();
- }
|