[
  {
    "path": "ESP-wifiboot.ino",
    "content": "#include \"ESP8266WiFi.h\"\n#include <ESP8266mDNS.h>\n#include <WiFiClient.h>\n#include <EEPROM.h>\n\nMDNSResponder mdns;\nWiFiServer server(80);\n\nconst char* ssid = \"BUBBLES\";\nString st;\n\nvoid setup() {\n  Serial.begin(115200);\n  EEPROM.begin(512);\n  delay(10);\n  Serial.println();\n  Serial.println();\n  Serial.println(\"Startup\");\n  // read eeprom for ssid and pass\n  Serial.println(\"Reading EEPROM ssid\");\n  String esid;\n  for (int i = 0; i < 32; ++i)\n    {\n      esid += char(EEPROM.read(i));\n    }\n  Serial.print(\"SSID: \");\n  Serial.println(esid);\n  Serial.println(\"Reading EEPROM pass\");\n  String epass = \"\";\n  for (int i = 32; i < 96; ++i)\n    {\n      epass += char(EEPROM.read(i));\n    }\n  Serial.print(\"PASS: \");\n  Serial.println(epass);  \n  if ( esid.length() > 1 ) {\n      // test esid \n      WiFi.begin(esid.c_str(), epass.c_str());\n      if ( testWifi() == 20 ) { \n          launchWeb(0);\n          return;\n      }\n  }\n  setupAP(); \n}\n\nint testWifi(void) {\n  int c = 0;\n  Serial.println(\"Waiting for Wifi to connect\");  \n  while ( c < 20 ) {\n    if (WiFi.status() == WL_CONNECTED) { return(20); } \n    delay(500);\n    Serial.print(WiFi.status());    \n    c++;\n  }\n  Serial.println(\"Connect timed out, opening AP\");\n  return(10);\n} \n\nvoid launchWeb(int webtype) {\n          Serial.println(\"\");\n          Serial.println(\"WiFi connected\");\n          Serial.println(WiFi.localIP());\n          Serial.println(WiFi.softAPIP());\n          if (!mdns.begin(\"esp8266\", WiFi.localIP())) {\n            Serial.println(\"Error setting up MDNS responder!\");\n            while(1) { \n              delay(1000);\n            }\n          }\n          Serial.println(\"mDNS responder started\");\n          // Start the server\n          server.begin();\n          Serial.println(\"Server started\");   \n          int b = 20;\n          int c = 0;\n          while(b == 20) { \n             b = mdns1(webtype);\n           }\n}\n\nvoid setupAP(void) {\n  \n  WiFi.mode(WIFI_STA);\n  WiFi.disconnect();\n  delay(100);\n  int n = WiFi.scanNetworks();\n  Serial.println(\"scan done\");\n  if (n == 0)\n    Serial.println(\"no networks found\");\n  else\n  {\n    Serial.print(n);\n    Serial.println(\" networks found\");\n    for (int i = 0; i < n; ++i)\n     {\n      // Print SSID and RSSI for each network found\n      Serial.print(i + 1);\n      Serial.print(\": \");\n      Serial.print(WiFi.SSID(i));\n      Serial.print(\" (\");\n      Serial.print(WiFi.RSSI(i));\n      Serial.print(\")\");\n      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?\" \":\"*\");\n      delay(10);\n     }\n  }\n  Serial.println(\"\"); \n  st = \"<ul>\";\n  for (int i = 0; i < n; ++i)\n    {\n      // Print SSID and RSSI for each network found\n      st += \"<li>\";\n      st +=i + 1;\n      st += \": \";\n      st += WiFi.SSID(i);\n      st += \" (\";\n      st += WiFi.RSSI(i);\n      st += \")\";\n      st += (WiFi.encryptionType(i) == ENC_TYPE_NONE)?\" \":\"*\";\n      st += \"</li>\";\n    }\n  st += \"</ul>\";\n  delay(100);\n  WiFi.softAP(ssid);\n  Serial.println(\"softap\");\n  Serial.println(\"\");\n  launchWeb(1);\n  Serial.println(\"over\");\n}\n\nint mdns1(int webtype)\n{\n  // Check for any mDNS queries and send responses\n  mdns.update();\n  \n  // Check if a client has connected\n  WiFiClient client = server.available();\n  if (!client) {\n    return(20);\n  }\n  Serial.println(\"\");\n  Serial.println(\"New client\");\n\n  // Wait for data from client to become available\n  while(client.connected() && !client.available()){\n    delay(1);\n   }\n  \n  // Read the first line of HTTP request\n  String req = client.readStringUntil('\\r');\n  \n  // First line of HTTP request looks like \"GET /path HTTP/1.1\"\n  // Retrieve the \"/path\" part by finding the spaces\n  int addr_start = req.indexOf(' ');\n  int addr_end = req.indexOf(' ', addr_start + 1);\n  if (addr_start == -1 || addr_end == -1) {\n    Serial.print(\"Invalid request: \");\n    Serial.println(req);\n    return(20);\n   }\n  req = req.substring(addr_start + 1, addr_end);\n  Serial.print(\"Request: \");\n  Serial.println(req);\n  client.flush(); \n  String s;\n  if ( webtype == 1 ) {\n      if (req == \"/\")\n      {\n        IPAddress ip = WiFi.softAPIP();\n        String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);\n        s = \"HTTP/1.1 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n<!DOCTYPE HTML>\\r\\n<html>Hello from ESP8266 at \";\n        s += ipStr;\n        s += \"<p>\";\n        s += st;\n        s += \"<form method='get' action='a'><label>SSID: </label><input name='ssid' length=32><input name='pass' length=64><input type='submit'></form>\";\n        s += \"</html>\\r\\n\\r\\n\";\n        Serial.println(\"Sending 200\");\n      }\n      else if ( req.startsWith(\"/a?ssid=\") ) {\n        // /a?ssid=blahhhh&pass=poooo\n        Serial.println(\"clearing eeprom\");\n        for (int i = 0; i < 96; ++i) { EEPROM.write(i, 0); }\n        String qsid; \n        qsid = req.substring(8,req.indexOf('&'));\n        Serial.println(qsid);\n        Serial.println(\"\");\n        String qpass;\n        qpass = req.substring(req.lastIndexOf('=')+1);\n        Serial.println(qpass);\n        Serial.println(\"\");\n        \n        Serial.println(\"writing eeprom ssid:\");\n        for (int i = 0; i < qsid.length(); ++i)\n          {\n            EEPROM.write(i, qsid[i]);\n            Serial.print(\"Wrote: \");\n            Serial.println(qsid[i]); \n          }\n        Serial.println(\"writing eeprom pass:\"); \n        for (int i = 0; i < qpass.length(); ++i)\n          {\n            EEPROM.write(32+i, qpass[i]);\n            Serial.print(\"Wrote: \");\n            Serial.println(qpass[i]); \n          }    \n        EEPROM.commit();\n        s = \"HTTP/1.1 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n<!DOCTYPE HTML>\\r\\n<html>Hello from ESP8266 \";\n        s += \"Found \";\n        s += req;\n        s += \"<p> saved to eeprom... reset to boot into new wifi</html>\\r\\n\\r\\n\";\n      }\n      else\n      {\n        s = \"HTTP/1.1 404 Not Found\\r\\n\\r\\n\";\n        Serial.println(\"Sending 404\");\n      }\n  } \n  else\n  {\n      if (req == \"/\")\n      {\n        s = \"HTTP/1.1 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n<!DOCTYPE HTML>\\r\\n<html>Hello from ESP8266\";\n        s += \"<p>\";\n        s += \"</html>\\r\\n\\r\\n\";\n        Serial.println(\"Sending 200\");\n      }\n      else if ( req.startsWith(\"/cleareeprom\") ) {\n        s = \"HTTP/1.1 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n<!DOCTYPE HTML>\\r\\n<html>Hello from ESP8266\";\n        s += \"<p>Clearing the EEPROM<p>\";\n        s += \"</html>\\r\\n\\r\\n\";\n        Serial.println(\"Sending 200\");  \n        Serial.println(\"clearing eeprom\");\n        for (int i = 0; i < 96; ++i) { EEPROM.write(i, 0); }\n        EEPROM.commit();\n      }\n      else\n      {\n        s = \"HTTP/1.1 404 Not Found\\r\\n\\r\\n\";\n        Serial.println(\"Sending 404\");\n      }       \n  }\n  client.print(s);\n  Serial.println(\"Done with client\");\n  return(20);\n}\n\n\n\nvoid loop() {\n  // put your main code here, to run repeatedly:\n\n}\n"
  },
  {
    "path": "README.md",
    "content": "# esp-arduino-apboot\nESP8266 wifi configurator in Arduino lang.. uses eeprom for configs, boots to AP mode if no working config found\n"
  }
]