[SYS} Improve queue performance whenb Using Ethernet and low interval between scan (#2052)

Add also a msgrcv (messages received) indicators into SYStoMQTT to measure the performances

Co-authored-by: Florian <1technophile@users.noreply.github.com>
This commit is contained in:
FlorianandFlorian authored and GitHub committed 2024-09-10 16:33:46 -05:00
1 parent caea021ca9
commit 5d6f735058
3 files changed
+67 -55

No files matched your search

+2 -2
View File
@@ -785,9 +785,9 @@ void connectMQTT();
unsigned long uptime(); unsigned long uptime();
bool cmpToMainTopic(const char*, const char*); bool cmpToMainTopic(const char*, const char*);
void pub(const char*, const char*, bool); bool pub(const char*, const char*, bool);
// void pub(const char*, JsonObject&); // void pub(const char*, JsonObject&);
void pub(const char*, const char*); bool pub(const char*, const char*);
// void pub_custom_topic(const char*, JsonObject&, boolean); // void pub_custom_topic(const char*, JsonObject&, boolean);
#if defined(ESP32) #if defined(ESP32)
+1
View File
@@ -681,6 +681,7 @@ void procBLETask(void* pvParameters) {
updateDevicesStatus(); updateDevicesStatus();
} }
delete (advertisedDevice); delete (advertisedDevice);
vTaskDelay(10);
} }
} }
+64 -53
View File
@@ -68,6 +68,7 @@ unsigned long timer_sys_checks = 0;
int queueLength = 0; int queueLength = 0;
unsigned long queueLengthSum = 0; unsigned long queueLengthSum = 0;
unsigned long blockedMessages = 0; unsigned long blockedMessages = 0;
unsigned long receivedMessages = 0;
int maxQueueLength = 0; int maxQueueLength = 0;
#ifndef QueueSize #ifndef QueueSize
# define QueueSize 18 # define QueueSize 18
@@ -378,7 +379,8 @@ void Config_update(JsonObject& data, const char* key, T& var) {
* Dispatch json messages towards the communication layer * Dispatch json messages towards the communication layer
* *
*/ */
void jsonDispatch(JsonObject& data) { bool jsonDispatch(JsonObject& data) {
bool res = false;
if (data.containsKey("origin")) { if (data.containsKey("origin")) {
#if message_UTCtimestamp == true #if message_UTCtimestamp == true
data["UTCtime"] = TheengsUtils::UTCtimestamp(); data["UTCtime"] = TheengsUtils::UTCtimestamp();
@@ -388,26 +390,30 @@ void jsonDispatch(JsonObject& data) {
#endif #endif
pubWebUI((char*)data["origin"].as<const char*>(), data); pubWebUI((char*)data["origin"].as<const char*>(), data);
if (SYSConfig.mqtt && !SYSConfig.offline) { if (SYSConfig.mqtt && !SYSConfig.offline) {
pub((char*)data["origin"].as<const char*>(), data); res = pub((char*)data["origin"].as<const char*>(), data);
#ifdef ZgatewayBT #ifdef ZgatewayBT
if (data.containsKey("distance")) { if (data.containsKey("distance")) {
String topic = String(mqtt_topic) + BTConfig.presenceTopic + String(gateway_name); String topic = String(mqtt_topic) + BTConfig.presenceTopic + String(gateway_name);
Log.trace(F("Pub HA Presence %s" CR), topic.c_str()); Log.trace(F("Pub HA Presence %s" CR), topic.c_str());
pub_custom_topic((char*)topic.c_str(), data, false); res = pub_custom_topic((char*)topic.c_str(), data, false);
} }
#endif #endif
} }
#ifdef ZgatewaySERIAL #ifdef ZgatewaySERIAL
if (SYSConfig.serial) if (SYSConfig.serial) {
XtoSERIAL("", data); XtoSERIAL("", data);
res = true;
}
#endif #endif
} else { } else {
Log.error(F("No origin in JSON filtered" CR)); Log.error(F("No origin in JSON filtered" CR));
} }
return res;
} }
// Add a document to the queue // Add a document to the queue
boolean enqueueJsonObject(const StaticJsonDocument<JSON_MSG_BUFFER>& jsonDoc, int timeout) { boolean enqueueJsonObject(const StaticJsonDocument<JSON_MSG_BUFFER>& jsonDoc, int timeout) {
receivedMessages++;
if (jsonDoc.size() == 0) { if (jsonDoc.size() == 0) {
Log.error(F("Empty JSON, skipping" CR)); Log.error(F("Empty JSON, skipping" CR));
return true; return true;
@@ -525,9 +531,9 @@ void emptyQueue() {
if (error) { if (error) {
Log.error(F("deserialize jsonQueue.front() failed: %s, buffer capacity: %u" CR), error.c_str(), jsonBuffer.capacity()); Log.error(F("deserialize jsonQueue.front() failed: %s, buffer capacity: %u" CR), error.c_str(), jsonBuffer.capacity());
} else { } else {
jsonDispatch(obj); if (jsonDispatch(obj))
}
queueLengthSum++; queueLengthSum++;
}
} }
/** /**
@@ -537,9 +543,9 @@ void emptyQueue() {
* @param payload the message to sends * @param payload the message to sends
* @param retainFlag true if you what a retain * @param retainFlag true if you what a retain
*/ */
void pub(const char* topicori, const char* payload, bool retainFlag) { bool pub(const char* topicori, const char* payload, bool retainFlag) {
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori); String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
pubMQTT(topic.c_str(), payload, retainFlag); return pubMQTT(topic.c_str(), payload, retainFlag);
} }
/** /**
@@ -548,7 +554,8 @@ void pub(const char* topicori, const char* payload, bool retainFlag) {
* @param topicori suffix to add on default MQTT Topic * @param topicori suffix to add on default MQTT Topic
* @param data The Json Object that represents the message * @param data The Json Object that represents the message
*/ */
void pub(const char* topicori, JsonObject& data) { bool pub(const char* topicori, JsonObject& data) {
bool res = false;
bool ret = sensor_Retain; bool ret = sensor_Retain;
if (data.containsKey("retain") && data["retain"].is<bool>()) { if (data.containsKey("retain") && data["retain"].is<bool>()) {
ret = data["retain"]; ret = data["retain"];
@@ -559,7 +566,7 @@ void pub(const char* topicori, JsonObject& data) {
} }
if (data.size() == 0) { if (data.size() == 0) {
Log.error(F("Empty JSON, not published" CR)); Log.error(F("Empty JSON, not published" CR));
return; return res;
} }
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori); String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
#if valueAsATopic #if valueAsATopic
@@ -580,7 +587,7 @@ void pub(const char* topicori, JsonObject& data) {
#if jsonPublishing #if jsonPublishing
String dataAsString = ""; String dataAsString = "";
serializeJson(data, dataAsString); serializeJson(data, dataAsString);
pubMQTT(topic.c_str(), dataAsString.c_str(), ret); res = pubMQTT(topic.c_str(), dataAsString.c_str(), ret);
#endif #endif
#if simplePublishing #if simplePublishing
@@ -592,19 +599,20 @@ void pub(const char* topicori, JsonObject& data) {
# endif # endif
if (p.value().is<uint64_t>() && strcmp(p.key().c_str(), "rssi") != 0) { //test rssi , bypass solution due to the fact that a int is considered as an uint64_t if (p.value().is<uint64_t>() && strcmp(p.key().c_str(), "rssi") != 0) { //test rssi , bypass solution due to the fact that a int is considered as an uint64_t
if (strcmp(p.key().c_str(), "value") == 0) { // if data is a value we don't integrate the name into the topic if (strcmp(p.key().c_str(), "value") == 0) { // if data is a value we don't integrate the name into the topic
pubMQTT(topic, p.value().as<uint64_t>()); res = pubMQTT(topic, p.value().as<uint64_t>());
} else { // if data is not a value we integrate the name into the topic } else { // if data is not a value we integrate the name into the topic
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<uint64_t>()); res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<uint64_t>());
} }
} else if (p.value().is<int>()) { } else if (p.value().is<int>()) {
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<int>()); res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<int>());
} else if (p.value().is<float>()) { } else if (p.value().is<float>()) {
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<float>()); res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<float>());
} else if (p.value().is<char*>()) { } else if (p.value().is<char*>()) {
pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<const char*>()); res = pubMQTT(topic + "/" + String(p.key().c_str()), p.value().as<const char*>());
} }
} }
#endif #endif
return res;
} }
/** /**
@@ -613,9 +621,9 @@ void pub(const char* topicori, JsonObject& data) {
* @param topicori suffix to add on default MQTT Topic * @param topicori suffix to add on default MQTT Topic
* @param payload the message to sends * @param payload the message to sends
*/ */
void pub(const char* topicori, const char* payload) { bool pub(const char* topicori, const char* payload) {
String topic = String(mqtt_topic) + String(gateway_name) + String(topicori); String topic = String(mqtt_topic) + String(gateway_name) + String(topicori);
pubMQTT(topic, payload); return pubMQTT(topic, payload);
} }
/** /**
@@ -625,10 +633,10 @@ void pub(const char* topicori, const char* payload) {
* @param data The Json Object that represents the message * @param data The Json Object that represents the message
* @param retain true if you what a retain * @param retain true if you what a retain
*/ */
void pub_custom_topic(const char* topic, JsonObject& data, boolean retain) { bool pub_custom_topic(const char* topic, JsonObject& data, boolean retain) {
String buffer = ""; String buffer = "";
serializeJson(data, buffer); serializeJson(data, buffer);
pubMQTT(topic, buffer.c_str(), retain); return pubMQTT(topic, buffer.c_str(), retain);
} }
/** /**
@@ -637,8 +645,8 @@ void pub_custom_topic(const char* topic, JsonObject& data, boolean retain) {
* @param topic the topic * @param topic the topic
* @param payload the payload * @param payload the payload
*/ */
void pubMQTT(const char* topic, const char* payload) { bool pubMQTT(const char* topic, const char* payload) {
pubMQTT(topic, payload, sensor_Retain); return pubMQTT(topic, payload, sensor_Retain);
} }
/** /**
@@ -648,18 +656,19 @@ void pubMQTT(const char* topic, const char* payload) {
* @param payload the payload * @param payload the payload
* @param retainFlag true if retain the retain Flag * @param retainFlag true if retain the retain Flag
*/ */
void pubMQTT(const char* topic, const char* payload, bool retainFlag) { bool pubMQTT(const char* topic, const char* payload, bool retainFlag) {
bool res = false;
if (SYSConfig.mqtt && !SYSConfig.offline) { if (SYSConfig.mqtt && !SYSConfig.offline) {
#ifdef ESP32 #ifdef ESP32
if (xSemaphoreTake(xMqttMutex, pdMS_TO_TICKS(QueueSemaphoreTimeOutTask)) == pdFALSE) { if (xSemaphoreTake(xMqttMutex, pdMS_TO_TICKS(QueueSemaphoreTimeOutTask)) == pdFALSE) {
Log.error(F("xMqttMutex not taken" CR)); Log.error(F("xMqttMutex not taken" CR));
return; return res;
} }
#endif #endif
if (mqtt && mqtt->connected()) { if (mqtt && mqtt->connected()) {
SendReceiveIndicatorON(); SendReceiveIndicatorON();
Log.notice(F("[ OMG->MQTT ] topic: %s msg: %s " CR), topic, payload); Log.notice(F("[ OMG->MQTT ] topic: %s msg: %s " CR), topic, payload);
mqtt->publish(topic, payload, 0, retainFlag); res = mqtt->publish(topic, payload, 0, retainFlag);
} else { } else {
Log.warning(F("MQTT not connected, aborting the publication" CR)); Log.warning(F("MQTT not connected, aborting the publication" CR));
} }
@@ -669,84 +678,85 @@ void pubMQTT(const char* topic, const char* payload, bool retainFlag) {
} else { } else {
Log.notice(F("[ OMG->MQTT deactivated or offline] topic: %s msg: %s " CR), topic, payload); Log.notice(F("[ OMG->MQTT deactivated or offline] topic: %s msg: %s " CR), topic, payload);
} }
return res;
} }
void pubMQTT(String topic, const char* payload) { bool pubMQTT(String topic, const char* payload) {
pubMQTT(topic.c_str(), payload); return pubMQTT(topic.c_str(), payload);
} }
void pubMQTT(const char* topic, unsigned long payload) { bool pubMQTT(const char* topic, unsigned long payload) {
char val[11]; char val[11];
sprintf(val, "%lu", payload); sprintf(val, "%lu", payload);
pubMQTT(topic, val); return pubMQTT(topic, val);
} }
void pubMQTT(const char* topic, unsigned long long payload) { bool pubMQTT(const char* topic, unsigned long long payload) {
char val[21]; char val[21];
sprintf(val, "%llu", payload); sprintf(val, "%llu", payload);
pubMQTT(topic, val); return pubMQTT(topic, val);
} }
void pubMQTT(const char* topic, String payload) { bool pubMQTT(const char* topic, String payload) {
pubMQTT(topic, payload.c_str()); return pubMQTT(topic, payload.c_str());
} }
void pubMQTT(String topic, String payload) { bool pubMQTT(String topic, String payload) {
pubMQTT(topic.c_str(), payload.c_str()); return pubMQTT(topic.c_str(), payload.c_str());
} }
void pubMQTT(String topic, int payload) { bool pubMQTT(String topic, int payload) {
char val[12]; char val[12];
sprintf(val, "%d", payload); sprintf(val, "%d", payload);
pubMQTT(topic.c_str(), val); return pubMQTT(topic.c_str(), val);
} }
void pubMQTT(String topic, unsigned long long payload) { bool pubMQTT(String topic, unsigned long long payload) {
char val[21]; char val[21];
sprintf(val, "%llu", payload); sprintf(val, "%llu", payload);
pubMQTT(topic.c_str(), val); return pubMQTT(topic.c_str(), val);
} }
void pubMQTT(String topic, float payload) { bool pubMQTT(String topic, float payload) {
char val[12]; char val[12];
dtostrf(payload, 3, 1, val); dtostrf(payload, 3, 1, val);
pubMQTT(topic.c_str(), val); return pubMQTT(topic.c_str(), val);
} }
void pubMQTT(const char* topic, float payload) { bool pubMQTT(const char* topic, float payload) {
char val[12]; char val[12];
dtostrf(payload, 3, 1, val); dtostrf(payload, 3, 1, val);
pubMQTT(topic, val); return pubMQTT(topic, val);
} }
void pubMQTT(const char* topic, int payload) { bool pubMQTT(const char* topic, int payload) {
char val[12]; char val[12];
sprintf(val, "%d", payload); sprintf(val, "%d", payload);
pubMQTT(topic, val); return pubMQTT(topic, val);
} }
void pubMQTT(const char* topic, unsigned int payload) { bool pubMQTT(const char* topic, unsigned int payload) {
char val[12]; char val[12];
sprintf(val, "%u", payload); sprintf(val, "%u", payload);
pubMQTT(topic, val); return pubMQTT(topic, val);
} }
void pubMQTT(const char* topic, long payload) { bool pubMQTT(const char* topic, long payload) {
char val[11]; char val[11];
sprintf(val, "%ld", payload); sprintf(val, "%ld", payload);
pubMQTT(topic, val); return pubMQTT(topic, val);
} }
void pubMQTT(const char* topic, double payload) { bool pubMQTT(const char* topic, double payload) {
char val[16]; char val[16];
sprintf(val, "%f", payload); sprintf(val, "%f", payload);
pubMQTT(topic, val); return pubMQTT(topic, val);
} }
void pubMQTT(String topic, unsigned long payload) { bool pubMQTT(String topic, unsigned long payload) {
char val[11]; char val[11];
sprintf(val, "%lu", payload); sprintf(val, "%lu", payload);
pubMQTT(topic.c_str(), val); return pubMQTT(topic.c_str(), val);
} }
void delayWithOTA(long waitMillis) { void delayWithOTA(long waitMillis) {
@@ -2657,6 +2667,7 @@ String stateMeasures() {
#endif #endif
SYSdata["msgprc"] = queueLengthSum; SYSdata["msgprc"] = queueLengthSum;
SYSdata["msgblck"] = blockedMessages; SYSdata["msgblck"] = blockedMessages;
SYSdata["msgrcv"] = receivedMessages;
SYSdata["maxq"] = maxQueueLength; SYSdata["maxq"] = maxQueueLength;
SYSdata["cnt_index"] = cnt_index; SYSdata["cnt_index"] = cnt_index;
#ifdef ESP32 #ifdef ESP32