123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #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 <PersWiFiManager.h>
- #include <ArduinoJson.h>
- #if defined(ESP8266)
- #include <ESP8266WiFi.h>
- #include <ESP8266SSDP.h>
- #include <ESP8266WebServer.h>
- #include <FS.h>
- #elif defined(ESP32)
- #include <WiFi.h>
- #include <ESP32SSDP.h>
- #include <WebServer.h>
- #include <SPIFFS.h>
- #else
- #error "Unsupported board class"
- #endif
- #include <DNSServer.h>
- #if defined(ESP8266)
- #define DEVICE_NAME "ESP8266 DEVICE"
- #elif defined(ESP32)
- #define DEVICE_NAME "ESP32 DEVICE"
- #endif
- //const char *metaRefreshStr = "<head><meta http-equiv=\"refresh\" content=\"1; url=/\" /></head><body><a href=\"/\">redirecting...</a></body>";
- const char *metaRefreshStr = "<script>window.location='/'</script><a href='/'>redirecting...</a>";
- //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
|