[BT] MQTT corruption fix (#2183)

Storing a copy of the ID instead of a pointer to a local variable to avoid MQTT publishing id topic and id property corruption.
This commit is contained in:
DigiH authored and GitHub committed 2025-05-16 22:15:57 +02:00
1 parent 585df9a420
commit f0491e188c
4 files changed
+16 -12

No files matched your search

+1 -1
View File
@@ -188,7 +188,7 @@ custom_hardware = Theengs Plug
platform = ${com.esp32_platform} platform = ${com.esp32_platform}
board = esp32dev board = esp32dev
extra_scripts = ${com-esp32.extra_scripts} extra_scripts = ${com-esp32.extra_scripts}
board_build.partitions = partitions/no_coredump.csv board_build.partitions = partitions/alltest_large.csv
lib_deps = lib_deps =
${com-esp32.lib_deps} ${com-esp32.lib_deps}
${libraries.ble} ${libraries.ble}
+10 -10
View File
@@ -82,7 +82,7 @@ bool zBLEConnect::processActions(std::vector<BLEAction>& actions) {
if (NimBLEAddress(it.addr) == m_pClient->getPeerAddress()) { if (NimBLEAddress(it.addr) == m_pClient->getPeerAddress()) {
DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER); DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER);
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
BLEdata["id"] = m_pClient->getPeerAddress().toString().c_str(); BLEdata["id"] = m_pClient->getPeerAddress().toString();
BLEdata["service"] = it.service.toString(); BLEdata["service"] = it.service.toString();
BLEdata["characteristic"] = it.characteristic.toString(); BLEdata["characteristic"] = it.characteristic.toString();
@@ -141,10 +141,10 @@ void LYWSD03MMC_connect::notifyCB(NimBLERemoteCharacteristic* pChar, uint8_t* pD
Log.trace(F("Device identified creating BLE buffer" CR)); Log.trace(F("Device identified creating BLE buffer" CR));
DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER); DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER);
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
auto mac_addr = m_pClient->getPeerAddress().toString().c_str(); auto mac_addr = m_pClient->getPeerAddress().toString();
for (std::vector<BLEdevice*>::iterator it = devices.begin(); it != devices.end(); ++it) { for (std::vector<BLEdevice*>::iterator it = devices.begin(); it != devices.end(); ++it) {
BLEdevice* p = *it; BLEdevice* p = *it;
if ((strcmp(p->macAdr, mac_addr) == 0)) { if (p->macAdr == mac_addr) {
if (p->sensorModel_id == BLEconectable::id::LYWSD03MMC) if (p->sensorModel_id == BLEconectable::id::LYWSD03MMC)
BLEdata["model"] = "LYWSD03MMC"; BLEdata["model"] = "LYWSD03MMC";
else if (p->sensorModel_id == BLEconectable::id::MHO_C401) else if (p->sensorModel_id == BLEconectable::id::MHO_C401)
@@ -211,7 +211,7 @@ void DT24_connect::notifyCB(NimBLERemoteCharacteristic* pChar, uint8_t* pData, s
Log.trace(F("Device identified creating BLE buffer" CR)); Log.trace(F("Device identified creating BLE buffer" CR));
DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER); DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER);
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
auto mac_address = m_pClient->getPeerAddress().toString().c_str(); auto mac_address = m_pClient->getPeerAddress().toString();
BLEdata["model"] = "DT24"; BLEdata["model"] = "DT24";
BLEdata["id"] = mac_address; BLEdata["id"] = mac_address;
Log.trace(F("Device identified in CB: %s" CR), mac_address); Log.trace(F("Device identified in CB: %s" CR), mac_address);
@@ -268,7 +268,7 @@ void BM2_connect::notifyCB(NimBLERemoteCharacteristic* pChar, uint8_t* pData, si
DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER); DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER);
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
BLEdata["model"] = "BM2 Battery Monitor"; BLEdata["model"] = "BM2 Battery Monitor";
BLEdata["id"] = m_pClient->getPeerAddress().toString().c_str(); BLEdata["id"] = m_pClient->getPeerAddress().toString();
mbedtls_aes_context aes; mbedtls_aes_context aes;
mbedtls_aes_init(&aes); mbedtls_aes_init(&aes);
unsigned char output[16]; unsigned char output[16];
@@ -353,7 +353,7 @@ void HHCCJCY01HHCC_connect::publishData() {
DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER); DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER);
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
BLEdata["model"] = "HHCCJCY01HHCC"; BLEdata["model"] = "HHCCJCY01HHCC";
BLEdata["id"] = m_pClient->getPeerAddress().toString().c_str(); BLEdata["id"] = m_pClient->getPeerAddress().toString();
BLEdata["batt"] = (int)batteryValue; BLEdata["batt"] = (int)batteryValue;
buildTopicFromId(BLEdata, subjectBTtoMQTT); buildTopicFromId(BLEdata, subjectBTtoMQTT);
enqueueJsonObject(BLEdata, QueueSemaphoreTimeOutTask); enqueueJsonObject(BLEdata, QueueSemaphoreTimeOutTask);
@@ -377,7 +377,7 @@ void XMWSDJ04MMC_connect::notifyCB(NimBLERemoteCharacteristic* pChar, uint8_t* p
Log.trace(F("Device identified creating BLE buffer" CR)); Log.trace(F("Device identified creating BLE buffer" CR));
DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER); DynamicJsonDocument BLEdataBuffer(JSON_MSG_BUFFER);
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
auto mac_address = m_pClient->getPeerAddress().toString().c_str(); auto mac_address = m_pClient->getPeerAddress().toString();
BLEdata["model"] = "XMWSDJ04MMC"; BLEdata["model"] = "XMWSDJ04MMC";
BLEdata["id"] = mac_address; BLEdata["id"] = mac_address;
Log.trace(F("Device identified in CB: %s" CR), mac_address); Log.trace(F("Device identified in CB: %s" CR), mac_address);
@@ -490,7 +490,7 @@ bool SBS1_connect::processActions(std::vector<BLEAction>& actions) {
if (result || it.ttl <= 1) { if (result || it.ttl <= 1) {
StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer; StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer;
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
BLEdata["id"] = m_pClient->getPeerAddress().toString().c_str(); BLEdata["id"] = m_pClient->getPeerAddress().toString();
BLEdata["state"] = std::string(it.value); BLEdata["state"] = std::string(it.value);
buildTopicFromId(BLEdata, subjectBTtoMQTT); buildTopicFromId(BLEdata, subjectBTtoMQTT);
enqueueJsonObject(BLEdata, QueueSemaphoreTimeOutTask); enqueueJsonObject(BLEdata, QueueSemaphoreTimeOutTask);
@@ -585,7 +585,7 @@ bool SBBT_connect::processActions(std::vector<BLEAction>& actions) {
if (result || it.ttl <= 1) { if (result || it.ttl <= 1) {
StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer; StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer;
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
BLEdata["id"] = it.addr.toString().c_str(); BLEdata["id"] = it.addr.toString();
if (value != -99 || value != -1) if (value != -99 || value != -1)
BLEdata["tilt"] = value; BLEdata["tilt"] = value;
if (value == 50) { if (value == 50) {
@@ -687,7 +687,7 @@ bool SBCU_connect::processActions(std::vector<BLEAction>& actions) {
if (result || it.ttl <= 1) { if (result || it.ttl <= 1) {
StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer; StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer;
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
BLEdata["id"] = it.addr.toString().c_str(); BLEdata["id"] = it.addr.toString();
if (value != -99 || value != -1) if (value != -99 || value != -1)
BLEdata["position"] = value; BLEdata["position"] = value;
buildTopicFromId(BLEdata, subjectBTtoMQTT); buildTopicFromId(BLEdata, subjectBTtoMQTT);
+1 -1
View File
@@ -1400,7 +1400,7 @@ void immediateBTAction(void* pvParameters) {
gatewayState = GatewayState::ERROR; gatewayState = GatewayState::ERROR;
StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer; StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer;
JsonObject BLEdata = BLEdataBuffer.to<JsonObject>(); JsonObject BLEdata = BLEdataBuffer.to<JsonObject>();
BLEdata["id"] = BLEactions.back().addr.toString().c_str(); BLEdata["id"] = BLEactions.back().addr.toString();
BLEdata["success"] = false; BLEdata["success"] = false;
buildTopicFromId(BLEdata, subjectBTtoMQTT); buildTopicFromId(BLEdata, subjectBTtoMQTT);
enqueueJsonObject(BLEdata, QueueSemaphoreTimeOutTask); enqueueJsonObject(BLEdata, QueueSemaphoreTimeOutTask);
+4
View File
@@ -0,0 +1,4 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
app0, app, ota_0, 0x10000, 0x200000,
spiffs, data, spiffs, 0x310000,0x4F000,
1 # Name Type SubType Offset Size Flags
2 nvs data nvs 0x9000 0x5000
3 app0 app ota_0 0x10000 0x200000
4 spiffs data spiffs 0x310000 0x4F000