From 4917ff92e3c03151ded2ba18e4e0d66de6f49ea9 Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 30 Sep 2024 23:01:11 +0200 Subject: [PATCH] [MQTT-TLS] Improve stability of MQTT connection while serving JSON pages --- .../tls_mini/src/WiFiClientSecureLightBearSSL.cpp | 12 ++++++++++++ .../tls_mini/src/WiFiClientSecureLightBearSSL.h | 6 ++++-- lib/pubsubclient/src/PubSubClient.cpp | 1 + src/ESPEasy-Globals.cpp | 2 +- src/src/ESPEasyCore/Controller.cpp | 5 +++++ src/src/ESPEasyCore/ESPEasy_setup.cpp | 2 +- src/src/Helpers/PeriodicalActions.cpp | 4 ++-- 7 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp index 137a3f2061..e2bc99089e 100644 --- a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp +++ b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp @@ -297,6 +297,18 @@ void WiFiClientSecure_light::flush(void) { #endif #ifdef ESP32 + +int WiFiClientSecure_light::connect(IPAddress ip, uint16_t port) +{ + return connect(ip, port, _timeout); +} + +int WiFiClientSecure_light::connect(const char* name, uint16_t port) +{ + return connect(name, port, _timeout); +} + + int WiFiClientSecure_light::connect(IPAddress ip, uint16_t port, int32_t timeout) { DEBUG_BSSL("connect(%s,%d)", ip.toString().c_str(), port); clearLastError(); diff --git a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h index ae192cfd0b..60c32fb04f 100644 --- a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h +++ b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h @@ -45,8 +45,10 @@ class WiFiClientSecure_light : public NetworkClient { void allocateBuffers(void); #ifdef ESP32 // the method to override in ESP32 has timeout argument default #define WIFI_CLIENT_DEF_CONN_TIMEOUT_MS (3000) - int connect(IPAddress ip, uint16_t port, int32_t timeout = 3000) override; - int connect(const char* name, uint16_t port, int32_t timeout = 3000) override; + int connect(IPAddress ip, uint16_t port) override; + int connect(const char* name, uint16_t port) override; + int connect(IPAddress ip, uint16_t port, int32_t timeout); + int connect(const char* name, uint16_t port, int32_t timeout); #else int connect(IPAddress ip, uint16_t port) override; int connect(const char* name, uint16_t port) override; diff --git a/lib/pubsubclient/src/PubSubClient.cpp b/lib/pubsubclient/src/PubSubClient.cpp index 30948c57f9..34a8cab7b8 100644 --- a/lib/pubsubclient/src/PubSubClient.cpp +++ b/lib/pubsubclient/src/PubSubClient.cpp @@ -458,6 +458,7 @@ bool PubSubClient::loop_read() { } boolean PubSubClient::loop() { + delay(0); loop_read(); if (connected()) { unsigned long t = millis(); diff --git a/src/ESPEasy-Globals.cpp b/src/ESPEasy-Globals.cpp index 74bf20a961..ef6bef37e1 100644 --- a/src/ESPEasy-Globals.cpp +++ b/src/ESPEasy-Globals.cpp @@ -11,7 +11,7 @@ boolean printToWebJSON = false; -unsigned long timermqtt_interval = 250; +unsigned long timermqtt_interval = 100; unsigned long lastSend = 0; unsigned long lastWeb = 0; diff --git a/src/src/ESPEasyCore/Controller.cpp b/src/src/ESPEasyCore/Controller.cpp index 04ac2b61a9..9b19c827d0 100644 --- a/src/src/ESPEasyCore/Controller.cpp +++ b/src/src/ESPEasyCore/Controller.cpp @@ -254,6 +254,8 @@ bool MQTTConnect(controllerIndex_t controller_idx) mqtt.setTimeout(timeout); // in msec as it should be! # endif // ifdef MUSTFIX_CLIENT_TIMEOUT_IN_SECONDS MQTTclient.setClient(mqtt); + MQTTclient.setKeepAlive(10); + MQTTclient.setSocketTimeout(timeout); break; } @@ -357,6 +359,9 @@ bool MQTTConnect(controllerIndex_t controller_idx) mqtt_tls->setBufferSizes(1024, 1024); # endif // ifdef ESP8266 MQTTclient.setClient(*mqtt_tls); + MQTTclient.setKeepAlive(10); + MQTTclient.setSocketTimeout(timeout); + if (mqttPort == 1883) { mqttPort = 8883; diff --git a/src/src/ESPEasyCore/ESPEasy_setup.cpp b/src/src/ESPEasyCore/ESPEasy_setup.cpp index 8130acc603..10c4c71146 100644 --- a/src/src/ESPEasyCore/ESPEasy_setup.cpp +++ b/src/src/ESPEasyCore/ESPEasy_setup.cpp @@ -459,7 +459,7 @@ void ESPEasy_setup() } #endif - timermqtt_interval = 250; // Interval for checking MQTT + timermqtt_interval = 100; // Interval for checking MQTT timerAwakeFromDeepSleep = millis(); CPluginInit(); #ifndef BUILD_NO_RAM_TRACKER diff --git a/src/src/Helpers/PeriodicalActions.cpp b/src/src/Helpers/PeriodicalActions.cpp index 6e1f90b967..9f037cf0d6 100644 --- a/src/src/Helpers/PeriodicalActions.cpp +++ b/src/src/Helpers/PeriodicalActions.cpp @@ -365,10 +365,10 @@ void updateMQTTclient_connected() { if (!MQTTclient_connected) { // As suggested here: https://github.com/letscontrolit/ESPEasy/issues/1356 if (timermqtt_interval < 30000) { - timermqtt_interval += 5000; + timermqtt_interval += 500; } } else { - timermqtt_interval = 250; + timermqtt_interval = 100; } Scheduler.setIntervalTimer(SchedulerIntervalTimer_e::TIMER_MQTT); scheduleNextMQTTdelayQueue();