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:
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user