MQTT保留消息说明
MQTT保留消息说明
【请教】MQTT如何清除PUBLISH到某TOPIC的RETAIN=TRUE的数据
解决办法:向该topic重新publish数据,RETAIN=TRUE,Payload为空。
http://www.steves-internet-guide.com/mqtt-retained-messages-example/
通常,如果发布者向主题发布消息,并且没有人订阅该主题,则该消息将被代理放弃。
但是,发布者可以通过设置保留的消息标志来告诉代理保留该主题的最后一条消息。
这可能非常有用,例如,如果您的传感器仅在更改时发布其状态,例如门传感器。如果新订户订阅此状态会怎样?
如果没有保留的消息,订户将不得不在收到消息之前等待状态改变。
然而,对于保留的消息,订户将看到传感器的当前状态。
重要的是要理解每个主题只保留一条消息。
在该主题上发布的下一条消息将替换该主题的最后一条保留消息。
MQTT保留消息示例概述
在本教程中,我们将使用Python脚本来发布和订阅消息。
然后,我们将检查保留消息如何与各种标志和QOS设置一起使用。
您还应该注意我使用干净的会话以避免混淆。如果您不使用干净会话,那么您可能会看到已存储但未保留的消息!
基本过程是这样的:
- 发布有关未设置保留消息标记的主题的消息,并进行设置
- 订阅主题消息
- 监控收到的消息并分析结果
我们还将查看发布多条消息以及如何删除或删除保留的消息。
参考下面的屏幕截图:
示例1 - 未设置保留消息标志,并且新订户未收到消息,即未收到消息。
示例2 - 设置恢复消息标志,并且新订户获得消息接收消息所指示的最后消息。
示例3 - 保留消息标志设置,我们发布多个消息OFF,OFF2,OFF3。但是,新订户仅获取最后一条消息OFF3。
QOS设置和保留的消息以及删除保留的消息
下面的屏幕截图显示了4个连接示例以演示QOS效果,然后我们如何删除保留的消息。
示例1:我们通过将QOS设置为0来检查QOS设置是否有效。我们看到仍然收到保留的消息,并且已发布消息的QOS无效。
示例2:现在我们尝试通过将保留消息标志设置为False来删除保留的消息。但是我们注意到他的消息仍然保留。
示例3:现在我们将消息设置为空白,但将保留的消息标志保持为False。消息仍然保留。
示例4 ::最后,我们将消息设置为空白,并将retain标志设置为true,以清除保留的消息。
下表是一个摘要,显示了QOS,干净会话标志和保留消息标志如何影响新订户接收主题的消息。
注意:处理保留标志的一些方面是依赖于代理实现的。
Python代码
使用保留标志集发布的代码是:
client.publish(“bulb1”,“test message”,qos = 0,retain = True)
哪里:
topic = bulb
nessage = test mesage
QOS = 0
Reatained message Flag = True
检测保留的消息
当您订阅具有保留消息的主题时,该消息将被传递到您的客户端。
客户机可以检测是通过检查一个保留的消息message.retain标志在上消息回调如显示在下面的代码片断:
def on_message(client,userdata,message): print(“收到消息”,str(message.payload.decode(“utf-8”)),\ “topic”,message.topic,“retain”,message.retain) if message.retain == 1: 打印(“这是保留的消息”)
脚本
我创建了一个Python脚本,它将清除一组主题上保留的消息,并报告保留消息的主题。请参阅MQTT保留消息工具-Python脚本
发布视频
这是我创建的视频,其中包含发布消息,还显示了保留标志的使用。感谢任何反馈。
常见问题和解答
问:如何删除或删除保留的消息?
A-发布空白消息,并将retain标志设置为true,以清除保留的消息。
问题 - 消息的QOS是否对保留的消息有影响?
答 - 不,不。
问:我如何知道如果邮件被保留?
答 -您只知道订阅主题的时间并检查保留的标志。
问:如果我订阅主题并收到保留的消息,那么代理/服务器会删除该消息吗?
答 -不会。它会保留,并在订阅时设置为新客户。
问:如何删除或清除Mosquitto上所有保留的消息?
A-如果您没有使用持久性数据库,那么最简单的方法是停止并重新启动mosquitto。否则,您需要订阅所有主题以检查并清除保留的消息。您可以使用我的Python脚本来执行此操作。但是,不建议在繁忙的经纪人处使用。
何时使用保留的消息
通常,当消息包含持久数据时,您将发布带有保留标志的消息。
例如,传感器可以发布关于其自身的信息,例如固件版本号,IP地址,当前状态。
此信息不太可能更改,因此您只需使用retain标志发布一次,任何新客户端都可以检索该信息。
有关传感器主题和属性的信息,请参阅Homie约定。
摘要
所述已保留消息的特征是保持的物体的最后状态有用的功能,并且是特别有用的,当状态不经常变化。
服务质量设置不会影响保留的消息。
MQTT按示例系列
相关教程和资源:
- 使用Paho Python MQTT客户端
- 使用Paho Python客户端发布消息
- 安装和测试Mosquitto MQTT代理
- 非常好的入门系列 - 推荐阅读MQTT要领。