BLEBeaconScan / my_http.h /
d0ba48c 5 years ago
1 contributor
197 lines | 8.673kb
#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:center;}h2{font-size:2.0rem;}p{font-size:3.0rem;}ul,li {list-style-type: none; margin: 0; padding: 0;text-align: left;}li { display: inline-block; color:#00add6;padding-left: 10px; }.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=\"/json\"><i class=\"fas fa-clipboard-list\"></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</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 += "<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_links;
  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 += "<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 += "\"period\": "+String(UPDATE_PERIOD)+",";
  message += "\"loop_delay\": "+String(LOOP_DELAY)+",";
  message += "\"last_update\": \""+String(acTimeStringTZ)+"\",";
  message += "\"epoch\":" +String(acTimeEpoch);
  message += "}";
  message += page_links;
  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 += "<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_links;
  message += page_footer;
  server.send(200, "text/html", String(message) );
}
void handleCONFIG() {
  server.sendHeader("Connection", "close");
  message = page_header;
  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_links;
  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 Success: %u\nRebooting...\n", upload.totalSize);
      } else {
        Update.printError(Serial);
      }
    }
  });
#endif //USE_OTA
}
#endif //_MY_HTTP_H