MQTT每次断连重连后重复接收到消息

问题:设备与服务器进行通信期间,不断重新配网。与嵌入式联调过程中发现每次取消订阅再重新订阅后,会重复接收到一条消息。MQTT每次断连重连后重复接收到消息
上图为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每次断连重连后重复接收到消息
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