From 90b47507d25554ae93aed8f69d6749bcf5397254 Mon Sep 17 00:00:00 2001 From: technyon Date: Sun, 3 Apr 2022 15:10:29 +0200 Subject: [PATCH] allow to configure mqtt credentials --- Network.cpp | 37 +++++++++++++++++++++++++++++++++++-- Network.h | 6 ++++-- PreferencesKeys.h | 2 ++ WebCfgServer.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- WebCfgServer.h | 2 ++ main.cpp | 2 +- 6 files changed, 88 insertions(+), 6 deletions(-) diff --git a/Network.cpp b/Network.cpp index 3102bdd..33e69cf 100644 --- a/Network.cpp +++ b/Network.cpp @@ -63,6 +63,26 @@ void Network::initialize() _preferences->putString(preference_mqtt_path, _mqttPath); } + String mqttUser = _preferences->getString(preference_mqtt_user); + if(mqttUser.length() > 0) + { + size_t len = mqttUser.length(); + for(int i=0; i < len; i++) + { + _mqttUser[i] = mqttUser.charAt(i); + } + } + + String mqttPass = _preferences->getString(preference_mqtt_password); + if(mqttPass.length() > 0) + { + size_t len = mqttPass.length(); + for(int i=0; i < len; i++) + { + _mqttPass[i] = mqttPass.charAt(i); + } + } + Serial.print(F("MQTT Broker: ")); Serial.print(_mqttBrokerAddr); Serial.print(F(":")); @@ -77,8 +97,21 @@ bool Network::reconnect() while (!_mqttClient.connected() && millis() > _nextReconnect) { Serial.println("Attempting MQTT connection"); - // Attempt to connect - if (_mqttClient.connect("nukiHub")) { + bool success = false; + + if(strlen(_mqttUser) == 0) + { + Serial.println("MQTT: Connecting without credentials"); + success = _mqttClient.connect("nukiHub"); + } + else + { + Serial.print("MQTT: Connecting with user: "); Serial.println(_mqttUser); + success = _mqttClient.connect("nukiHub", _mqttUser, _mqttPass); + } + + + if (success) { Serial.println(F("MQTT connected")); _mqttConnected = true; diff --git a/Network.h b/Network.h index 89a74e5..0b165f4 100644 --- a/Network.h +++ b/Network.h @@ -41,8 +41,10 @@ private: bool _mqttConnected = false; unsigned long _nextReconnect = 0; - char _mqttBrokerAddr[100] = {0}; - char _mqttPath[100] = {0}; + char _mqttBrokerAddr[101] = {0}; + char _mqttPath[181] = {0}; + char _mqttUser[31] = {0}; + char _mqttPass[31] = {0}; void (*_lockActionReceivedCallback)(const char* value) = NULL; }; diff --git a/PreferencesKeys.h b/PreferencesKeys.h index f795f7d..60345d5 100644 --- a/PreferencesKeys.h +++ b/PreferencesKeys.h @@ -3,6 +3,8 @@ #define preference_deviceId "deviceId" #define preference_mqtt_broker "mqttbroker" #define preference_mqtt_broker_port "mqttport" +#define preference_mqtt_user "mqttuser" +#define preference_mqtt_password "mqttpass" #define preference_mqtt_path "mqttpath" #define preference_query_interval_lockstate "lockStInterval" #define preference_query_interval_battery "batInterval" diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index 75e2546..781c138 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -17,6 +17,8 @@ void WebCfgServer::initialize() void WebCfgServer::update() { + if(!_enabled) return; + bool configChanged = false; // Create a client connections @@ -25,7 +27,8 @@ void WebCfgServer::update() if (client) { int index = 0; - char message[200]; + char message[500]; + while (client.connected()) { @@ -56,6 +59,7 @@ void WebCfgServer::update() char *lastToken = NULL; bool configChanged = false; + bool clearCredentials = false; while (token != NULL) { if(lastToken != NULL) @@ -73,6 +77,28 @@ void WebCfgServer::update() _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); @@ -93,6 +119,13 @@ void WebCfgServer::update() token = strtok(NULL, "?=&"); } + if(clearCredentials) + { + _preferences->putString(preference_mqtt_user, ""); + _preferences->putString(preference_mqtt_password, ""); + configChanged = true; + } + if(configChanged) { _enabled = false; @@ -133,6 +166,8 @@ void WebCfgServer::serveHtml(WiFiClient &client) 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); @@ -165,6 +200,14 @@ TokenType WebCfgServer::getParameterType(char *&token) { 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; diff --git a/WebCfgServer.h b/WebCfgServer.h index 321eb70..5ca2b8f 100644 --- a/WebCfgServer.h +++ b/WebCfgServer.h @@ -10,6 +10,8 @@ enum class TokenType None, MqttServer, MqttPort, + MqttUser, + MqttPass, MqttPath, QueryIntervalLockstate, QueryIntervalBattery, diff --git a/main.cpp b/main.cpp index b3a6283..ca526be 100644 --- a/main.cpp +++ b/main.cpp @@ -31,7 +31,7 @@ void nukiTask(void *pvParameters) void setupTasks() { - xTaskCreate(networkTask, "ntw", 2048, NULL, 1, NULL); + xTaskCreate(networkTask, "ntw", 8192, NULL, 1, NULL); xTaskCreate(nukiTask, "nuki", 16384, NULL, 1, NULL); }