版本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状态机状态。