作者:狮子小刚刚 | 来源:互联网 | 2023-06-02 16:08
问题:设备与服务器进行通信期间,不断重新配网。与嵌入式联调过程中发现每次取消订阅再重新订阅后,会重复接收到一条消息。
上图为Paho软件测试结果。MQTT测试软件下载地址:
Paho:https://pan.baidu.com/s/1WkiR60EVz6LZQ-NNwyd6MQ
mqtt.fx:https://pan.baidu.com/s/130giQTKQhwSp4qeWKisrrA
收到该条信息解析后解密发现此条信息为更换网络指令,故设备不停断网进行重新配网。
所以我们要解决的问题为:MQTT每次断连重连后重复接收到消息。
经排查后解决办法:
- 发布消息时把retain设置为false
- 删除retain消息,可以发布一个空的retain消息(因为每个新的retain消息都会覆盖最后一个retain消息)
测试如下:
MQTT之保留消息Retained Messages
如果 publish消息的retain标记位被设置为1,则称该消息为“保留消息”
Broker对保留消息的处理Broker会存储每个Topic的最后一条保留消息及其Qos,当订阅该Topic的客户端上线后,Broker需要将该消息投递给它。
publish消息时,如果retain值是true,则服务器会一直记忆,哪怕是服务器重启。
1. 发送空消息体的保留消息
2. 发送最新的保留消息覆盖之前的
《springboot集成MQTT,生产者+消费者+MQTT.FX辅助测试》mqtt代码参见之前博客:https://blog.csdn.net/wfanking/article/details/82658393