最新在使用LWIP + MQTT的应用过程中,出现一个很奇怪的问题,当上位机反送的JSON长度过大时,我的stm32收到的数据就会有问题:

上图中成功接收到失败接收口相关1个字节,用wireshark看数据包长度分别是591和590:

发现可能是我的接收BUFF不够大引起的,程序中有MqttRxBuff大小定义为1024,改成2048还是一样接收失败:

看来问题不是在这个BUFF,

接着看MQtt对应的TCP接收BUFF,在LWIP的opt.h中看到有如下一些定义,从图中看到PBUF_POOL_BUFSIZE大小取决到TCP_MESS大小。当前TCP_MESS大小于536 对应计算出的PBUF_POOL_BUFSIZE为592,刚好与我们之前的591相近,看到就是这个问题我们把

按理把这个参数改大后应该可以解决,但是发现实际发现还是不行!

仿真发现数据从路由器发送到MCU时,就已经分成了两包,最终将TCP的接收函数改写成如下问题解决。

/**

* @brief tcp_receiv callback

* @param arg: argument to be passed to receive callback

* @param tpcb: tcp connection control block

* @param err: receive error code

* @retval err_t: retuned error

*/

err_t MqttTcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)

{

struct mqttclinet *es;

err_t ret_err;

int i = 0;

LWIP_ASSERT("arg != NULL",arg != NULL);

es = (struct mqttclinet *)arg;

/* if we receive an empty tcp frame from server => close connection */

if (p == NULL)

{

/* remote host closed connection */

es->state = ES_CLOSING;

if(es->p_tx == NULL)

{

/* we're done sending, close connection */

MqttTcp_connection_close(tpcb, es);

}

else

{

/* send remaining data*/

MqttTcp_send(tpcb, es);

}

ret_err = ERR_OK;

}

/* else : a non empty frame was received from echo server but for some reason err != ERR_OK */

else if(err != ERR_OK)

{

/* free received pbuf*/

pbuf_free(p);

ret_err = err;

}

else if(es->state == ES_CONNECTED)

{

/* Acknowledge data reception */

tcp_recved(tpcb, p->tot_len);

#if 0

// 回显功能

es->p_tx = p;

MqttTcp_send(tpcb, es);

#else

// 将要接收的数据放到BUFF里

if( p->flags == 0 )  //  如果出现了分包的,在这里时行判断

{

MqttRxOffset = p->len;

memcpy((void *)MqttRxTemp,p->payload,p->len);

}

else

{

if( MqttRxOffset )

{

if( (MqttRxBwp + MqttRxOffset) -  MqttRxBrp < MQTTBUFFSIZE   )

{

for( i=0; i<MqttRxOffset; i++ )

{

MqttRxBuff[MqttRxBwp] = MqttRxTemp[i];

MqttRxBwp = (MqttRxBwp+1)%MQTTBUFFSIZE;

}

}

MqttRxOffset = 0;

}

if( (MqttRxBwp + p->tot_len) -  MqttRxBrp < MQTTBUFFSIZE   )

{

for( i=0; i<p->tot_len; i++)

{

MqttRxBuff[MqttRxBwp] = *((uint8_t *)(p->payload)+i);

MqttRxBwp = (MqttRxBwp+1)%MQTTBUFFSIZE;

}

}

}

pbuf_free(p);

#endif

ret_err = ERR_OK;

}

/* data received when connection already closed */

else

{

/* Acknowledge data reception */

tcp_recved(tpcb, p->tot_len);

/* free pbuf and do nothing */

pbuf_free(p);

ret_err = ERR_OK;

}

return ret_err;

}

