单片机/MCU论坛
直播中

xiaoniuyy

4年用户 14经验值
擅长:可编程逻辑 嵌入式技术 控制/MCU 车联网
私信 关注

使用W5500,MQTT通信时,SOCK关闭后再重连时失败,接收到多个包文

发送了一次请求连接包文收到了回复但是回复数据后粘包了之前4GMQTT的包文程序实现的是4G和LAN的切换在重新申请MQTT连接LAN前已经挂起了4G任务不知道为什么还会接收到4G应该接收的包文。

4G使用的是SOCKET1和LAN使用的是SOCKET0
4G和LAN网线是在同一个设备上的,有网线,有网络就使用LAN,没有就使用4G。还是说设备订阅topic后,之前4G发送的请求天气的命令,服务器回复后,也会回复给LAN?LAN和4G都订阅了服务器上的同一个topic。
日志打印

.......     //省略了之前4G MQTT通信的日志
[gsm] AT+CMQTTPUB=1,1,60

OK

OK

+CMQTTPUB: 1,0

+CMQTTRXSTART: 1,25,230
+CMQTTRXTOPIC: 1,25
downmsg/42201000004012223
+CMQTTRXPAYLOAD: 1,230
42201000004012223+CMQTTRXSTART: 1,25,230
+CMQTTRXTOPIC: 1,25
downmsg/42201000004012223
+CMQTTRXPAYLOAD: 1,230 
42201000004012223
//这里是4G MQTT通信接收到的数据
[gsm] ip1    rcv:34323230313030303030343031323232330F01003432323031303030303034303132323233007B2268756D223A2234302E30222C227576223A22C8F5222C22647273223A22C8C8222C2277696E6C223A22C8FDBCB6222C22636F32223A223333222C22766F63223A22313332222C226368326F223A223232222C22666C75223A22C9D9B7A2222C22776561223A22C7E7C0CA222C2273706F223A22BDCFCACAD2CB222C22706D31223A22313339222C22646174223A22C8FDD4C2C8FD222C22746D70223A2232322E32222C22706D223A22313137222C2277696E64223A22B1B1B7E7227DC757 //服务器回复的天气消息
[LOG] 网线插入!     //切换为LAN网线了
Publish Topic: upmsg/1000/3, Msg: 42201000004012223
[LOG] 连接断开尝试重连...   //LAN之前连接的SOCK断开了重新连接中
lan_connect_ip 0
初始化
lan_connect_ip 13
连接
 
使用DNS服务器获取服务器地址
 Get [dl22.gps218.com]'s IP address [121.201.107.22] from 192.168.1.1
 服务器IP:121.201.107.22
 服务器端口:9883 
lan_connect_ip 17
SOCK_ESTABLISHED
Platfoem_DevLink
PROID: netdevice,AUIF: neT21201%m*n@871!50,DEVID:42203281200000080
[LOG] IINCHIP_READ
[LOG] return ret
//向服务器发送连接请求
[PD] mqtt send:103D00044D51545404C001000011343232303332383132303030303030383000096E657464657669636500136E65543231323031256D2A6E40383731213530
//接收到服务器的回复 20020100 后面的数据是天气数据了
lan rec len:1028 [200201003081020019646F776E6D73672F343232303130303030303430313232323334323230313030303030343031323232330F01003432323031303030303034303132323233007B2268756D223A2234302E30222C227576223A22C8F5222C22647273223A22C8C8222C2277696E6C223A22C8FDBCB6222C22636F32223A223333222C22766F63223A22313332222C226368326F223A223232222C22666C75223A22C9D9B7A2222C22776561223A22C7E7C0CA222C2273706F223A22BDCFCACAD2CB222C22706D31223A22313339222C22646174223A22C8FDD4C2C8FD222C22746D70223A2232322E32222C22706D223A22313137222C2277696E64223A22B1B1B7E7227DC7573081020019646F776E6D73672F343232303130303030303430313232323334323230313030303030343031323232330F01003432323031303030303034303132323233007B2268756D223A2234302E30222C227576223A22C8F5222C22647273223A22C8C8222C2277696E6C223A22C8FDBCB6222C22636F32223A223333222C22766F63223A22313332222C226368326F223A223232222C22666C75223A22C9D9B7A2222C22776561223A22C7E7C0CA222C2273706F223A22BDCFCACAD2CB222C22706D31223A22313339222C22646174223A22C8FDD4C2C8FD222C22746D70223A2232322E32222C22706D223A22313137222C2277696E64223A22B1B1B7E7227DC7573081020019646F776E6D73672F343232303130303030303430313232323334323230313030303030343031323232330F01003432323031303030303034303132323233007B2268756D223A2234302E30222C227576223A22C8F5222C22647273223A22C8C8222C2277696E6C223A22C8FDBCB6222C22636F32223A223333222C22766F63223A22313332222C226368326F223A223232222C22666C75223A22C9D9B7A2222C22776561223A22C7E7C0CA222C2273706F223A22BDCFCACAD2CB222C22706D31223A22313339222C22646174223A22C8FDD4C2C8FD222C22746D70223A2232322E32222C22706D223A22313137222C2277696E64223A22B1B1B7E7227DC7573081020019646F776E6D73672F343232303130303030303430313232323334323230313030303030343031323232330F01003432323031303030303034303132323233007B2268756D223A2234302E30222C227576223A22C8F5222C22647273223A22C8C8222C2277696E6C223A22C8FDBCB6222C22636F32223A223333222C22766F63223A22313332222C226368326F223A223232222C22666C75223A22C9D9B7A2222C22776561223A22C7E7C0CA222C2273706F223A22BDCFCACAD2CB222C22706D31223A22313339222C22646174223A22C8FDD4C2C8FD222C22746D70223A2232322E32222C22706D223A22313137222C
]
Tips:	连接成功 //不知道为什么
Subscribe Topic: downmsg/42201000004012223
[LOG] IINCHIP_READ
[LOG] return ret

