/* https://github.com/0x1d/esp8266-laser */ #include #include #include #include #include #include #include SoftwareSerial laserSerial(14, 12, false, 256); String ssid = ""; String password = ""; int apMode = 1; // 0: client, 1: AP (default) // will be overwriten int apModeRuntime = 0; int wifiTimeout = 10000; //ms /* Soft AP network parameters */ char *ssidAP = "laserAp"; 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 = "esplaser"; const char *metaRefreshStr = "

redirecting...

"; unsigned long previousMillis = 0; // Web server ESP8266WebServer server(80); //format bytes String formatBytes(size_t bytes) { if (bytes < 1024) { return String(bytes) + "B"; } else if (bytes < (1024 * 1024)) { return String(bytes / 1024.0) + "KB"; } else if (bytes < (1024 * 1024 * 1024)) { return String(bytes / 1024.0 / 1024.0) + "MB"; } else { return String(bytes / 1024.0 / 1024.0 / 1024.0) + "GB"; } } 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"; else if (filename.endsWith(".gif")) return "image/gif"; else if (filename.endsWith(".jpg")) return "image/jpeg"; else if (filename.endsWith(".ico")) return "image/x-icon"; else if (filename.endsWith(".xml")) return "text/xml"; else if (filename.endsWith(".pdf")) return "application/x-pdf"; else if (filename.endsWith(".zip")) return "application/x-zip"; else if (filename.endsWith(".gz")) return "application/x-gzip"; return "text/plain"; } bool handleFileRead(String path) { Serial.println("handleFileRead: " + path); if (path.endsWith("/")) path += "index.html"; String contentType = getContentType(path); String pathWithGz = path + ".gz"; if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) { if (SPIFFS.exists(pathWithGz)) path += ".gz"; File file = SPIFFS.open(path, "r"); size_t sent = server.streamFile(file, contentType); file.close(); return true; } return false; } void handleFileList() { if (!server.hasArg("dir")) { server.send(500, "text/plain", "BAD ARGS"); return; } String path = server.arg("dir"); Serial.println("handleFileList: " + path); Dir dir = SPIFFS.openDir(path); path = String(); String output = "["; while (dir.next()) { File entry = dir.openFile("r"); if (output != "[") output += ','; bool isDir = false; output += "{\"type\":\""; output += (isDir) ? "dir" : "file"; output += "\",\"name\":\""; output += String(entry.name()).substring(1); output += "\"}"; entry.close(); } output += "]"; server.send(200, "text/json", output); } void handleLaser(String uri) { String laserValue = uri.substring(7); String msg = "AT SLV "; msg += laserValue; Serial.println("Sent to Laser: " + msg); laserSerial.println(msg); String json = "{ \"handledLaser\":"; json += "{\"value\":\"" + laserValue + "\"}}"; //server.send(200, "text/plain", "blub"); server.send(200, "text/json", json); json = String(); } void handleMotor(String uri) { String motorNr = uri.substring(7, 8); String motorValue = uri.substring(9); String msg = "AT SMS "; msg += motorNr; msg += " "; msg += motorValue; Serial.println("Sent to Laser: " + msg); laserSerial.println(msg); String json = "{ \"handledMotor\": "; json += "{ \"motor\":\"" + motorNr + "\", "; json += "\"value\":\"" + motorValue + "\" }}"; //server.send(200, "text/plain", "blub"); server.send(200, "text/json", json); json = String(); } void handleSsid(String uri) { ssid = uri.substring(6); String json = "{ \"handledSsid\":"; json += "{\"ssid\":\"" + (String)ssid + "\"}}"; server.send(200, "text/json", json); json = String(); } void handlePwd(String uri) { password = uri.substring(5); String json = "{ \"handledPwd\":"; json += "{\"password\":\"" + (String)password + "\"}}"; server.send(200, "text/json", json); json = String(); } void handleApmode(String uri) { apMode = uri.substring(8, 9).toInt(); apModeRuntime = apMode; String json = "{ \"handledApmode\":"; json += "{\"apMode\":\"" + (String)apMode + "\"}}"; server.send(200, "text/json", json); json = String(); } bool saveConfigFile() { StaticJsonBuffer<200> jsonBuffer; JsonObject& json = jsonBuffer.createObject(); json["apMode"] = apMode; json["SSID"] = ssid; json["Password"] = password; File configFile = SPIFFS.open("/config.json", "w"); if (!configFile) { Serial.println("Failed to open config file for writing"); return false; } json.printTo(configFile); return true; } void handleSaveConf() { bool success = saveConfigFile(); if (success) { server.send(200, "text/plain", "saved config to file,
reset or /resetwifi to apply settings"); } else { server.send(500, "text/plain", "error saving file"); } } boolean readConfigFile() { Serial.println("Reading config.json"); File configFile = SPIFFS.open("/config.json", "r"); if (!configFile) { Serial.println("Failed to open config file"); return false; } size_t size = configFile.size(); if (size > 1024) { Serial.println("Config file size is too large"); return false; } // Allocate a buffer to store contents of the file. std::unique_ptr buf(new char[size]); configFile.readBytes(buf.get(), size); StaticJsonBuffer<200> jsonBuffer; JsonObject& json = jsonBuffer.parseObject(buf.get()); if (!json.success()) { Serial.println("Failed to parse config file"); return false; } apMode = json["apMode"]; apModeRuntime = apMode; const char* tSsid = json["SSID"]; const char* tPwd = json["Password"]; ssid = tSsid; password = tPwd; Serial.print("SSID: "); Serial.println(ssid); Serial.print("PW: "); Serial.println(password); return true; } boolean setupWifi() { Serial.print("setupWifi apMode="); Serial.println(apModeRuntime); if (apModeRuntime == 0) { Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid.c_str(), password.c_str()); previousMillis = millis(); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if (millis() - previousMillis >= wifiTimeout) { Serial.println(""); Serial.println("connection timedout"); return false; } } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); return true; } else { Serial.printf("Starting SoftAP %s\n", ssidAP); WiFi.mode(WIFI_AP); WiFi.softAP(ssidAP); Serial.print("SoftAP started! IP address: "); Serial.println ( WiFi.softAPIP() ); return true; } } void setup(void) { laserSerial.begin(9600); Serial.begin(115200); Serial.print("\n"); SPIFFS.begin(); // { // Dir dir = SPIFFS.openDir("/"); // while (dir.next()) { // String fileName = dir.fileName(); // size_t fileSize = dir.fileSize(); // Serial.printf("FS File: %s, size: %s\n", fileName.c_str(), formatBytes(fileSize).c_str()); // } // Serial.printf("\n"); // } //WIFI INIT WiFi.disconnect(); delay(100); if (!readConfigFile()) { Serial.println("reading wifi config failed, start SoftAP"); apModeRuntime = 1; } delay(100); if (!setupWifi()) { Serial.println("connect failed, start SoftAP"); apModeRuntime = 1; // fallback to AP mode setupWifi(); } // Setup MDNS responder if (!MDNS.begin(myHostname)) { Serial.println("Error setting up MDNS responder!"); } else { Serial.println("mDNS responder started"); // Add service to MDNS-SD MDNS.addService("http", "tcp", 80); } //SERVER INIT //list directory server.on("/listFiles", HTTP_GET, handleFileList); server.on("/saveconf", HTTP_GET, handleSaveConf); server.on("/resetwifi", HTTP_GET, setupWifi); server.on("/heap", HTTP_GET, []() { String json = "{"; json += "\"heap\":" + String(ESP.getFreeHeap()); json += "}"; server.send(200, "text/json", json); json = String(); }); server.onNotFound(handleNotFound); server.begin(); Serial.println("HTTP server started"); } void handleNotFound() { String uri = server.uri(); Serial.print("unhandled uri:"); Serial.println(uri); if (uri.substring(0, 7) == "/motor/") { 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, 8) == "/apmode/") { handleApmode(uri); return; } if (uri.substring(0,12) == "/config.json") { server.send(403, "text/plain", "Forbidden"); return; } if (!handleFileRead(server.uri())) { server.send(302, "text/html", metaRefreshStr); // server.send(302, "text/plain", "blub"); } } void loop(void) { server.handleClient(); }