#define DEBUG_SERIAL //uncomment for Serial debugging statements #ifdef DEBUG_SERIAL #define DEBUG_BEGIN Serial.begin(115200) #define DEBUG_PRINT(x) Serial.println(x) #else #define DEBUG_PRINT(x) #define DEBUG_BEGIN #endif //includes #include #include #if defined(ESP8266) #include #include #include #include #elif defined(ESP32) #include #include #include #include #else #error "Unsupported board class" #endif #include #if defined(ESP8266) #define DEVICE_NAME "ESP8266 DEVICE" #elif defined(ESP32) #define DEVICE_NAME "ESP32 DEVICE" #endif //const char *metaRefreshStr = "redirecting..."; const char *metaRefreshStr = "redirecting..."; //server objects #if defined(ESP8266) ESP8266WebServer server(80); #elif defined(ESP32) WebServer server(80); #endif DNSServer dnsServer; PersWiFiManager persWM(server, dnsServer); ////// Sample program data int x; String y; //code from fsbrowser example, consolidated. bool handleFileRead(String path) { DEBUG_PRINT("handlefileread" + path); if (path.endsWith("/")) path += "index.htm"; String contentType; if (path.endsWith(".htm") || path.endsWith(".html")) contentType = "text/html"; else if (path.endsWith(".css")) contentType = "text/css"; else if (path.endsWith(".js")) contentType = "application/javascript"; else if (path.endsWith(".png")) contentType = "image/png"; else if (path.endsWith(".gif")) contentType = "image/gif"; else if (path.endsWith(".jpg")) contentType = "image/jpeg"; else if (path.endsWith(".ico")) contentType = "image/x-icon"; else if (path.endsWith(".xml")) contentType = "text/xml"; else if (path.endsWith(".pdf")) contentType = "application/x-pdf"; else if (path.endsWith(".zip")) contentType = "application/x-zip"; else if (path.endsWith(".gz")) contentType = "application/x-gzip"; else if (path.endsWith(".json")) contentType = "application/json"; else contentType = "text/plain"; //split filepath and extension String prefix = path, ext = ""; int lastPeriod = path.lastIndexOf('.'); if (lastPeriod >= 0) { prefix = path.substring(0, lastPeriod); ext = path.substring(lastPeriod); } //look for smaller versions of file //minified file, good (myscript.min.js) if (SPIFFS.exists(prefix + ".min" + ext)) path = prefix + ".min" + ext; //gzipped file, better (myscript.js.gz) if (SPIFFS.exists(prefix + ext + ".gz")) path = prefix + ext + ".gz"; //min and gzipped file, best (myscript.min.js.gz) if (SPIFFS.exists(prefix + ".min" + ext + ".gz")) path = prefix + ".min" + ext + ".gz"; if (SPIFFS.exists(path)) { DEBUG_PRINT("sending file " + path); File file = SPIFFS.open(path, "r"); if (server.hasArg("download")) server.sendHeader("Content-Disposition", " attachment;"); if (server.uri().indexOf("nocache") < 0) server.sendHeader("Cache-Control", " max-age=172800"); //optional alt arg (encoded url), server sends redirect to file on the web if (WiFi.status() == WL_CONNECTED && server.hasArg("alt")) { server.sendHeader("Location", server.arg("alt"), true); server.send ( 302, "text/plain", ""); } else { //server sends file size_t sent = server.streamFile(file, contentType); } file.close(); return true; } //if SPIFFS.exists return false; } //bool handleFileRead void setup() { DEBUG_BEGIN; //for terminal debugging DEBUG_PRINT(); //allows serving of files from SPIFFS SPIFFS.begin(); persWM.begin(); //reset saved settings, clears WiFi credentials e.g. for testing //persWM.resetSettings(); //serve files from SPIFFS server.onNotFound([]() { if (!handleFileRead(server.uri())) { server.sendHeader("Cache-Control", " max-age=172800"); server.send(302, "text/html", metaRefreshStr); } }); //server.onNotFound //handles commands from webpage, sends live data in JSON format server.on("/api", []() { DEBUG_PRINT("server.on /api"); if (server.hasArg("x")) { x = server.arg("x").toInt(); DEBUG_PRINT(String("x: ")+x); } //if if (server.hasArg("y")) { y = server.arg("y"); DEBUG_PRINT("y: "+y); } //if //build json object of program data StaticJsonBuffer<200> jsonBuffer; JsonObject &json = jsonBuffer.createObject(); json["x"] = x; json["y"] = y; char jsonchar[200]; json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece server.send(200, "application/json", jsonchar); }); //server.on api //SSDP makes device visible on windows network server.on("/description.xml", HTTP_GET, []() { SSDP.schema(server.client()); }); SSDP.setSchemaURL("description.xml"); SSDP.setHTTPPort(80); SSDP.setName(DEVICE_NAME); SSDP.setURL("/"); SSDP.setDeviceType("upnp:rootdevice"); SSDP.begin(); server.begin(); DEBUG_PRINT("setup complete."); } //void setup void loop() { dnsServer.processNextRequest(); server.handleClient(); // do stuff with x and y } //void loop