From 08f7c6025f22d9b6203d26810d572beffd6bf43d Mon Sep 17 00:00:00 2001 From: technyon Date: Mon, 4 Apr 2022 21:27:27 +0200 Subject: [PATCH] use WebServer instead of WifiServer --- WebCfgServer.cpp | 365 ++++++++++++++++++++--------------------------- WebCfgServer.h | 16 +-- main.cpp | 4 +- 3 files changed, 161 insertions(+), 224 deletions(-) diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index ea70c16..f0635fc 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -3,7 +3,7 @@ #include "PreferencesKeys.h" WebCfgServer::WebCfgServer(NukiWrapper* nuki, Network* network, Preferences* preferences) -: _wifiServer(80), +: server(80), _nuki(nuki), _network(network), _preferences(preferences) @@ -12,212 +12,151 @@ WebCfgServer::WebCfgServer(NukiWrapper* nuki, Network* network, Preferences* pre void WebCfgServer::initialize() { - _wifiServer.begin(); + server.on("/", [&]() { +// if (!server.authenticate(www_username, www_password)) { +// return server.requestAuthentication(); +// } + String response = ""; + serveHtml(response); + server.send(200, "text/html", response); + }); + server.on("/method=get", [&]() { +// if (!server.authenticate(www_username, www_password)) { +// return server.requestAuthentication(); +// } + processArgs(); + server.send(200, "text/plain", "Configuration saved ... restarting."); + }); + + server.begin(); +} + +void WebCfgServer::processArgs() +{ + bool configChanged = false; + bool clearCredentials = false; + + int count = server.args(); + for(int index = 0; index < count; index++) + { + String key = server.argName(index); + String value = server.arg(index); + +// Serial.print(key); +// Serial.print(" = "); +// Serial.println(value); + + if(key == "MQTTSERVER") + { + _preferences->putString(preference_mqtt_broker, value); + configChanged = true; + } + else if(key == "MQTTPORT") + { + _preferences->putInt(preference_mqtt_broker_port, value.toInt()); + configChanged = true; + } + else if(key == "MQTTUSER") + { + if(value == "#") + { + clearCredentials = true; + } + else + { + _preferences->putString(preference_mqtt_user, value); + configChanged = true; + } + } + else if(key == "MQTTPASS") + { + if(value != "*") + { + _preferences->putString(preference_mqtt_password, value); + configChanged = true; + } + } + else if(key == "MQTTPATH") + { + _preferences->putString(preference_mqtt_path, value); + configChanged = true; + } + else if(key == "LSTINT") + { + _preferences->putInt(preference_query_interval_lockstate, value.toInt()); + configChanged = true; + } + else if(key == "BATINT") + { + _preferences->putInt(preference_query_interval_battery, value.toInt()); + configChanged = true; + } + } + + if(clearCredentials) + { + _preferences->putString(preference_mqtt_user, ""); + _preferences->putString(preference_mqtt_password, ""); + configChanged = true; + } + + if(configChanged) + { + _enabled = false; + _preferences->end(); + Serial.println(F("Restarting")); + vTaskDelay( 200 / portTICK_PERIOD_MS); + ESP.restart(); + } } void WebCfgServer::update() { if(!_enabled) return; - bool configChanged = false; - - // Create a client connections - WiFiClient client = _wifiServer.available(); - - if (client) - { - int index = 0; - char message[500]; - - - 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; - bool clearCredentials = false; - while (token != NULL) - { - if(lastToken != NULL) - { - TokenType lastTokenType = getParameterType(lastToken); - TokenType tokenType = getParameterType(token); - - if(lastTokenType == TokenType::MqttServer && tokenType == TokenType::None) - { - _preferences->putString(preference_mqtt_broker, token); - configChanged = true; - } - else if(lastTokenType == TokenType::MqttPort && tokenType == TokenType::None) - { - _preferences->putInt(preference_mqtt_broker_port, String(token).toInt()); - configChanged = true; - } - else if(lastTokenType == TokenType::MqttUser && tokenType == TokenType::None) - { - char* c = "%23"; - if(strcmp(token, c) == 0) - { - clearCredentials = true; - } - else - { - _preferences->putString(preference_mqtt_user, token); - configChanged = true; - } - } - else if(lastTokenType == TokenType::MqttPass && tokenType == TokenType::None) - { - char* c = "*"; - if(strcmp(token, c) != 0) - { - _preferences->putString(preference_mqtt_password, token); - configChanged = true; - } - } - else if(lastTokenType == TokenType::MqttPath && tokenType == TokenType::None) - { - _preferences->putString(preference_mqtt_path, token); - configChanged = true; - } - else if(lastTokenType == TokenType::QueryIntervalLockstate && tokenType == TokenType::None) - { - _preferences->putInt(preference_query_interval_lockstate, String(token).toInt()); - configChanged = true; - } - else if(lastTokenType == TokenType::QueryIntervalBattery && tokenType == TokenType::None) - { - _preferences->putInt(preference_query_interval_battery, String(token).toInt()); - configChanged = true; - } - } - lastToken = token; - token = strtok(NULL, "?=&"); - } - - if(clearCredentials) - { - _preferences->putString(preference_mqtt_user, ""); - _preferences->putString(preference_mqtt_password, ""); - configChanged = true; - } - - if(configChanged) - { - _enabled = false; - _preferences->end(); - Serial.println(F("Restarting")); - vTaskDelay( 200 / portTICK_PERIOD_MS); - ESP.restart(); - } - } - + server.handleClient(); vTaskDelay(200 / portTICK_PERIOD_MS); - } -void WebCfgServer::serveHtml(WiFiClient &client) +void WebCfgServer::serveHtml(String& response) { - 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(""); + response.concat("\n"); + response.concat("\n"); + response.concat("NUKI Hub\n"); + response.concat("\n"); + response.concat("\n"); + response.concat("

