From b007806ac1c2c66b25f5877c357f4a4d011bb20f Mon Sep 17 00:00:00 2001 From: xdylanm Date: Sun, 30 May 2021 14:13:57 -0700 Subject: [PATCH] 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;