WiFiSetting.ino 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. #include <M5Stack.h>
  2. #include <WiFi.h>
  3. #include <ESPmDNS.h>
  4. #include <WiFiClient.h>
  5. #include "WebServer.h"
  6. #include <Preferences.h>
  7. const IPAddress apIP(192, 168, 4, 1);
  8. const char* apSSID = "M5STACK_SETUP";
  9. boolean settingMode;
  10. String ssidList;
  11. String wifi_ssid;
  12. String wifi_password;
  13. // DNSServer dnsServer;
  14. WebServer webServer(80);
  15. // wifi config store
  16. Preferences preferences;
  17. void setup() {
  18. m5.begin();
  19. M5.Power.begin();
  20. preferences.begin("wifi-config");
  21. delay(10);
  22. if (restoreConfig()) {
  23. if (checkConnection()) {
  24. settingMode = false;
  25. startWebServer();
  26. return;
  27. }
  28. }
  29. settingMode = true;
  30. setupMode();
  31. }
  32. void loop() {
  33. if (settingMode) {
  34. }
  35. webServer.handleClient();
  36. }
  37. boolean restoreConfig() {
  38. wifi_ssid = preferences.getString("WIFI_SSID");
  39. wifi_password = preferences.getString("WIFI_PASSWD");
  40. Serial.print("WIFI-SSID: ");
  41. M5.Lcd.print("WIFI-SSID: ");
  42. Serial.println(wifi_ssid);
  43. M5.Lcd.println(wifi_ssid);
  44. Serial.print("WIFI-PASSWD: ");
  45. M5.Lcd.print("WIFI-PASSWD: ");
  46. Serial.println(wifi_password);
  47. M5.Lcd.println(wifi_password);
  48. WiFi.begin(wifi_ssid.c_str(), wifi_password.c_str());
  49. if(wifi_ssid.length() > 0) {
  50. return true;
  51. } else {
  52. return false;
  53. }
  54. }
  55. boolean checkConnection() {
  56. int count = 0;
  57. Serial.print("Waiting for Wi-Fi connection");
  58. M5.Lcd.print("Waiting for Wi-Fi connection");
  59. while ( count < 30 ) {
  60. if (WiFi.status() == WL_CONNECTED) {
  61. Serial.println();
  62. M5.Lcd.println();
  63. Serial.println("Connected!");
  64. M5.Lcd.println("Connected!");
  65. return (true);
  66. }
  67. delay(500);
  68. Serial.print(".");
  69. M5.Lcd.print(".");
  70. count++;
  71. }
  72. Serial.println("Timed out.");
  73. M5.Lcd.println("Timed out.");
  74. return false;
  75. }
  76. void startWebServer() {
  77. if (settingMode) {
  78. Serial.print("Starting Web Server at ");
  79. M5.Lcd.print("Starting Web Server at ");
  80. Serial.println(WiFi.softAPIP());
  81. M5.Lcd.println(WiFi.softAPIP());
  82. webServer.on("/settings", []() {
  83. String s = "<h1>Wi-Fi Settings</h1><p>Please enter your password by selecting the SSID.</p>";
  84. s += "<form method=\"get\" action=\"setap\"><label>SSID: </label><select name=\"ssid\">";
  85. s += ssidList;
  86. s += "</select><br>Password: <input name=\"pass\" length=64 type=\"password\"><input type=\"submit\"></form>";
  87. webServer.send(200, "text/html", makePage("Wi-Fi Settings", s));
  88. });
  89. webServer.on("/setap", []() {
  90. String ssid = urlDecode(webServer.arg("ssid"));
  91. Serial.print("SSID: ");
  92. M5.Lcd.print("SSID: ");
  93. Serial.println(ssid);
  94. M5.Lcd.println(ssid);
  95. String pass = urlDecode(webServer.arg("pass"));
  96. Serial.print("Password: ");
  97. M5.Lcd.print("Password: ");
  98. Serial.println(pass);
  99. M5.Lcd.println(pass);
  100. Serial.println("Writing SSID to EEPROM...");
  101. M5.Lcd.println("Writing SSID to EEPROM...");
  102. // Store wifi config
  103. Serial.println("Writing Password to nvr...");
  104. M5.Lcd.println("Writing Password to nvr...");
  105. preferences.putString("WIFI_SSID", ssid);
  106. preferences.putString("WIFI_PASSWD", pass);
  107. Serial.println("Write nvr done!");
  108. M5.Lcd.println("Write nvr done!");
  109. String s = "<h1>Setup complete.</h1><p>device will be connected to \"";
  110. s += ssid;
  111. s += "\" after the restart.";
  112. webServer.send(200, "text/html", makePage("Wi-Fi Settings", s));
  113. delay(3000);
  114. ESP.restart();
  115. });
  116. webServer.onNotFound([]() {
  117. String s = "<h1>AP mode</h1><p><a href=\"/settings\">Wi-Fi Settings</a></p>";
  118. webServer.send(200, "text/html", makePage("AP mode", s));
  119. });
  120. }
  121. else {
  122. Serial.print("Starting Web Server at ");
  123. M5.Lcd.print("Starting Web Server at ");
  124. Serial.println(WiFi.localIP());
  125. M5.Lcd.println(WiFi.localIP());
  126. webServer.on("/", []() {
  127. String s = "<h1>STA mode</h1><p><a href=\"/reset\">Reset Wi-Fi Settings</a></p>";
  128. webServer.send(200, "text/html", makePage("STA mode", s));
  129. });
  130. webServer.on("/reset", []() {
  131. // reset the wifi config
  132. preferences.remove("WIFI_SSID");
  133. preferences.remove("WIFI_PASSWD");
  134. String s = "<h1>Wi-Fi settings was reset.</h1><p>Please reset device.</p>";
  135. webServer.send(200, "text/html", makePage("Reset Wi-Fi Settings", s));
  136. delay(3000);
  137. ESP.restart();
  138. });
  139. }
  140. webServer.begin();
  141. }
  142. void setupMode() {
  143. WiFi.mode(WIFI_MODE_STA);
  144. WiFi.disconnect();
  145. delay(100);
  146. int n = WiFi.scanNetworks();
  147. delay(100);
  148. Serial.println("");
  149. M5.Lcd.println("");
  150. for (int i = 0; i < n; ++i) {
  151. ssidList += "<option value=\"";
  152. ssidList += WiFi.SSID(i);
  153. ssidList += "\">";
  154. ssidList += WiFi.SSID(i);
  155. ssidList += "</option>";
  156. }
  157. delay(100);
  158. WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  159. WiFi.softAP(apSSID);
  160. WiFi.mode(WIFI_MODE_AP);
  161. // WiFi.softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet);
  162. // WiFi.softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0);
  163. // dnsServer.start(53, "*", apIP);
  164. startWebServer();
  165. Serial.print("Starting Access Point at \"");
  166. M5.Lcd.print("Starting Access Point at \"");
  167. Serial.print(apSSID);
  168. M5.Lcd.print(apSSID);
  169. Serial.println("\"");
  170. M5.Lcd.println("\"");
  171. }
  172. String makePage(String title, String contents) {
  173. String s = "<!DOCTYPE html><html><head>";
  174. s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=0\">";
  175. s += "<title>";
  176. s += title;
  177. s += "</title></head><body>";
  178. s += contents;
  179. s += "</body></html>";
  180. return s;
  181. }
  182. String urlDecode(String input) {
  183. String s = input;
  184. s.replace("%20", " ");
  185. s.replace("+", " ");
  186. s.replace("%21", "!");
  187. s.replace("%22", "\"");
  188. s.replace("%23", "#");
  189. s.replace("%24", "$");
  190. s.replace("%25", "%");
  191. s.replace("%26", "&");
  192. s.replace("%27", "\'");
  193. s.replace("%28", "(");
  194. s.replace("%29", ")");
  195. s.replace("%30", "*");
  196. s.replace("%31", "+");
  197. s.replace("%2C", ",");
  198. s.replace("%2E", ".");
  199. s.replace("%2F", "/");
  200. s.replace("%2C", ",");
  201. s.replace("%3A", ":");
  202. s.replace("%3A", ";");
  203. s.replace("%3C", "<");
  204. s.replace("%3D", "=");
  205. s.replace("%3E", ">");
  206. s.replace("%3F", "?");
  207. s.replace("%40", "@");
  208. s.replace("%5B", "[");
  209. s.replace("%5C", "\\");
  210. s.replace("%5D", "]");
  211. s.replace("%5E", "^");
  212. s.replace("%5F", "-");
  213. s.replace("%60", "`");
  214. return s;
  215. }