From a7e913a40ee63927a83b5e48db9c9f82835a9352 Mon Sep 17 00:00:00 2001 From: Romuald Conty Date: Fri, 27 Feb 2026 21:14:07 +0100 Subject: [PATCH] fix: correct OTA firmware subscribe topic to match server expectation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FIRMWARE_RESPONSE_SUBSCRIBE_TOPIC was "v2/fw/response/+" but the ThingsBoard server only accepts "v2/fw/response/+/chunk/+". The wrong topic caused a SUBACK rejection on every MQTT connect, which in turn made the SDK send fw_state=FAILED / fw_error="Subscribing the given topic (v2/fw/response/+) failed" as telemetry — polluting the device firmware state on the dashboard. The subscribe topic was also inconsistent with its two sibling constants defined on adjacent lines (FIRMWARE_RESPONSE_TOPIC and FIRMWARE_REQUEST_TOPIC), both of which already include the /chunk/ segment. Server reference: MqttTopics.DEVICE_FIRMWARE_RESPONSES_TOPIC resolves to "v2/fw/response/+/chunk/+" and MqttTransportHandler.processSubscribe() rejects anything else with TOPIC_FILTER_INVALID. --- src/OTA_Firmware_Update.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OTA_Firmware_Update.h b/src/OTA_Firmware_Update.h index e8095e6b..b2a461d2 100644 --- a/src/OTA_Firmware_Update.h +++ b/src/OTA_Firmware_Update.h @@ -13,7 +13,7 @@ uint8_t constexpr OTA_ATTRIBUTE_KEYS_AMOUNT = 5U; char constexpr NO_FW_REQUEST_RESPONSE[] = "Did not receive requested shared attribute firmware keys. Ensure keys exist and device is connected"; // Firmware topics. char constexpr FIRMWARE_RESPONSE_TOPIC[] = "v2/fw/response/%u/chunk/"; -char constexpr FIRMWARE_RESPONSE_SUBSCRIBE_TOPIC[] = "v2/fw/response/+"; +char constexpr FIRMWARE_RESPONSE_SUBSCRIBE_TOPIC[] = "v2/fw/response/+/chunk/+"; char constexpr FIRMWARE_REQUEST_TOPIC[] = "v2/fw/request/%u/chunk/%u"; // Firmware data keys. char constexpr CURR_FW_TITLE_KEY[] = "current_fw_title";