diff --git a/data/config.ini b/data/config.ini new file mode 100644 index 0000000..e69de29 diff --git a/esp8266-laser.ino b/esp8266-laser.ino index 29c84d8..3dec92d 100644 --- a/esp8266-laser.ino +++ b/esp8266-laser.ino @@ -34,17 +34,23 @@ SoftwareSerial laserSerial(14, 12, false, 256); -const char *ssid = "ESP-test"; -const char *password = ""; +char ssid[50] = "tojoin"; +char password[50] = ""; +int wifiMode = 0; // 0: client, 1: AP (default) +int wifiTimeout = 10000; //ms + +/* Soft AP network parameters */ +char *ssidAP = "ESP-test"; +IPAddress apIP(192, 168, 4, 1); // note: update metaRefreshStr string if ip change! +IPAddress netMsk(255, 255, 255, 0); /* hostname for mDNS. Should work at least on windows. Try http://esp8266.local */ -const char *myHostname = "esp8266"; +const char *myHostname = "esplaser"; const char *metaRefreshStr = "
redirecting...
"; -/* Soft AP network parameters */ -IPAddress apIP(192, 168, 4, 1); // note: update metaRefreshStr string if ip change! -IPAddress netMsk(255, 255, 255, 0); + +unsigned long previousMillis = 0; // Web server ESP8266WebServer server(80); @@ -62,10 +68,36 @@ String formatBytes(size_t bytes) { } } +boolean writeWifiConfigFile() { + +} + +void readWifiConfigFile() { + File f = SPIFFS.open("/config.ini", "r"); + if (!f) { + Serial.println("config file open failed"); + } + Serial.println("Reading wifi config"); + String s = f.readStringUntil('\n'); + if (s.substring(0, 4) == "mode") { + s.substring(5, 6).toInt(); + } + s = f.readStringUntil('\n'); + if (s.substring(0, 4) == "ssid") { + s.substring(5).toCharArray(ssid, 50); + } + s = f.readStringUntil('\n'); + if (s.substring(0, 3) == "pwd") { + s.substring(5).toCharArray(password, 50); + } + f.close(); +} + String getContentType(String filename) { if (server.hasArg("download")) return "application/octet-stream"; else if (filename.endsWith(".htm")) return "text/html"; else if (filename.endsWith(".html")) return "text/html"; + else if (filename.endsWith(".ini")) return "text/plain"; else if (filename.endsWith(".css")) return "text/css"; else if (filename.endsWith(".js")) return "application/javascript"; else if (filename.endsWith(".png")) return "image/png"; @@ -163,6 +195,95 @@ void handleMotor(String uri) json = String(); } +void handleSsid(String uri) +{ + uri.substring(6).toCharArray(ssid, 50); + + String json = "{ \"handledSsid\":"; + json += "{\"ssid\":\"" + (String)ssid + "\"}}"; + server.send(200, "text/json", json); + json = String(); +} +void handlePwd(String uri) +{ + uri.substring(5).toCharArray(password, 50); + String json = "{ \"handledPwd\":"; + json += "{\"password\":\"" + (String)password + "\"}}"; + server.send(200, "text/json", json); + json = String(); +} +void handleWiAp(String uri) +{ + wifiMode = uri.substring(6, 7).toInt(); + String json = "{ \"handledWiAp\":"; + json += "{\"softAp\":\"" + (String)wifiMode + "\"}}"; + server.send(200, "text/json", json); + json = String(); +} + +void handleSaveConf() { + boolean success = false; + File f = SPIFFS.open("/config.ini", "w"); + if (!f) { + Serial.println("config file open failed"); + success = false; + } + else + { + Serial.println("Writing wifi config"); + f.print("mode:"); + f.println(wifiMode); + f.print("ssid:"); + f.println(ssid); + f.print("pwd:"); + f.println(password); + f.close(); + success = true; + } + if(success == true) + { + server.send(200, "text/plain", "saved config to file, reset to apply"); + } + else + { + server.send(500, "text/plain", "error saving file"); + } +} + +boolean setupWifi() { + // Serial.print("setupWifi"); + // Serial.println(wifiMode); + if (wifiMode == 0) + { + Serial.printf("Try connecting to %s\n", ssid); + WiFi.begin(ssid, password); + + previousMillis = millis(); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + if (millis() - previousMillis >= wifiTimeout) { + Serial.println("connection timedout"); + return false; + } + } + Serial.println(""); + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + return true; + } + else if (wifiMode == 1) + { + Serial.printf("Starting SoftAP %s\n", ssidAP); + WiFi.mode(WIFI_AP); + WiFi.softAP(ssidAP); + Serial.println(""); + Serial.print("SoftAP started! IP address: "); + Serial.println ( WiFi.softAPIP() ); + return true; + } +} + void setup(void) { laserSerial.begin(9600); Serial.begin(115200); @@ -179,14 +300,13 @@ void setup(void) { } //WIFI INIT - Serial.printf("Connecting to %s\n", ssid); - WiFi.mode(WIFI_AP); - WiFi.softAP(ssid, password); - - - Serial.println(""); - Serial.print("Connected! IP address: "); - Serial.println ( WiFi.softAPIP() ); + readWifiConfigFile(); + boolean wifiConnected = setupWifi(); + if (!wifiConnected) + { + wifiMode = 1; // fallback to AP mode + setupWifi(); + } // Setup MDNS responder if (!MDNS.begin(myHostname)) { @@ -201,6 +321,9 @@ void setup(void) { //SERVER INIT //list directory server.on("/listFiles", HTTP_GET, handleFileList); + //server.on("/wwc", HTTP_GET, writeWifiConfigFile); + //server.on("/rwc", HTTP_GET, readWifiConfigFile); + server.on("/saveconf", HTTP_GET, handleSaveConf); server.on("/heap", HTTP_GET, []() { String json = "{"; json += "\"heap\":" + String(ESP.getFreeHeap()); @@ -221,12 +344,28 @@ void handleNotFound() { { handleMotor(uri); return; - } + } if (uri.substring(0, 7) == "/laser/") { handleLaser(uri); return; } + if (uri.substring(0, 6) == "/ssid/") + { + + handleSsid(uri); + return; + } + if (uri.substring(0, 5) == "/pwd/") + { + handlePwd(uri); + return; + } + if (uri.substring(0, 6) == "/wiap/") + { + handleWiAp(uri); + return; + } if (!handleFileRead(server.uri())) { server.send(302, "text/html", metaRefreshStr);