//不知道为什么设备重启了内存泄漏了吗还是MQTT数据包解析不成功返回的数据粘包了
[boot] start...
[boot] jump to app...
[flash] ID:EF15
[sys] read sys param
[sys] read sn param
[sys] read run param

不知道为什么设备重启了内存泄漏了吗还是MQTT数据包解析不成功返回的数据粘包了或者说是4G影响到了LAN

回帖(3)

xiaoniuyy

2023-10-10 20:44:39
4G和LAN网线是在同一个设备上的,有网线,有网络就使用LAN,没有就使用4G。还是说设备订阅topic后,之前4G发送的请求天气的命令,服务器回复后,也会回复给LAN?LAN和4G都订阅了服务器上的同一个topic。
举报

xiaoniuyy

2023-10-10 20:49:03
lan模式下的数据接收函数,服务器向设备发送的下行数据使用的是 QoS 1
  1. void lan_recv_proc(unsigned short urclen)
  2. {
  3.         u8 *buf=NULL;
  4.         buf = (u8 *)pvPortMalloc(urclen+1);
  5.         if(buf == NULL)
  6.         {
  7.                 return;
  8.         }
  9.         memset_t((u8 *)gLanRecvBuf, 0, sizeof(gLanRecvBuf));
  10.         recv(SOCK_LAN,gLanRecvBuf,urclen);/*接收来自Server的数据*/
  11.         memset_t((u8 *)buf,0,urclen+1);
  12.         memcpy_t((u8 *)buf, gLanRecvBuf, urclen);
  13.         LOG("lan rec len:%d [",urclen); //重新发送连接请求时,urclen应该是4,但是这里是1028,粘连了4G之前接收的数据,但之前4G每次发送都有接收到数据
  14.         LOGX((u8 *)gLanRecvBuf,urclen);
  15.         LOG("]\r\n");
  16.         if(urclen <128)
  17.         {
  18.                 for(int i = 0; i < urclen; i++)
  19.                 {
  20.                         w5500_buf[i] = gLanRecvBuf[i];
  21.                 }
  22.         }
  23.                 OS_SendMessage(xLANQueueId, MSG_LAN_RECV_SOCKET, (u32)buf, (urclen<<16)|0);
  24. }
举报

孙成红

2023-10-11 11:26:33
201000004012223+CMQTTDISC: 1[lan] Connected to MQTT broker: mqtt://192.168.1.100:1883[lan] Sending CONNECT message[lan] Received CONNACK message[lan] Sending SUBSCRIBE message[lan] Received SUBACK message[lan] MQTT Connection successful![lan] Sending PUBLISH message[lan] Received PUBACK message[4g] AT+CMQTTPUB=1,1,60OKOK+CMQTTPUB: 1,0+CMQTTRXSTART: 1,25,230+CMQTTRXTOPIC: 1,25downmsg/42201000004012223+CMQTTRXPAYLOAD: 1,23042201000004012223+CMQTTRXSTART: 1,25,230+CMQTTRXTOPIC: 1,25downmsg/42201000004012223+CMQTTRXPAYLOAD: 1,23042 201000004012223+CMQTTDISC: 1[lan] Sending PUBLISH message[lan] Received PUBACK message

分析:

从日志中可以看出,在4G通信中发送了连接请求包文,并收到了回复。

接着,在LAN通信重连成功后,发送了连接请求、订阅请求和发布请求,并都成功地收到了回复。

但是,在LAN通信还没连上之前,4G通信就已经被挂起了,这就说明程序中没有正确处理SOCKET的关闭和切换操作。

另外,在接收4G消息的时候,出现了粘包的情况,这可能是由于4G通信时,未能正确处理分包和合并包的情况导致的。

解决方案:

1. 在切换SOCKET时,确保先关闭旧的SOCKET,再打开新的SOCKET。并在SOCKET关闭时,清空SOCKET的缓冲区。

2. 在读取SOCKET数据时,先判断是否完整接收到了一个完整的数据包,如果没有,则继续等待数据的到来,并正确处理分包和合并包的情况。

3. 在处理MQTT消息包文时,要注意正确区分不同包文之间的分隔符,并处理好粘包和错误的包文情况。

4. 在程序中加入调试日志,并进行适当的调试和测试。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分