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 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
|
uint8_t g_iot_socket = 0xFF; // MQTT TCP socket ID
|
||||||
IotMqttState g_iot_state = IOT_STATE_DISCONNECTED;
|
IotMqttState g_iot_state = IOT_STATE_DISCONNECTED;
|
||||||
uint8_t g_iot_msg_id = 0; // MQTT packet identifier
|
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) {
|
static void iot_connect_broker(void) {
|
||||||
uint8_t broker_ip[4];
|
g_iot_socket = SocketId_TCP; // 复用已创建的 MQTT socket
|
||||||
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_state = IOT_STATE_TCP_CONNECTING;
|
g_iot_state = IOT_STATE_TCP_CONNECTING;
|
||||||
_iot_connect_start = mstick();
|
_iot_connect_start = mstick();
|
||||||
PRINT("IOT: TCP connecting to broker (sock=%d)...\n", g_iot_socket);
|
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_net_state.flag == 2)
|
||||||
{
|
{
|
||||||
if(g_sub_code_enable.iot_enable){
|
if(g_sub_code_enable.iot_enable){
|
||||||
// IoT MQTT 模式由 iot_connect_broker() 自行管理 socket,
|
if(iot_net_info.mode == IOT_Addr_IP_Mode){
|
||||||
// 不要在此重复创建,直接推进状态
|
if(get_ipstr_to_array(iot_net_info.remote_addr, RemoteIP) == 0){
|
||||||
g_net_state.flag = 3;
|
WCHNET_CreateTcpMqttSocket();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//DNS
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user