From e420b722b9471f74a0a3b0623ceb4ca3e106e6be Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Fri, 16 Apr 2021 22:26:38 +0200 Subject: [PATCH] Serialize text in string attribute messages #140 --- src/hasp/hasp_attribute.cpp | 14 +++++++++++--- src/lang/en_US.h | 1 + src/lang/hu_HU.h | 1 + src/lang/nl_NL.h | 1 + src/lang/ro_RO.h | 1 + src/mqtt/hasp_mqtt_pubsubclient.cpp | 2 +- 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index caa13d2f..d11da18a 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -1776,10 +1776,18 @@ void attr_out_str(lv_obj_t* obj, const char* attribute, const char* data) if(hasp_find_id_from_obj(obj, &pageid, &objid)) { if(!attribute || !data) return; - char payload[32 + strlen(data) + strlen(attribute)]; - snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"%s\"}"), attribute, data); + StaticJsonDocument<32> doc; // Total (recommended) size + doc[attribute].set(data); - object_dispatch_state(pageid, objid, payload); + size_t size = measureJson(doc); // strlen(data) + strlen(attribute); + if(size < MQTT_MAX_PACKET_SIZE) { + char payload[MQTT_MAX_PACKET_SIZE]; + serializeJson(doc, payload); + object_dispatch_state(pageid, objid, payload); + + } else { + LOG_ERROR(TAG_ATTR, F(D_MQTT_PAYLOAD_TOO_LONG), size); + } } } diff --git a/src/lang/en_US.h b/src/lang/en_US.h index f62d3d1c..2c99afd1 100644 --- a/src/lang/en_US.h +++ b/src/lang/en_US.h @@ -47,6 +47,7 @@ #define D_MQTT_SUBSCRIBED "Subscribed to %s" #define D_MQTT_NOT_SUBSCRIBED "Failed to subscribe to %s" #define D_MQTT_HA_AUTO_DISCOVERY "Register HA auto-discovery" +#define D_MQTT_PAYLOAD_TOO_LONG "Payload too long (%d bytes)" #define D_TELNET_CLOSING_CONNECTION "Closing session from %s" #define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s" diff --git a/src/lang/hu_HU.h b/src/lang/hu_HU.h index cbb38377..445f1230 100644 --- a/src/lang/hu_HU.h +++ b/src/lang/hu_HU.h @@ -47,6 +47,7 @@ #define D_MQTT_SUBSCRIBED "Feliratkozva: %s" #define D_MQTT_NOT_SUBSCRIBED "Nem sikerült feliratkozni: %s" #define D_MQTT_HA_AUTO_DISCOVERY "Regisztrálás HA automatikus felfedezésre" +#define D_MQTT_PAYLOAD_TOO_LONG "$$$Payload too long (%d bytes)" #define D_TELNET_CLOSING_CONNECTION "Munkamenet befejezése %s-el" #define D_TELNET_CLIENT_LOGIN_FROM "Kliens bejelentkezés innen: %s" diff --git a/src/lang/nl_NL.h b/src/lang/nl_NL.h index 4dc02118..bf32659a 100644 --- a/src/lang/nl_NL.h +++ b/src/lang/nl_NL.h @@ -47,6 +47,7 @@ #define D_MQTT_SUBSCRIBED "Ingeschreven op %s" #define D_MQTT_NOT_SUBSCRIBED "Inschrijving op %s mislukt" #define D_MQTT_HA_AUTO_DISCOVERY "Registeren HA auto-configuratie" +#define D_MQTT_PAYLOAD_TOO_LONG "Payload is te lang (%d bytes)" #define D_TELNET_CLOSING_CONNECTION "Sessie sluiten van %s" #define D_TELNET_CLIENT_LOGIN_FROM "Client aangemeld van %s" diff --git a/src/lang/ro_RO.h b/src/lang/ro_RO.h index fee60c73..ee7e4c51 100644 --- a/src/lang/ro_RO.h +++ b/src/lang/ro_RO.h @@ -47,6 +47,7 @@ #define D_MQTT_SUBSCRIBED "Abonat la %s" #define D_MQTT_NOT_SUBSCRIBED "Abonarea la %s a eșuat" #define D_MQTT_HA_AUTO_DISCOVERY "Înregistrare la auto-descoperire în HA" +#define D_MQTT_PAYLOAD_TOO_LONG "$$$Payload too long (%d bytes)" #define D_TELNET_CLOSING_CONNECTION "Terminarea sesiunii de la %s" #define D_TELNET_CLIENT_LOGIN_FROM "Conectare client de la %s" diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 6628f97d..a89da106 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -149,7 +149,7 @@ int mqtt_send_state(const char* subtopic, const char* payload) static void mqtt_message_cb(char* topic, byte* payload, unsigned int length) { // Handle incoming commands from MQTT if(length + 1 >= mqttClient.getBufferSize()) { - LOG_ERROR(TAG_MQTT_RCV, F("Payload too long (%d bytes)"), length); + LOG_ERROR(TAG_MQTT_RCV, F(D_MQTT_PAYLOAD_TOO_LONG), length); return; } else { payload[length] = '\0';