fix(vd960DBN): MQTT socket 复用 SocketId_TCP,对标官方 WCHNET MQTT 例程

根因分析: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 统一
This commit is contained in:
wangfq
2026-07-06 16:09:22 +08:00
parent 46091639cd
commit 0c8402d726
2 changed files with 12 additions and 42 deletions
@@ -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);
@@ -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
{