From 3cdc5b62869120c418fc0cfddb5a13e57a3b3523 Mon Sep 17 00:00:00 2001 From: wangfq Date: Tue, 7 Jul 2026 12:09:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20MQTT=20PUBLISH=20=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E2=80=94=20topic=20=E8=BF=87=E6=BB=A4=20+?= =?UTF-8?q?=20cmd/Method=20=E5=8F=8C=E6=A0=BC=E5=BC=8F=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: mqtt_data_manage() 的 PUBLISH 分支直接调用 manage_mqtt_recv_message(), 跳过了 mqtt_deserialize_publish() 的 topic 过滤, 且只支持旧 Method 格式. 修复: - mqtt_data_manage: PUBLISH 改为走 mqtt_deserialize_publish 做 topic 匹配 - mqtt_deserialize_publish: topic 过滤已改用 g_iot_topic.topic_sub - manage_mqtt_recv_message: 优先解析 cmd, 兼容旧 Method 字段 --- .../OnlyUpdateApp_Peripheral/APP/net_srv.c | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c index 8b5e9ee..358e0f7 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/net_srv.c @@ -396,7 +396,12 @@ void mqtt_data_manage(uint8_t id) case PUBLISH: MQTTDeserialize_publish(&dup, &qos, &retained, &packetid, &topicName, &payload, &payloadlen, MyBuf, len); - manage_mqtt_recv_message((char *)payload, payloadlen); + /* V1.01: 通过 mqtt_deserialize_publish 做 topic 过滤 */ + { + char TmpBuf[128] = {0}; + memcpy(TmpBuf, topicName.lenstring.data, topicName.lenstring.len); + mqtt_deserialize_publish(TmpBuf, (char *)payload, payloadlen); + } reset_net_active_timeup(); break; case SUBACK: @@ -1052,7 +1057,12 @@ void manage_mqtt_recv_message(char * msg, int length) } reset_temp_guide(); - simple_parse_json(msg, DPG_API_KEY_METHOD, temp_guide); + + // V1.01: 优先解析新协议 cmd 字段,兼容旧 Method 字段 + simple_parse_json(msg, "\"cmd\"", temp_guide); + if(strlen(temp_guide) == 0) { + simple_parse_json(msg, DPG_API_KEY_METHOD, temp_guide); + } if(strlen(temp_guide) == 0) { @@ -1060,9 +1070,16 @@ void manage_mqtt_recv_message(char * msg, int length) return; } PRINT("Rcv_Dis_LED_m:%s\n", temp_guide); + + // 旧协议: Method = Heartbeat → 回复心跳 if(strstr(temp_guide, "Heartbeat") != NULL) { dev_response_heartbeat(NULL); + } + // 新协议: 解析 cmd 并打印(后续可扩展命令处理) + else if(strlen(temp_guide) > 0) + { + PRINT("MQTT cmd/method: %s, raw: %s\n", temp_guide, msg); } else { PRINT("Unknown MQTT method: %s\n", msg);