Info

\n"); - client.println("

"); - client.println("

Info

"); - client.println(""); - printParameter(client, "Paired", _nuki->isPaired() ? " Yes" : " No"); - printParameter(client, "MQTT Connected", _network->isMqttConnected() ? " Yes" : " No"); - client.println("


"); + response.concat(""); + printParameter(response, "Paired", _nuki->isPaired() ? " Yes" : " No"); + printParameter(response, "MQTT Connected", _network->isMqttConnected() ? " Yes" : " No"); + response.concat("


"); - client.println("
"); + response.concat(""); - client.println("

Configuration

"); - client.println(""); - printInputField(client, "MQTTSERVER", "MQTT Broker", _preferences->getString(preference_mqtt_broker).c_str(), 100); - printInputField(client, "MQTTPORT", "MQTT Broker port", _preferences->getInt(preference_mqtt_broker_port), 5); - printInputField(client, "MQTTUSER", "MQTT User (# to clear)", _preferences->getString(preference_mqtt_user).c_str(), 30); - printInputField(client, "MQTTPASS", "MQTT Password", "*", 30); - printInputField(client, "MQTTPATH", "MQTT Path", _preferences->getString(preference_mqtt_path).c_str(), 180); - printInputField(client, "LSTINT", "Query interval lock state (seconds)", _preferences->getInt(preference_query_interval_lockstate), 10); - printInputField(client, "BATINT", "Query interval battery (seconds)", _preferences->getInt(preference_query_interval_battery), 10); - client.println("
"); + response.concat("

Configuration

"); + response.concat(""); + printInputField(response, "MQTTSERVER", "MQTT Broker", _preferences->getString(preference_mqtt_broker).c_str(), 100); + printInputField(response, "MQTTPORT", "MQTT Broker port", _preferences->getInt(preference_mqtt_broker_port), 5); + printInputField(response, "MQTTUSER", "MQTT User (# to clear)", _preferences->getString(preference_mqtt_user).c_str(), 30); + printInputField(response, "MQTTPASS", "MQTT Password", "*", 30); + printInputField(response, "MQTTPATH", "MQTT Path", _preferences->getString(preference_mqtt_path).c_str(), 180); + printInputField(response, "LSTINT", "Query interval lock state (seconds)", _preferences->getInt(preference_query_interval_lockstate), 10); + printInputField(response, "BATINT", "Query interval battery (seconds)", _preferences->getInt(preference_query_interval_battery), 10); + response.concat("
"); - client.println("
"); + response.concat("
"); - client.println("
"); + response.concat(""); - client.println("
"); - - client.println(""); - client.println(""); + response.concat("
"); +// + response.concat("\n"); + response.concat("\n"); } -TokenType WebCfgServer::getParameterType(char *&token) -{ - if (strcmp(token, "MQTTSERVER") == 0) - { - return TokenType::MqttServer; - } - if (strcmp(token, "LSTINT") == 0) - { - return TokenType::QueryIntervalLockstate; - } - if (strcmp(token, "BATINT") == 0) - { - return TokenType::QueryIntervalBattery; - } - if (strcmp(token, "MQTTPORT") == 0) - { - return TokenType::MqttPort; - } - if (strcmp(token, "MQTTUSER") == 0) - { - return TokenType::MqttUser; - } - if (strcmp(token, "MQTTPASS") == 0) - { - return TokenType::MqttPass; - } - if (strcmp(token, "MQTTPATH") == 0) - { - return TokenType::MqttPath; - } - - return TokenType::None; -} - -void WebCfgServer::printInputField(WiFiClient &client, +void WebCfgServer::printInputField(String& response, const char *token, const char *description, const char *value, @@ -227,23 +166,23 @@ void WebCfgServer::printInputField(WiFiClient &client, itoa(maxLength, maxLengthStr, 10); - client.println(""); - client.print(""); - client.print(description); - client.print(""); - client.print(""); - client.print(" "); - client.print(""); - client.println(""); + response.concat(""); + response.concat(""); + response.concat(description); + response.concat(""); + response.concat(""); + response.concat(" "); + response.concat(""); + response.concat(""); } -void WebCfgServer::printInputField(WiFiClient &client, +void WebCfgServer::printInputField(String& response, const char *token, const char *description, const int value, @@ -251,18 +190,18 @@ void WebCfgServer::printInputField(WiFiClient &client, { char valueStr[20]; itoa(value, valueStr, 10); - printInputField(client, token, description, valueStr, maxLength); + printInputField(response, token, description, valueStr, maxLength); } -void WebCfgServer::printParameter(WiFiClient &client, const char *description, const char *value) +void WebCfgServer::printParameter(String& response, const char *description, const char *value) { - client.println(""); - client.print(""); - client.print(description); - client.print(""); - client.print(""); - client.print(value); - client.print(""); - client.println(""); + response.concat(""); + response.concat(""); + response.concat(description); + response.concat(""); + response.concat(""); + response.concat(value); + response.concat(""); + response.concat(""); } diff --git a/WebCfgServer.h b/WebCfgServer.h index c360a4a..e076429 100644 --- a/WebCfgServer.h +++ b/WebCfgServer.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #include "NukiWrapper.h" #include "Network.h" @@ -28,16 +28,14 @@ public: private: - void serveHtml(WiFiClient& client); - void printInputField(WiFiClient& client, const char* token, const char* description, const char* value, size_t maxLength); - void printInputField(WiFiClient& client, const char* token, const char* description, const int value, size_t maxLength); + void processArgs(); + void serveHtml(String& response); + void printInputField(String& response, const char* token, const char* description, const char* value, size_t maxLength); + void printInputField(String& response, const char* token, const char* description, const int value, size_t maxLength); - void printParameter(WiFiClient& client, const char* description, const char* value); + void printParameter(String& response, const char* description, const char* value); - - TokenType getParameterType(char*& token); - - WiFiServer _wifiServer; + WebServer server; NukiWrapper* _nuki; Network* _network; Preferences* _preferences; diff --git a/main.cpp b/main.cpp index ca526be..031aced 100644 --- a/main.cpp +++ b/main.cpp @@ -31,8 +31,8 @@ void nukiTask(void *pvParameters) void setupTasks() { - xTaskCreate(networkTask, "ntw", 8192, NULL, 1, NULL); - xTaskCreate(nukiTask, "nuki", 16384, NULL, 1, NULL); + xTaskCreate(networkTask, "ntw", 16384, NULL, 1, NULL); + xTaskCreate(nukiTask, "nuki", 8192, NULL, 1, NULL); } uint32_t getRandomId()