1 contributor
#ifndef _MY_HTTP_H
#define _MY_HTTP_H
#include <WebServer.h>
#include "my_constants.h"
#include "my_ble.h"
#ifdef USE_OTA
#include "my_ota.h"
#include <Update.h>
#endif //USE_OTA
#define PORT 80
WebServer server(PORT);
String message="";
String page_header="<!DOCTYPE HTML><html>\n<head>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.7.2/css/all.css\" integrity=\"sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr\" crossorigin=\"anonymous\">\n <title>"+String(APPNAME)+"</title>\n<style>\nhtml{font-family:Arial;display:inline-block;margin:0px auto;text-align:left;}h2{font-size:1.5rem;}p{font-size:1.2rem;}ul,li,.prg {list-style-type: none; margin: 0; padding: 0;text-align: left;}li{display:inline-block;color:#00add6;padding-top:10px;padding-left:10px;font-size:1.5em;}.results {width: 80%;word-wrap: break-word;font-family: monospace;text-align: left;}.app {font-size:0.8rem;font-style: italic; padding-top: 20px; padding-bottom: 20px;}.dht-labels{font-size:1.0rem;vertical-align:middle;padding-bottom:15px;}\n</style>\n</head>\n<body>\n";
String page_links="<ul class=\"links\">\n<li><a href=\"/\"><i class=\"fas fa-home\"></i></a></li>\n<li><a href=\"/status\"><i class=\"fas fa-question-circle\"></i></a></li>\n<li><a href=\"/ota\"><i class=\"fas fa-toolbox\"></i></a></li>\n<li><a href=\"/config\"><i class=\"fas fa-cog\"></i></a></li>\n<li><a href=\"/json\"><i class=\"fas fa-clipboard-list\"></i></a></li>\n</ul>";
String page_footer="</body></html>";
String getMACstr() {
byte mac[6];
char macStr[6];
WiFi.macAddress(mac);
sprintf(macStr,"%02x%02x%02x", mac[3], mac[4], mac[5]);
String macStrString=macStr;
return macStrString;
}
void handleRoot() {
server.sendHeader("Connection", "close");
message = page_header;
message += page_links;
message += "<h2>esp32-"+getMACstr()+"</h2>";
message += "<p><i class=\"fas fa-clock\" style=\"color:#00add6;\"></i><span class=\"dht-labels\">Date</span> <span id=\"temperature\">"+String(acTimeStringTZ)+"</span></p>";
message += "<div class=\"results\">\n";
message += ss.str().c_str();
message += "</div>\n";
message += "<div class=\"app\">"+String(compile_date)+"</div>";
message += page_footer;
server.send(200, "text/html", message );
}
void handleJSON() {
server.sendHeader("Connection", "close");
message = "{";
message += "\"ota_name\": \"esp32-"+getMACstr()+"\",";
message += "\"uptime\": "+String(millis())+",";
message += "\"countMeasures\": "+String(countMeasures)+",";
message += "\"last_update\": \""+String(acTimeStringTZ)+"\",";
message += "\"epoch\":" +String(acTimeEpoch)+",";
message += "\"ble\": "+String(listBLEElts.str().c_str());
message += "}";
server.send(200, "text/html", String(message) );
}
void handleSTATUS() {
server.sendHeader("Connection", "close");
message = page_header;
message += page_links;
message += "<h2>esp32-"+getMACstr()+" Status</h2>";
message += "{";
message += "\"app_name\": \""+String(APPNAME)+"\",";
message += "\"app_version\": \""+String(APPVER)+"\",";
message += "\"build_date\": \""+String(compile_time)+"\",";
message += "\"mac\": \""+WiFi.macAddress()+"\",";
message += "\"ip\": \""+WiFiIP+"\",";
message += "\"ota_name\": \"esp32-"+getMACstr()+"\",";
message += "\"uptime\": "+String(millis())+",";
message += "\"countMeasures\": "+String(countMeasures)+",";
message += "\"BLEscanTime\": "+String(gScanTime)+",";
message += "\"BLEwindow\": "+String(gWindow)+",";
message += "\"BLEinterval\": "+String(gInterval)+",";
message += "\"period\": "+String(UPDATE_PERIOD)+",";
message += "\"loop_delay\": "+String(LOOP_DELAY)+",";
message += "\"last_update\": \""+String(acTimeStringTZ)+"\",";
message += "\"epoch\":" +String(acTimeEpoch);
message += "}";
message += page_footer;
server.send(200, "text/html", String(message) );
}
void handleOTA() {
server.sendHeader("Connection", "close");
//message = "";
message = page_header;
//message += "<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>";
if( 0 == strcmp(aplist[currentAPIndex].ssid,"kawifi") ) {
message += "<script src='http://"+String(mqtt_server_int)+"/jquery.min.js'></script>\n";
} else {
message += "<script src='http://"+String(mqtt_server_ext)+"/jquery.min.js'></script>\n";
}
message += page_links;
message += "<h2>esp32-"+getMACstr()+" OTA</h2>";
message += "<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>\n";
message += "Firmware:<br>\n";
message += "<input type='file' name='update'><input type='submit' value='Update Firmware'>\n";
message += "</form>\n";
message += "<div id='prg'>progress: 0%</div>\n";
message += otaScript;
message += page_footer;
server.send(200, "text/html", String(message) );
}
void handleCONFIG() {
server.sendHeader("Connection", "close");
message = page_header;
message += page_links;
message += "<h2>esp32-"+getMACstr()+" Configuration</h2>";
message += "<form action=\"\">\n";
message += "<label for=\"gInterval\">Interval:</label><br>\n";
message += "<input type=\"text\" id=\"gInterval\" name=\"gInterval\" value=\""+String(gInterval)+"\"><br>\n";
message += "<label for=\"gWindow\">Window:</label><br>\n";
message += "<input type=\"text\" id=\"gWindow\" name=\"gWindow\" value=\""+String(gWindow)+"\"><br>\n";
message += "<label for=\"gScanTime\">ScanTime:</label><br>\n";
message += "<input type=\"text\" id=\"gSc\" name=\"gScanTime\" value=\""+String(gScanTime)+"\"><br>\n";
message += "<input type=\"submit\" value=\"Submit\">\n";
message += "</form>\n";
for (uint8_t i = 0; i < server.args(); i++) {
if( String(server.argName(i)) == String("gInterval") ) {
if( gInterval != String(server.arg(i)).toInt() ) {
gInterval = String(server.arg(i)).toInt();
message += "Changing gInterval<br>";
}
} else if( String(server.argName(i)) == String("gWindow") ) {
if( gWindow != String(server.arg(i)).toInt() ) {
gWindow = String(server.arg(i)).toInt();
message += "Changing gWindow<br>";
}
} else if( String(server.argName(i)) == String("gScanTime") ) {
if( gScanTime != String(server.arg(i)).toInt() ) {
gScanTime = String(server.arg(i)).toInt();
message += "Changing gScanTime<br>";
}
}
}
message += page_footer;
server.send(200, "text/html", String(message) );
}
void handleNotFound() {
server.sendHeader("Connection", "close");
//String message = "File Not Found\n\n";
String message = page_header;
message += "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
message += page_links;
message += page_footer;
server.send(404, "text/html", message);
}
void http_set() {
server.on("/", handleRoot);
server.on("/status", handleSTATUS);
server.on("/json", handleJSON);
server.on("/config", handleCONFIG);
server.onNotFound(handleNotFound);
server.begin();
#ifdef USE_OTA
server.on("/ota", HTTP_GET, handleOTA);
server.on("/update", HTTP_POST, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
ESP.restart();
}, []() {
HTTPUpload& upload = server.upload();
upgradeInProgress=1;
if (upload.status == UPLOAD_FILE_START) {
Serial.printf("Update: %s\n", upload.filename.c_str());
if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
Update.printError(Serial);
} else {
uint8_t percent_new=(100*((float)(Update.progress())/(float)(Update.size())));
if( percent_old != percent_new ) {
Serial.printf("Update: %d%%\n", percent_new);
percent_old=percent_new;
}
}
} else if (upload.status == UPLOAD_FILE_END) {
if (Update.end(true)) { //true to set the size to the current progress
Serial.printf("Update: 100%%\n");
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
} else {
Update.printError(Serial);
}
}
});
#endif //USE_OTA
}
#endif //_MY_HTTP_H