From b007806ac1c2c66b25f5877c357f4a4d011bb20f Mon Sep 17 00:00:00 2001 From: xdylanm Date: Sun, 30 May 2021 14:13:57 -0700 Subject: [PATCH 1/2] Fixed length calculation when payload exceeds 128bytes --- Adafruit_MQTT.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Adafruit_MQTT.cpp b/Adafruit_MQTT.cpp index bb7f8cf..7c593f1 100644 --- a/Adafruit_MQTT.cpp +++ b/Adafruit_MQTT.cpp @@ -728,19 +728,20 @@ uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic, // Calculate additional bytes for length field (if any) uint16_t additionalLen = packetAdditionalLen(len + bLen); - // Payload length. When maxPacketLen provided is 0, let's + // Payload remaining length. When maxPacketLen provided is 0, let's // assume buffer is big enough. Fingers crossed. - if (maxPacketLen == 0 || (len + bLen + 2 + additionalLen <= maxPacketLen)) { - len += bLen + additionalLen; - } else { + // 2 + additionalLen: header byte + remaining length field (from 1 to 4 bytes) + // len = topic size field + value (string) + // bLen = buffer size + if (!(maxPacketLen == 0 || (len + bLen + 2 + additionalLen <= maxPacketLen))) { // If we make it here, we got a pickle: the payload is not going // to fit in the packet buffer. Instead of corrupting memory, let's // do something less damaging by reducing the bLen to what we are // able to accomodate. Alternatively, consider using a bigger // maxPacketLen. bLen = maxPacketLen - (len + 2 + packetAdditionalLen(maxPacketLen)); - len = maxPacketLen - 4; } + len += bLen; // remaining len excludes header byte & length field // Now you can start generating the packet! p[0] = MQTT_CTRL_PUBLISH << 4 | qos << 1; From a2bdbacb17f4445239e92873a6ebde54211aa76a Mon Sep 17 00:00:00 2001 From: xdylanm Date: Sun, 30 May 2021 16:16:14 -0700 Subject: [PATCH 2/2] format --- Adafruit_MQTT.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adafruit_MQTT.cpp b/Adafruit_MQTT.cpp index 7c593f1..d167c32 100644 --- a/Adafruit_MQTT.cpp +++ b/Adafruit_MQTT.cpp @@ -733,7 +733,8 @@ uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic, // 2 + additionalLen: header byte + remaining length field (from 1 to 4 bytes) // len = topic size field + value (string) // bLen = buffer size - if (!(maxPacketLen == 0 || (len + bLen + 2 + additionalLen <= maxPacketLen))) { + if (!(maxPacketLen == 0 || + (len + bLen + 2 + additionalLen <= maxPacketLen))) { // If we make it here, we got a pickle: the payload is not going // to fit in the packet buffer. Instead of corrupting memory, let's // do something less damaging by reducing the bLen to what we are