#include "app.h" #include "SPIFFS.h" #include "ESPAsyncWebServer.h" #include "AsyncJson.h" #include "ArduinoJson.h" #include "settings.h" #include "device.h" AsyncWebServer server(80); void setupSettingsGet(); void setupSettingsPost(); void setupWifiScan(); void setupWifiConnect(); void setupCurrentImage(); void setupApp() { Serial.println("setup configure"); if (!SPIFFS.begin()) { Serial.println("An Error has occurred while mounting SPIFFS"); return; } // @see https://github.com/me-no-dev/ESPAsyncWebServer // @see https://arduinojson.org/v6/assistant/ // serve static files server .serveStatic("/", SPIFFS, "/dist/") .setDefaultFile("index.html") .setCacheControl("max-age=600"); setupSettingsGet(); setupSettingsPost(); setupWifiScan(); setupWifiConnect(); setupCurrentImage(); // TODO response server.on("/stats", HTTP_GET, [](AsyncWebServerRequest *request) { AsyncResponseStream *response = request->beginResponseStream("application/json"); DynamicJsonDocument root(1024); root["heap"] = ESP.getFreeHeap(); root["wifi"] = WiFi.SSID(); root["sleep"] = 97; serializeJson(root, *response); request->send(response); }); // CORS //DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); server.begin(); Serial.println("setup configure - done"); } void setupSettingsGet() { server.on("/api/settings", HTTP_GET, [](AsyncWebServerRequest *request) { AsyncResponseStream *response = request->beginResponseStream("application/json"); DynamicJsonDocument root(1024); //root["wifi_ssid"] = NVS.getString("wifi_ssid"); root["device_mode"] = NVS.getString("device_mode"); root["device_rotation"] = 0; root["cloud_server"] = NVS.getString("cloud_server"); serializeJson(root, *response); request->send(response); }); } void setupSettingsPost() { server.on("/api/settings", HTTP_PUT, [](AsyncWebServerRequest *request) { /* nothing and dont remove it */ }, NULL, [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { DynamicJsonDocument doc(1024); DeserializationError error = deserializeJson(doc, data); if (error) { Serial.print(F("deserializeJson() failed with code ")); Serial.println(error.c_str()); request->send(404, "text/plain", ""); } else { if (doc.containsKey("device_mode")) { NVS.setString("device_mode", doc["device_mode"]); } if (doc.containsKey("cloud_server")) { NVS.setString("cloud_server", doc["cloud_server"]); //Serial.println(doc["cloud_server"].as()); } request->send(200, "application/ld+json; charset=utf-8", "{}"); } }); } /** * @todo */ void setupCurrentImage() { server.on("/current-image", HTTP_GET, [](AsyncWebServerRequest *request) { Serial.println("/current-image"); request->send(SPIFFS, "/currentImage.bin", "image/x-bmp"); }); /* server.on("/current-image2", HTTP_GET, [](AsyncWebServerRequest *request) { AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/currentImage.bin", "image/x-bmp"); // image/x-bmp | image/vnd.wap.wbmp //response->addHeader("Content-Encoding", "gzip"); //response->addHeader("Content-Disposition", "inline; filename=\"image.wbmp\""); request->send(response); }); */ } /** * @todo */ void setupWifiScan() { //First request will return 0 results unless you start scan from somewhere else (loop/setup) //Do not request more often than 3-5 seconds server.on("/api/wifi/scan", HTTP_GET, [](AsyncWebServerRequest *request) { String json = "["; int n = WiFi.scanComplete(); if (n == -2) { WiFi.scanNetworks(true); } else if (n) { for (int i = 0; i < n; ++i) { if (i) { json += ","; } json += "{"; json += "\"rssi\":" + String(WiFi.RSSI(i)); json += ",\"ssid\":\"" + WiFi.SSID(i) + "\""; json += ",\"bssid\":\"" + WiFi.BSSIDstr(i) + "\""; json += ",\"channel\":" + String(WiFi.channel(i)); json += ",\"secure\":" + String(WiFi.encryptionType(i)); json += "}"; } WiFi.scanDelete(); if (WiFi.scanComplete() == -2) { WiFi.scanNetworks(true); } } json += "]"; request->send(200, "application/json", json); json = String(); }); } /** * @todo */ void setupWifiConnect() { server.on("/api/wifi/connect", HTTP_PUT, [](AsyncWebServerRequest *request) { /* nothing and dont remove it */ }, NULL, [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { DynamicJsonDocument doc(1024); Serial.println("/api/wifi/connect"); DeserializationError error = deserializeJson(doc, data); if (error) { Serial.print(F("deserializeJson() failed with code ")); Serial.println(error.c_str()); request->send(404, "text/plain", ""); } else { if (doc.containsKey("user")) { //NVS.setString("device_mode", doc["device_mode"]); } if (doc.containsKey("password")) { //NVS.setString("cloud_server", doc["cloud_server"]); //Serial.println(doc["cloud_server"].as()); } request->send(200, "application/ld+json; charset=utf-8", "{}"); } }); }