目测一个 阿里云 C-SDK mqtt通信小bug

 

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

你可能感兴趣的:(浅思)