From 0c8402d726c1e13405da1e2de90bbe6a793bf0e0 Mon Sep 17 00:00:00 2001 From: wangfq Date: Mon, 6 Jul 2026 16:09:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(vd960DBN):=20MQTT=20socket=20=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=20SocketId=5FTCP=EF=BC=8C=E5=AF=B9=E6=A0=87=E5=AE=98?= =?UTF-8?q?=E6=96=B9=20WCHNET=20MQTT=20=E4=BE=8B=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因分析:iot_connect_broker 自建 socket 与 WCHNET_CreateTcpMqttSocket 创建的 SocketId_TCP 冲突(重复创建),且自建 socket 的 WCHNET_SocketSend 崩溃。官方 MQTT 例程使用统一的 SocketId/SocketId_TCP 模式。 改动: - peripheral_main.c: 恢复 WCHNET_CreateTcpMqttSocket() 调用 - iot_connect_broker: 不再创建新 socket,直接复用 SocketId_TCP - 全链路(SocketSend/HandleSockInt/poll)通过 g_iot_socket=SocketId_TCP 统一 --- .../APP/iot_mqtt_srv.c | 42 ++----------------- .../APP/peripheral_main.c | 12 ++++-- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c index 9a706d4..b101b8e 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c @@ -32,6 +32,7 @@ extern uint8_t g_report_active; // from tcp_json_srv.c, 0=inactive 1=active +extern uint8_t SocketId_TCP; // from net_srv.c, MQTT socket created by WCHNET_CreateTcpMqttSocket uint8_t g_iot_socket = 0xFF; // MQTT TCP socket ID IotMqttState g_iot_state = IOT_STATE_DISCONNECTED; uint8_t g_iot_msg_id = 0; // MQTT packet identifier @@ -477,46 +478,9 @@ static void iot_send_heartbeat(void) { * 连接管理 *===========================================================================*/ -/* 连接到 MQTT Broker */ +/* 连接到 MQTT Broker — 复用 SocketId_TCP(已由 WCHNET_CreateTcpMqttSocket 创建并连接) */ static void iot_connect_broker(void) { - uint8_t broker_ip[4]; - SOCK_INF sock_inf; - uint8_t ret; - - // 解析 broker 地址 - if (get_ipstr_to_array((char *)iot_net_info.remote_addr, broker_ip) == 0) { - // 是 IP 地址 — get_ipstr_to_array 已将结果写入 broker_ip,无需 memcpy - PRINT("IOT: broker IP %d.%d.%d.%d:%d\n", - broker_ip[0], broker_ip[1], broker_ip[2], broker_ip[3], - iot_net_info.mqtt_port); - } else { - PRINT("IOT: broker hostname=%s (DNS not implemented yet)\n", - iot_net_info.remote_addr); - return; - } - - memset(&sock_inf, 0, sizeof(SOCK_INF)); - sock_inf.DesPort = iot_net_info.mqtt_port; - sock_inf.SourPort = local_net_cfg.port_dev_udp + 1; // 参考 WCHNET_CreateTcpMqttSocket - sock_inf.ProtoType = PROTO_TYPE_TCP; - sock_inf.RecvBufLen = RECE_BUF_LEN; - memcpy(sock_inf.IPAddr, broker_ip, 4); - - ret = WCHNET_SocketCreat(&g_iot_socket, &sock_inf); - if (ret != WCHNET_ERR_SUCCESS) { - PRINT("IOT: SocketCreat failed: 0x%02X\n", ret); - g_iot_socket = 0xFF; - return; - } - - ret = WCHNET_SocketConnect(g_iot_socket); - if (ret != WCHNET_ERR_SUCCESS) { - PRINT("IOT: SocketConnect failed: 0x%02X\n", ret); - WCHNET_SocketClose(g_iot_socket, TCP_CLOSE_NORMAL); - g_iot_socket = 0xFF; - return; - } - + g_iot_socket = SocketId_TCP; // 复用已创建的 MQTT socket g_iot_state = IOT_STATE_TCP_CONNECTING; _iot_connect_start = mstick(); PRINT("IOT: TCP connecting to broker (sock=%d)...\n", g_iot_socket); diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c index c9f49a4..2e85877 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c @@ -238,9 +238,15 @@ void Main_Circulation(void) if(g_net_state.flag == 2) { if(g_sub_code_enable.iot_enable){ - // IoT MQTT 模式由 iot_connect_broker() 自行管理 socket, - // 不要在此重复创建,直接推进状态 - g_net_state.flag = 3; + if(iot_net_info.mode == IOT_Addr_IP_Mode){ + if(get_ipstr_to_array(iot_net_info.remote_addr, RemoteIP) == 0){ + WCHNET_CreateTcpMqttSocket(); + } + } + else{ + //DNS + } + } else {