You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.3 KiB
142 lines
4.3 KiB
#include <WiFi.h>
|
|
#include <ESPmDNS.h>
|
|
#include <AsyncTCP.h>
|
|
#include <ESPAsyncWebServer.h>
|
|
|
|
#include "webserver.h"
|
|
|
|
using namespace std;
|
|
|
|
Webserver::Webserver(void)
|
|
: server(80) {
|
|
}
|
|
|
|
String processor(const String& var)
|
|
{
|
|
if(var == "HELLO_FROM_TEMPLATE")
|
|
return F("Hello world!");
|
|
if(var == "FACH0_NAME")
|
|
return F("Hello world!");
|
|
if(var == "FACH1_NAME")
|
|
return F("Hello world!");
|
|
if(var == "FACH2_NAME")
|
|
return F("Hello world!");
|
|
return String();
|
|
}
|
|
|
|
const char index_html[] PROGMEM =
|
|
"<html><head><title>Vending Machine</title></head>"
|
|
"<body><h1>Vending Machine</h1>"
|
|
"<table><tr><td>%FACH0_NAME%</td><td>%FACH1_NAME%</td><td>%FACH2_NAME%</td></tr>"
|
|
"<tr><td></td><td></td><td></td></tr></table>"
|
|
"</body></html>"; // large char array, tested with 14k
|
|
|
|
void Webserver::start(void) {
|
|
startMDNS();
|
|
|
|
// respond to GET requests on URL /heap
|
|
server.on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){
|
|
request->send(200, "text/plain", String(ESP.getFreeHeap()));
|
|
});
|
|
|
|
//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("/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 += ",\"hidden\":"+String(WiFi.isHidden(i)?"true":"false");
|
|
json += "}";
|
|
}
|
|
WiFi.scanDelete();
|
|
if(WiFi.scanComplete() == -2){
|
|
WiFi.scanNetworks(true);
|
|
}
|
|
}
|
|
json += "]";
|
|
request->send(200, "text/json", json);
|
|
json = String();
|
|
});
|
|
|
|
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
|
|
request->send_P(200, "text/html", index_html, processor);
|
|
});
|
|
|
|
server.onNotFound([](AsyncWebServerRequest *request){
|
|
Serial.printf("NOT_FOUND: ");
|
|
if(request->method() == HTTP_GET)
|
|
Serial.printf("GET");
|
|
else if(request->method() == HTTP_POST)
|
|
Serial.printf("POST");
|
|
else if(request->method() == HTTP_DELETE)
|
|
Serial.printf("DELETE");
|
|
else if(request->method() == HTTP_PUT)
|
|
Serial.printf("PUT");
|
|
else if(request->method() == HTTP_PATCH)
|
|
Serial.printf("PATCH");
|
|
else if(request->method() == HTTP_HEAD)
|
|
Serial.printf("HEAD");
|
|
else if(request->method() == HTTP_OPTIONS)
|
|
Serial.printf("OPTIONS");
|
|
else
|
|
Serial.printf("UNKNOWN");
|
|
Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str());
|
|
|
|
if(request->contentLength()){
|
|
Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str());
|
|
Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength());
|
|
}
|
|
|
|
int headers = request->headers();
|
|
int i;
|
|
for(i=0;i<headers;i++){
|
|
AsyncWebHeader* h = request->getHeader(i);
|
|
Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str());
|
|
}
|
|
|
|
int params = request->params();
|
|
for(i=0;i<params;i++){
|
|
AsyncWebParameter* p = request->getParam(i);
|
|
if(p->isFile()){
|
|
Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
|
|
} else if(p->isPost()){
|
|
Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
|
|
} else {
|
|
Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
|
|
}
|
|
}
|
|
|
|
request->send(404);
|
|
});
|
|
|
|
server.begin();
|
|
Serial.println("Webserver started.");
|
|
}
|
|
|
|
void Webserver::startMDNS(void) {
|
|
// Set up mDNS responder:
|
|
// - first argument is the domain name, in this example
|
|
// the fully-qualified domain name is "esp8266.local"
|
|
// - second argument is the IP address to advertise
|
|
// we send our IP address on the WiFi network
|
|
if (!MDNS.begin("esp32")) {
|
|
Serial.println("Error setting up MDNS responder!");
|
|
while(1) {
|
|
delay(1000);
|
|
}
|
|
}
|
|
Serial.println("mDNS responder started");
|
|
|
|
// Add service to MDNS-SD
|
|
MDNS.addService("http", "tcp", 80);
|
|
}
|
|
|