目测一个 阿里云 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状态机状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值