From 8d86bb222aa4134fbf459b01e35133ba8f21b4e2 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <67171972+IoTManagerProject@users.noreply.github.com> Date: Fri, 11 Feb 2022 00:22:59 +0100 Subject: [PATCH] mqtt --- include/Global.h | 4 - include/MqttClient.h | 2 +- include/utils/WiFiUtils.h | 1 + src/Global.cpp | 4 - src/MqttClient.cpp | 183 +++++++++++++------------------------- src/PeriodicTasks.cpp | 10 +-- src/WsServer.cpp | 3 + src/utils/WiFiUtils.cpp | 2 +- 8 files changed, 75 insertions(+), 134 deletions(-) diff --git a/include/Global.h b/include/Global.h index fb08a1e4..4a6e440c 100644 --- a/include/Global.h +++ b/include/Global.h @@ -105,10 +105,6 @@ extern String prex; extern String all_widgets; extern String scenario; -extern int mqttConnectAttempts; -extern bool changeBroker; -extern int currentBroker; - // extern DynamicJsonDocument settingsFlashJsonDoc; // extern DynamicJsonDocument paramsFlashJsonDoc; // extern DynamicJsonDocument paramsHeapJsonDoc; \ No newline at end of file diff --git a/include/MqttClient.h b/include/MqttClient.h index 92674571..30e35961 100644 --- a/include/MqttClient.h +++ b/include/MqttClient.h @@ -6,7 +6,7 @@ void mqttInit(); void selectBroker(); -void getMqttData1(); +void getMqttData(); void getMqttData2(); bool isSecondBrokerSet(); boolean mqttConnect(); diff --git a/include/utils/WiFiUtils.h b/include/utils/WiFiUtils.h index e6b6b3ff..404cee06 100644 --- a/include/utils/WiFiUtils.h +++ b/include/utils/WiFiUtils.h @@ -1,6 +1,7 @@ #pragma once #include "Global.h" +#include "MqttClient.h" boolean isNetworkActive(); void routerConnect(); diff --git a/src/Global.cpp b/src/Global.cpp index adeaf8a8..57b4d4cc 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -58,10 +58,6 @@ String all_widgets = ""; String scenario = ""; String mqttRootDevice = ""; -int mqttConnectAttempts = 0; -bool changeBroker = false; -int currentBroker = 1; - // DynamicJsonDocument settingsFlashJsonDoc(JSON_BUFFER_SIZE); // DynamicJsonDocument paramsFlashJsonDoc(JSON_BUFFER_SIZE); // DynamicJsonDocument paramsHeapJsonDoc(JSON_BUFFER_SIZE); \ No newline at end of file diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index ca7dc738..11c5a94a 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -1,24 +1,19 @@ #include "MqttClient.h" void mqttInit() { - myNotAsyncActions->add( - do_MQTTPARAMSCHANGED, [&](void*) { - mqttReconnect(); - }, - nullptr); - mqtt.setCallback(mqttCallback); - ts.add( WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL, [&](void*) { if (WiFi.status() == WL_CONNECTED) { SerialPrint("I", F("WIFI"), F("OK")); if (mqtt.connected()) { - SerialPrint("I", F("MQTT"), "OK, broker No " + String(currentBroker)); + SerialPrint("I", F("MQTT"), "OK"); + jsonWriteInt_(errorsHeapJson, F("mqtt"), mqtt.state()); // setLedStatus(LED_OFF); } else { SerialPrint("E", F("MQTT"), F("✖ Connection lost")); + jsonWriteInt_(errorsHeapJson, F("mqtt"), mqtt.state()); mqttConnect(); } } else { @@ -28,13 +23,59 @@ void mqttInit() { } }, nullptr, true); +} - // myNotAsyncActions->add( - // do_sendScenMQTT, [&](void*) { - // String scen = readFile(String(DEVICE_SCENARIO_FILE), 2048); - // publishInfo("scen", scen); - // }, - // nullptr); +void mqttLoop() { + if (!isNetworkActive() || !mqtt.connected()) { + return; + } + mqtt.loop(); +} + +boolean mqttConnect() { + getMqttData(); + bool res = false; + if (mqttServer == "") { + SerialPrint("E", "MQTT", F("mqttServer empty")); + jsonWriteInt_(errorsHeapJson, F("mqtt"), 6); + return res; + } + SerialPrint("I", "MQTT", "connection started"); + + SerialPrint("I", "MQTT", "broker " + mqttServer + ":" + String(mqttPort, DEC)); + SerialPrint("I", "MQTT", "topic " + mqttRootDevice); + + // setLedStatus(LED_FAST); + + mqtt.setServer(mqttServer.c_str(), mqttPort); + + if (!mqtt.connected()) { + bool connected = false; + if (mqttUser != "" && mqttPass != "") { + connected = mqtt.connect(chipId.c_str(), mqttUser.c_str(), mqttPass.c_str()); + SerialPrint("I", F("MQTT"), F("Go to connection with login and password")); + } else if (mqttUser == "" && mqttPass == "") { + connected = mqtt.connect(chipId.c_str()); + SerialPrint("I", F("MQTT"), F("Go to connection without login and password")); + } else { + SerialPrint("E", F("MQTT"), F("✖ Login or password missed")); + jsonWriteInt_(errorsHeapJson, F("mqtt"), 7); + return res; + } + + if (connected) { + SerialPrint("I", F("MQTT"), F("✔ connected")); + jsonWriteInt_(errorsHeapJson, F("mqtt"), mqtt.state()); + // setLedStatus(LED_OFF); + mqttSubscribe(); + res = true; + } else { + SerialPrint("E", F("MQTT"), "🡆 Could't connect, retry in " + String(MQTT_RECONNECT_INTERVAL / 1000) + "s"); + jsonWriteInt_(errorsHeapJson, F("mqtt"), mqtt.state()); + // setLedStatus(LED_FAST); + } + } + return res; } void mqttDisconnect() { @@ -47,16 +88,16 @@ void mqttReconnect() { mqttConnect(); } -void mqttLoop() { - if (!isNetworkActive() || !mqtt.connected()) { - return; - } - mqtt.loop(); +void getMqttData() { + mqttServer = jsonReadStr(settingsFlashJson, F("mqttServer")); + mqttPort = jsonReadInt(settingsFlashJson, F("mqttPort")); + mqttUser = jsonReadStr(settingsFlashJson, F("mqttUser")); + mqttPass = jsonReadStr(settingsFlashJson, F("mqttPass")); } void mqttSubscribe() { SerialPrint("I", F("MQTT"), F("subscribed")); - SerialPrint("I", "MQTT", mqttRootDevice); + SerialPrint("I", F("MQTT"), mqttRootDevice); mqtt.subscribe(mqttPrefix.c_str()); mqtt.subscribe((mqttRootDevice + "/+/control").c_str()); mqtt.subscribe((mqttRootDevice + "/update").c_str()); @@ -68,105 +109,6 @@ void mqttSubscribe() { } } -void selectBroker() { - if (changeBroker) { - changeBroker = false; - if (currentBroker == 1) { - getMqttData2(); - } else if (currentBroker == 2) { - getMqttData1(); - } - } else { - if (currentBroker == 1) { - getMqttData1(); - } else if (currentBroker == 2) { - getMqttData2(); - } - } -} - -void getMqttData1() { - currentBroker = 1; - mqttServer = jsonReadStr(settingsFlashJson, F("mqttServer")); - mqttPort = jsonReadInt(settingsFlashJson, F("mqttPort")); - mqttUser = jsonReadStr(settingsFlashJson, F("mqttUser")); - mqttPass = jsonReadStr(settingsFlashJson, F("mqttPass")); - // prex = mqttPrefix + "/" + chipId; -} - -void getMqttData2() { - currentBroker = 2; - mqttServer = jsonReadStr(settingsFlashJson, F("mqttServer2")); - mqttPort = jsonReadInt(settingsFlashJson, F("mqttPort2")); - mqttUser = jsonReadStr(settingsFlashJson, F("mqttUser2")); - mqttPass = jsonReadStr(settingsFlashJson, F("mqttPass2")); - // prex = mqttPrefix + "/" + chipId; -} - -bool isSecondBrokerSet() { - bool res = true; - if (jsonReadStr(settingsFlashJson, F("mqttServer2")) == "") { - res = false; - } - if (jsonReadStr(settingsFlashJson, F("mqttPrefix2")) == "") { - res = false; - } - return res; -} - -boolean mqttConnect() { - selectBroker(); - bool res = false; - if (mqttServer == "") { - SerialPrint("E", "MQTT", F("mqttServer empty")); - return res; - } - SerialPrint("I", "MQTT", "connection started to broker No " + String(currentBroker)); - - SerialPrint("I", "MQTT", "broker " + mqttServer + ":" + String(mqttPort, DEC)); - SerialPrint("I", "MQTT", "topic " + mqttRootDevice); - // setLedStatus(LED_FAST); - mqtt.setServer(mqttServer.c_str(), mqttPort); - - if (!mqtt.connected()) { - bool connected = false; - if (mqttUser != "" && mqttPass != "") { - connected = mqtt.connect(chipId.c_str(), mqttUser.c_str(), mqttPass.c_str()); - SerialPrint("I", F("MQTT"), F("Go to connection with login and password")); - } else if (mqttUser == "" && mqttPass == "") { - connected = mqtt.connect(chipId.c_str()); - SerialPrint("I", F("MQTT"), F("Go to connection without login and password")); - } else { - SerialPrint("E", F("MQTT"), F("✖ Login or password missing")); - return res; - } - - if (connected) { - SerialPrint("I", F("MQTT"), F("✔ connected")); - // if (currentBroker == 1) jsonWriteStr(settingsFlashJson, F("warning4"), F("
Подключено к основному брокеру
Подключено к резервному брокеру
Не подключено брокеру