allow to configure mqtt credentials

This commit is contained in:
technyon
2022-04-03 15:10:29 +02:00
parent b660e1c1a2
commit 90b47507d2
6 changed files with 88 additions and 6 deletions

View File

@@ -63,6 +63,26 @@ void Network::initialize()
_preferences->putString(preference_mqtt_path, _mqttPath); _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(F("MQTT Broker: "));
Serial.print(_mqttBrokerAddr); Serial.print(_mqttBrokerAddr);
Serial.print(F(":")); Serial.print(F(":"));
@@ -77,8 +97,21 @@ bool Network::reconnect()
while (!_mqttClient.connected() && millis() > _nextReconnect) while (!_mqttClient.connected() && millis() > _nextReconnect)
{ {
Serial.println("Attempting MQTT connection"); Serial.println("Attempting MQTT connection");
// Attempt to connect bool success = false;
if (_mqttClient.connect("nukiHub")) {
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")); Serial.println(F("MQTT connected"));
_mqttConnected = true; _mqttConnected = true;

View File

@@ -41,8 +41,10 @@ private:
bool _mqttConnected = false; bool _mqttConnected = false;
unsigned long _nextReconnect = 0; unsigned long _nextReconnect = 0;
char _mqttBrokerAddr[100] = {0}; char _mqttBrokerAddr[101] = {0};
char _mqttPath[100] = {0}; char _mqttPath[181] = {0};
char _mqttUser[31] = {0};
char _mqttPass[31] = {0};
void (*_lockActionReceivedCallback)(const char* value) = NULL; void (*_lockActionReceivedCallback)(const char* value) = NULL;
}; };

View File

@@ -3,6 +3,8 @@
#define preference_deviceId "deviceId" #define preference_deviceId "deviceId"
#define preference_mqtt_broker "mqttbroker" #define preference_mqtt_broker "mqttbroker"
#define preference_mqtt_broker_port "mqttport" #define preference_mqtt_broker_port "mqttport"
#define preference_mqtt_user "mqttuser"
#define preference_mqtt_password "mqttpass"
#define preference_mqtt_path "mqttpath" #define preference_mqtt_path "mqttpath"
#define preference_query_interval_lockstate "lockStInterval" #define preference_query_interval_lockstate "lockStInterval"
#define preference_query_interval_battery "batInterval" #define preference_query_interval_battery "batInterval"

View File

@@ -17,6 +17,8 @@ void WebCfgServer::initialize()
void WebCfgServer::update() void WebCfgServer::update()
{ {
if(!_enabled) return;
bool configChanged = false; bool configChanged = false;
// Create a client connections // Create a client connections
@@ -25,7 +27,8 @@ void WebCfgServer::update()
if (client) if (client)
{ {
int index = 0; int index = 0;
char message[200]; char message[500];
while (client.connected()) while (client.connected())
{ {
@@ -56,6 +59,7 @@ void WebCfgServer::update()
char *lastToken = NULL; char *lastToken = NULL;
bool configChanged = false; bool configChanged = false;
bool clearCredentials = false;
while (token != NULL) while (token != NULL)
{ {
if(lastToken != NULL) if(lastToken != NULL)
@@ -73,6 +77,28 @@ void WebCfgServer::update()
_preferences->putInt(preference_mqtt_broker_port, String(token).toInt()); _preferences->putInt(preference_mqtt_broker_port, String(token).toInt());
configChanged = true; 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) else if(lastTokenType == TokenType::MqttPath && tokenType == TokenType::None)
{ {
_preferences->putString(preference_mqtt_path, token); _preferences->putString(preference_mqtt_path, token);
@@ -93,6 +119,13 @@ void WebCfgServer::update()
token = strtok(NULL, "?=&"); token = strtok(NULL, "?=&");
} }
if(clearCredentials)
{
_preferences->putString(preference_mqtt_user, "");
_preferences->putString(preference_mqtt_password, "");
configChanged = true;
}
if(configChanged) if(configChanged)
{ {
_enabled = false; _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, "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, "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, "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, "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); 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; return TokenType::MqttPort;
} }
if (strcmp(token, "MQTTUSER") == 0)
{
return TokenType::MqttUser;
}
if (strcmp(token, "MQTTPASS") == 0)
{
return TokenType::MqttPass;
}
if (strcmp(token, "MQTTPATH") == 0) if (strcmp(token, "MQTTPATH") == 0)
{ {
return TokenType::MqttPath; return TokenType::MqttPath;

View File

@@ -10,6 +10,8 @@ enum class TokenType
None, None,
MqttServer, MqttServer,
MqttPort, MqttPort,
MqttUser,
MqttPass,
MqttPath, MqttPath,
QueryIntervalLockstate, QueryIntervalLockstate,
QueryIntervalBattery, QueryIntervalBattery,

View File

@@ -31,7 +31,7 @@ void nukiTask(void *pvParameters)
void setupTasks() void setupTasks()
{ {
xTaskCreate(networkTask, "ntw", 2048, NULL, 1, NULL); xTaskCreate(networkTask, "ntw", 8192, NULL, 1, NULL);
xTaskCreate(nukiTask, "nuki", 16384, NULL, 1, NULL); xTaskCreate(nukiTask, "nuki", 16384, NULL, 1, NULL);
} }