From 5941a98f7efd347bd9432942804ab63dad122819 Mon Sep 17 00:00:00 2001 From: technyon Date: Sun, 27 Mar 2022 09:41:19 +0200 Subject: [PATCH] add simple web server for configuration --- CMakeLists.txt | 1 + WebCfgServer.cpp | 140 +++++++++++++++++++++++++++++++++++++++++++++++ WebCfgServer.h | 28 ++++++++++ main.cpp | 9 +++ 4 files changed, 178 insertions(+) create mode 100644 WebCfgServer.cpp create mode 100644 WebCfgServer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b9ae43..ddf7073 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ file(GLOB SRCFILES Network.cpp Nuki.cpp MqttTopics.h + WebCfgServer.cpp lib/ESP32_BLE_Arduino-1.0.1/src/*.cpp lib/ESP32_BLE_Arduino-1.0.1/src/*.h lib/WiFiManager/WiFiManager.cpp diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp new file mode 100644 index 0000000..c343340 --- /dev/null +++ b/WebCfgServer.cpp @@ -0,0 +1,140 @@ +#include "WebCfgServer.h" +#include + +WebCfgServer::WebCfgServer() +: _wifiServer(80) +{} + + +void WebCfgServer::initialize() +{ + _wifiServer.begin(); +} + +void WebCfgServer::update() +{ + // Create a client connections + WiFiClient client = _wifiServer.available(); + + if (client) + { + int index = 0; + char message[200]; + + while (client.connected()) + { + if (client.available()) + { + char c = client.read(); + + //read char by char HTTP request + if (index < sizeof(message) - 1) + { + message[index] = c; + index++; + } + message[index] = 0; + + //if HTTP request has ended + if (c == '\n') + { + serveHtml(client); + vTaskDelay( 5 / portTICK_PERIOD_MS); + //stopping client + client.stop(); + } + } + } + + char *token = strtok(message, "?=&"); + char *lastToken = NULL; + + bool configChanged = false; + while (token != NULL) + { + if(lastToken != NULL) + { + TokenType lastTokenType = getParameterType(lastToken); + TokenType tokenType = getParameterType(token); + + if(lastTokenType == TokenType::MQTT_SERVER && tokenType == TokenType::NONE) + { + configChanged = true; + Serial.print("### "); + Serial.println(token); +// strcpy(_configuration->mqttServerAddress, token); + } + } + lastToken = token; + token = strtok(NULL, "?=&"); + } +// +// if(configChanged) +// { +// _configuration->writeEeprom(); +// _enabled = false; +// } + } + +} + +void WebCfgServer::serveHtml(WiFiClient &client) +{ + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println(); + + client.println(""); + client.println(""); + client.println("NUKI Hub"); + client.println(""); + client.println(""); + + client.println("
"); + + client.print("MQTT Server:
"); + +// client.print("DNS Server: dnsServerAddress); +// client.println("\" NAME=\"DNSSERVER\" SIZE=\"25\" MAXLENGTH=\"16\">
"); +// +// client.print("Gateway: gatewayAddress); +// client.println("\" NAME=\"GATEWAY\" SIZE=\"25\" MAXLENGTH=\"16\">
"); +// +// client.print("IP Address: ipAddress); +// client.println("\" NAME=\"IPADDRESS\" SIZE=\"25\" MAXLENGTH=\"16\">
"); +// +// client.print("Subnet mask: subnetMask); +// client.println("\" NAME=\"SUBNET\" SIZE=\"25\" MAXLENGTH=\"16\">
"); +// +// client.print("MQTT publish interval (ms): mqttPublishInterval); +// client.println("\" NAME=\"INTERVAL\" SIZE=\"25\" MAXLENGTH=\"6\">
"); + + client.println(""); + + client.println("
"); + + client.println("
"); + + client.println(""); + client.println(""); + + + +} + +TokenType WebCfgServer::getParameterType(char *&token) +{ + if (strcmp(token, "MQTTSERVER") == 0) + { + return TokenType::MQTT_SERVER; + } + + return TokenType::NONE; +} diff --git a/WebCfgServer.h b/WebCfgServer.h new file mode 100644 index 0000000..182b055 --- /dev/null +++ b/WebCfgServer.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +enum class TokenType +{ + NONE, + MQTT_SERVER, +}; + +class WebCfgServer +{ +public: + WebCfgServer(); + ~WebCfgServer() = default; + + void initialize(); + void update(); + + +private: + void serveHtml(WiFiClient& client); + TokenType getParameterType(char*& token); + + WiFiServer _wifiServer; + + bool _enabled = true; +}; \ No newline at end of file diff --git a/main.cpp b/main.cpp index ea2f83f..b0808cc 100644 --- a/main.cpp +++ b/main.cpp @@ -1,18 +1,22 @@ #include "Arduino.h" #include "Network.h" #include "Nuki.h" +#include "WebCfgServer.h" #include #define ESP32 Network* network; +WebCfgServer* webCfgServer; Nuki* nuki; +Preferences* preferences; void networkTask(void *pvParameters) { while(true) { network->update(); + webCfgServer->update(); } } @@ -32,10 +36,15 @@ void setupTasks() void setup() { + preferences = new Preferences(); + preferences->begin("nukihub", false); network = new Network(); + webCfgServer = new WebCfgServer(); nuki = new Nuki("Main Door", 2020001, network); network->initialize(); + webCfgServer->initialize(); + nuki->initialize(); setupTasks();