版本3.0.1
IOT_MQTT_Yield
wrapper_mqtt_yield
_mqtt_cycle
iotx_mc_cycle
iotx_mc_read_packet
三次read,一次用来判断是否有数据来,一次用来解析包长,一次用来收取整个包。
rc = c->ipstack.read(&c->ipstack, c->buf_read + len, rem_len, left_t);
if (rem_len > 0) {
if (rc < 0) {
mqtt_err("mqtt read error");
HAL_MutexUnlock(c->lock_read_buf);
return MQTT_NETWORK_ERROR;
} else if (rc != rem_len) {
mqtt_warning("mqtt read timeout");
HAL_MutexUnlock(c->lock_read_buf);
return FAIL_RETURN;
}
}
read返回字节数和需求不一样时候,强制返回错误,并且会丢弃已经读取的数据,此时会导致后续报文解析失败,mqtt协议栈错乱。
出现情况:1、数据包大于mtu需要分包;2、或者下层是慢串口通信时候,会导致一个数据包只有部分达到,即read不到一个完整的包。
解决办法:1. 在给mqtt协议栈喂数据时 ,确保数据包已经完整,即在下层做一下简单报文解析。
2.修改sdk,增加静态buffer,增加need_more状态机状态。
博客围绕版本3.0.1的MQTT协议栈展开,指出在iotx_mc_read_packet函数中三次read操作时,read返回字节数与需求不同会导致协议栈错乱,如数据包大于mtu分包或下层为慢串口通信时易出现该问题,还给出确保数据包完整和修改sdk等解决办法。
5419

被折叠的 条评论
为什么被折叠?



