commit
dfdee15888
1 changed files with 232 additions and 0 deletions
@ -0,0 +1,232 @@ |
|||||||
|
#include <ESP8266WiFi.h> |
||||||
|
#include <DNSServer.h> |
||||||
|
#include <WiFiClient.h> |
||||||
|
#include <EEPROM.h> |
||||||
|
#include <ESP8266WebServer.h> |
||||||
|
|
||||||
|
const IPAddress apIP(192, 168, 1, 1); |
||||||
|
const char* apSSID = "ESP8266_SETUP"; |
||||||
|
boolean settingMode; |
||||||
|
String ssidList; |
||||||
|
|
||||||
|
DNSServer dnsServer; |
||||||
|
ESP8266WebServer webServer(80); |
||||||
|
|
||||||
|
void setup() { |
||||||
|
Serial.begin(115200); |
||||||
|
EEPROM.begin(512); |
||||||
|
delay(10); |
||||||
|
if (restoreConfig()) { |
||||||
|
if (checkConnection()) { |
||||||
|
settingMode = false; |
||||||
|
startWebServer(); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
settingMode = true; |
||||||
|
setupMode(); |
||||||
|
} |
||||||
|
|
||||||
|
void loop() { |
||||||
|
if (settingMode) { |
||||||
|
dnsServer.processNextRequest(); |
||||||
|
} |
||||||
|
webServer.handleClient(); |
||||||
|
} |
||||||
|
|
||||||
|
boolean restoreConfig()
|
||||||
|
{ |
||||||
|
Serial.println("Reading EEPROM..."); |
||||||
|
String ssid = ""; |
||||||
|
String pass = ""; |
||||||
|
if (EEPROM.read(0) != 0)
|
||||||
|
{ |
||||||
|
for (int i = 0; i < 32; ++i)
|
||||||
|
{ |
||||||
|
ssid += char(EEPROM.read(i)); |
||||||
|
} |
||||||
|
Serial.print("SSID: "); |
||||||
|
Serial.println(ssid); |
||||||
|
for (int i = 32; i < 96; ++i)
|
||||||
|
{ |
||||||
|
pass += char(EEPROM.read(i)); |
||||||
|
} |
||||||
|
Serial.print("Password: "); |
||||||
|
Serial.println(pass); |
||||||
|
WiFi.begin(ssid.c_str(), pass.c_str()); |
||||||
|
return true; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
Serial.println("Config not found."); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
boolean checkConnection()
|
||||||
|
{ |
||||||
|
int count = 0; |
||||||
|
Serial.print("Waiting for Wi-Fi connection"); |
||||||
|
while ( count < 30 )
|
||||||
|
{ |
||||||
|
if (WiFi.status() == WL_CONNECTED)
|
||||||
|
{ |
||||||
|
Serial.println(); |
||||||
|
Serial.println("Connected!"); |
||||||
|
return (true); |
||||||
|
} |
||||||
|
delay(500); |
||||||
|
Serial.print("."); |
||||||
|
count++; |
||||||
|
} |
||||||
|
Serial.println("Timed out."); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
void startWebServer()
|
||||||
|
{ |
||||||
|
if (settingMode)
|
||||||
|
{ |
||||||
|
Serial.print("Starting Web Server at "); |
||||||
|
Serial.println(WiFi.softAPIP()); |
||||||
|
webServer.on("/settings", []()
|
||||||
|
{ |
||||||
|
String s = "<h1>Wi-Fi Settings</h1><p>Please enter your password by selecting the SSID.</p>"; |
||||||
|
s += "<form method=\"get\" action=\"setap\"><label>SSID: </label><select name=\"ssid\">"; |
||||||
|
s += ssidList; |
||||||
|
s += "</select><br>Password: <input name=\"pass\" length=64 type=\"password\"><input type=\"submit\"></form>"; |
||||||
|
webServer.send(200, "text/html", makePage("Wi-Fi Settings", s)); |
||||||
|
}); |
||||||
|
webServer.on("/setap", []()
|
||||||
|
{ |
||||||
|
for (int i = 0; i < 96; ++i)
|
||||||
|
{ |
||||||
|
EEPROM.write(i, 0); |
||||||
|
} |
||||||
|
String ssid = urlDecode(webServer.arg("ssid")); |
||||||
|
Serial.print("SSID: "); |
||||||
|
Serial.println(ssid); |
||||||
|
String pass = urlDecode(webServer.arg("pass")); |
||||||
|
Serial.print("Password: "); |
||||||
|
Serial.println(pass); |
||||||
|
Serial.println("Writing SSID to EEPROM..."); |
||||||
|
for (int i = 0; i < ssid.length(); ++i)
|
||||||
|
{ |
||||||
|
EEPROM.write(i, ssid[i]); |
||||||
|
} |
||||||
|
Serial.println("Writing Password to EEPROM..."); |
||||||
|
for (int i = 0; i < pass.length(); ++i)
|
||||||
|
{ |
||||||
|
EEPROM.write(32 + i, pass[i]); |
||||||
|
} |
||||||
|
EEPROM.commit(); |
||||||
|
Serial.println("Write EEPROM done!"); |
||||||
|
String s = "<h1>Setup complete.</h1><p>device will be connected to \""; |
||||||
|
s += ssid; |
||||||
|
s += "\" after the restart."; |
||||||
|
webServer.send(200, "text/html", makePage("Wi-Fi Settings", s)); |
||||||
|
ESP.restart(); |
||||||
|
}); |
||||||
|
webServer.onNotFound([]()
|
||||||
|
{ |
||||||
|
String s = "<h1>AP mode</h1><p><a href=\"/settings\">Wi-Fi Settings</a></p>"; |
||||||
|
webServer.send(200, "text/html", makePage("AP mode", s)); |
||||||
|
}); |
||||||
|
} |
||||||
|
else
|
||||||
|
{ |
||||||
|
Serial.print("Starting Web Server at "); |
||||||
|
Serial.println(WiFi.localIP()); |
||||||
|
webServer.on("/", []()
|
||||||
|
{ |
||||||
|
String s = "<h1>STA mode</h1><p><a href=\"/reset\">Reset Wi-Fi Settings</a></p>"; |
||||||
|
webServer.send(200, "text/html", makePage("STA mode", s)); |
||||||
|
}); |
||||||
|
webServer.on("/reset", []()
|
||||||
|
{ |
||||||
|
for (int i = 0; i < 96; ++i)
|
||||||
|
{ |
||||||
|
EEPROM.write(i, 0); |
||||||
|
} |
||||||
|
EEPROM.commit(); |
||||||
|
String s = "<h1>Wi-Fi settings was reset.</h1><p>Please reset device.</p>"; |
||||||
|
webServer.send(200, "text/html", makePage("Reset Wi-Fi Settings", s)); |
||||||
|
}); |
||||||
|
} |
||||||
|
webServer.begin(); |
||||||
|
} |
||||||
|
|
||||||
|
void setupMode()
|
||||||
|
{ |
||||||
|
WiFi.mode(WIFI_STA); |
||||||
|
WiFi.disconnect(); |
||||||
|
delay(100); |
||||||
|
int n = WiFi.scanNetworks(); |
||||||
|
delay(100); |
||||||
|
Serial.println(""); |
||||||
|
for (int i = 0; i < n; ++i)
|
||||||
|
{ |
||||||
|
ssidList += "<option value=\""; |
||||||
|
ssidList += WiFi.SSID(i); |
||||||
|
ssidList += "\">"; |
||||||
|
ssidList += WiFi.SSID(i); |
||||||
|
ssidList += "</option>"; |
||||||
|
} |
||||||
|
delay(100); |
||||||
|
WiFi.mode(WIFI_AP); |
||||||
|
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); |
||||||
|
WiFi.softAP(apSSID); |
||||||
|
dnsServer.start(53, "*", apIP); |
||||||
|
startWebServer(); |
||||||
|
Serial.print("Starting Access Point at \""); |
||||||
|
Serial.print(apSSID); |
||||||
|
Serial.println("\""); |
||||||
|
} |
||||||
|
|
||||||
|
String makePage(String title, String contents)
|
||||||
|
{ |
||||||
|
String s = "<!DOCTYPE html><html><head>"; |
||||||
|
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">"; |
||||||
|
s += "<title>"; |
||||||
|
s += title; |
||||||
|
s += "</title></head><body>"; |
||||||
|
s += contents; |
||||||
|
s += "</body></html>"; |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
String urlDecode(String input)
|
||||||
|
{ |
||||||
|
String s = input; |
||||||
|
s.replace("%20", " "); |
||||||
|
s.replace("+", " "); |
||||||
|
s.replace("%21", "!"); |
||||||
|
s.replace("%22", "\""); |
||||||
|
s.replace("%23", "#"); |
||||||
|
s.replace("%24", "$"); |
||||||
|
s.replace("%25", "%"); |
||||||
|
s.replace("%26", "&"); |
||||||
|
s.replace("%27", "\'"); |
||||||
|
s.replace("%28", "("); |
||||||
|
s.replace("%29", ")"); |
||||||
|
s.replace("%30", "*"); |
||||||
|
s.replace("%31", "+"); |
||||||
|
s.replace("%2C", ","); |
||||||
|
s.replace("%2E", "."); |
||||||
|
s.replace("%2F", "/"); |
||||||
|
s.replace("%2C", ","); |
||||||
|
s.replace("%3A", ":"); |
||||||
|
s.replace("%3A", ";"); |
||||||
|
s.replace("%3C", "<"); |
||||||
|
s.replace("%3D", "="); |
||||||
|
s.replace("%3E", ">"); |
||||||
|
s.replace("%3F", "?"); |
||||||
|
s.replace("%40", "@"); |
||||||
|
s.replace("%5B", "["); |
||||||
|
s.replace("%5C", "\\"); |
||||||
|
s.replace("%5D", "]"); |
||||||
|
s.replace("%5E", "^"); |
||||||
|
s.replace("%5F", "-"); |
||||||
|
s.replace("%60", "`"); |
||||||
|
return s; |
||||||
|
} |
||||||
Loading…
Reference in new issue