STM32 LWIP TCP 数据包分包后合并,超过591字节后分会分包问题相关推荐

  1. python拦截tcp数据包,使用python解码TCP数据包

    我正在尝试解码通过TCP连接接收到的数据.数据包很小,不超过100字节.然而,当它们很多的时候,我会收到一些连接在一起的包.有没有办法防止这种情况发生?我用的是蟒蛇 我已经尝试分离数据包,我的来源在下 ...

  2. 网络编程—使用C语言实现发送TCP数据包,以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port;(原理和常见错误分析)

    任务要求: 1.以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port: 2.头部参数自行设定,数据字段为"This is my h ...

  3. TCP数据包的接收过程

    TCP数据包的接收过程 1,一般网卡接收数据是以触发中断来接收的,在网卡driver中,接收到数据时,往kernel的api:netif_rx()丢 2,接着数据被送到IP层ip_local_deli ...

  4. c语言sgoto 标志位,如何在Go中设置TCP数据包的“不分段”标志位?(How to set “don't fragment” flag bit for TCP packet in Go?)...

    如何在Go中设置TCP数据包的"不分段"标志位?(How to set "don't fragment" flag bit for TCP packet in ...

  5. 计算机网络课程设计:发送TCP数据包

    此文章写于2021年6月29日 一.背景概述 TCP(传输控制协议)是一种面向连接的,可靠的传输层协议.TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠的,全双工的数据流传输. 二.设计内 ...

  6. TCP数据包协议格式详解

    出一个专栏把通信协议搞一下吧,万物互联的根本呀. IP 版本4位:4(二进制0100)表示IPv4,6(二进制0110)表示IPv6 报头长度(单位4byte):因为选项长度不确定,取值范围是5-15 ...

  7. 计算机网络课程设计——发送和接收TCP数据包以及发送和捕获ARP数据包

    1.课程设计要求: 发送和接收TCP数据包:TCP是一种面向连接的.可靠的传输层协议.TCP协议工作在网络层IP协议的基础上.本课程设计的目的是设计一个发送和接收TCP数据包的程序,其功能是填充一个T ...

  8. TCP数据包发送的过程及实际问题解决 判断socket是否断开 解决socket数据传输数据丢失的问题

    文章目录 一.头条之问题引出 二.tcp发送数据过程 三.我的问题解决(判断socket是否断开) 四.头条之问题回答 这是篇文章是在看了今日头条后,回想起来自己曾今遇到过的一个关于socket套接字 ...

  9. 探秘TCP数据包中的PSH标志

    今天在用wireshark分析TCP数据包的时候,发现一个特别的标志,PSH,和ACK一块使用的,不太了解,所以查了一下,发现大部分的解释都是不外乎表示这个包是带数据的,发送端告诉接收端,这个数据包以 ...

最新文章

  1. 听webcast的行为型模式篇-迭代器模式(Iterator Pattern) 记录
  2. 存储系统管理服务器,Mainframe的存储管理系统和架构
  3. 使用Jmeter开发app端接口自动化案例实战
  4. Ant简单工程的构建
  5. 开源 ERP 软件 Odoo 提速指南
  6. Spring和SpringBoot学习
  7. 如何安装pandas包
  8. Midjourney 文本转图片接口请求参数
  9. PostgreSQL JDBC 驱动程序版本和JDK关系及下载地址
  10. android 获取权限管理,Android获取超级管理员权限的实现
  11. 苹果电脑和Windows怎么切换 苹果电脑安装双系统的利弊
  12. 让你的桌面起飞吧(OpenSolaris2008.05 VirtualBox WinXP)
  13. 小旋风万能蜘蛛池x9.02开心版/站长必备SEO/永久使用/带教程
  14. 常用文献管理软件比较
  15. VUE+js高德地图2.0API两幅地图联动同步缩放
  16. 用户 'sa' 登录失败的解决方案
  17. 解决联想笔记本电脑经常突然休眠的问题
  18. android 下载管理器简介
  19. 不忘初心,专心练剑!
  20. 推荐系列(一):什么是推荐?

热门文章

  1. Spring MVC 3 深入总结
  2. 解决GIT代码仓库不同步问题
  3. Javascript--Boolean运算符
  4. Recommend索引
  5. UA MATH636 信息论9 有限域简介
  6. UA MATH574M 统计学习II 二元分类例子与高维问题
  7. 图解第一个Matlab仿真实例
  8. learnByWork
  9. dns-prefetch,新打开页面预抓取
  10. Windows上安装scapy