espressif/ESP8266_NONOS_SDK

很大的坑! demo示例中 mqtt 库的数据接收函数为什么不做黏包处理呢?

ICAN1992 opened this issue · 0 comments

我在产品中使用了 NONOS_SDK+MQTT, 当瞬间接收大量消息后,出现无法正常发布消息,且无法自动恢复的情况, 经过分析原因,发现在 SKD\examples\esp_mqtt_proj\mqtt\mqtt.c 这个文件中,函数 mqtt_tcpclient_recv 是 socket 的回调函数,这里直接把 tcp 接收的数据当做一个完整的 mqtt 数据包去处理, 竟然没有考虑 TCP黏包问题, 这么做导致忽然接收大量数据时,意外出现 QOS = 2 的消息, 错误的执行到 case MQTT_MSG_TYPE_PUBREL: 这里, 现象是后续无法在正常发布任何消息,必须重启恢复。
TCP黏包处理是任何基于 TCP 通讯的应用最基础的数据处理, 希望官方重视该问题,并予以修复, 不然这库只能做玩具,做产品太不可靠了。