文章目录
- Retained Messages(保留的信息)
- Send a retained message(发送保留信息)
- Delete a retained message(删除一个保留的信息)
- Why and when should you use Retained Messages?(为什么以及何时应使用保留信息?)
作者:HiveMQ团队
类别:MQTT要点 MQTT
发表于: 2015年3月2日
欢迎来到MQTT要点的第八部分。这是一个由十部分组成的博客系列,介绍了MQTT协议的核心功能和概念。这篇文章介绍了保留的消息。在这篇博文的末尾,你会发现一个关于同一主题的视频。
在MQTT中,发布消息的客户端不能保证订阅的客户端真的收到该消息。发布的客户端只能确保消息被安全地传递给代理。基本上,订阅的客户端也是如此。连接和订阅主题的客户端不能保证发布客户端何时在他们感兴趣的主题中发布消息。发布者可能需要几秒钟、几分钟或几个小时才能在某个订阅的主题中发送一条新消息。在下一条消息被发布之前,订阅的客户端完全不知道该主题的当前状态。这种情况就是保留信息发挥作用的地方。
Retained Messages(保留的信息)
保留的消息是一个正常的MQTT消息,其保留的标志被设置为真。代理商存储最后一条保留消息和该主题的相应QoS。 每个订阅了与保留消息的主题相匹配的主题模式的客户,在他们订阅后立即收到保留消息。经纪人对每个主题只存储一条保留信息。
如果订阅的客户端在他们订阅的主题模式中包括通配符,即使保留的信息的主题不是完全匹配的,它也会收到保留的信息。这里有一个例子。客户端A发布了一条保留信息到myhome/livingroom/temperature。过了一段时间,客户B订阅了myhome/#。客户端B在订阅myhome/#后直接收到myhome/livingroom/temperature的保留信息。客户端B(订阅的客户端)可以看到该消息是一个保留的消息,因为经纪人在发送保留的消息时,保留的标志设置为真。客户端可以决定它要如何处理保留的消息。
保留消息帮助新订阅的客户在订阅一个主题后立即获得状态更新。保留信息消除了等待发布客户端发送下一个更新的时间。
换句话说,一个主题的保留信息是最后一个已知的好值。保留的信息不一定是最后一个值,但它必须是保留标志设置为 "true "的最后一个信息。
重要的是要理解,保留的消息与持久性会话无关(我们上周已经讨论过这个问题)。一旦经纪商存储了保留的信息,就只有一种方法可以删除它。继续阅读,了解如何删除。
Send a retained message(发送保留信息)
从开发者的角度来看,发送一个保留的消息是非常简单和直接的。你只需将MQTT发布消息的保留标志设置为真。一般来说,你的客户端库提供了一个简单的方法来设置这个标志。
Delete a retained message(删除一个保留的信息)
也有一个非常简单的方法来删除一个主题的保留信息:在你想删除以前的保留信息的主题上发送一个带有零字节有效载荷的保留信息。经纪人删除保留的信息,新的订阅者不再得到该主题的保留信息。通常情况下,甚至没有必要删除,因为每条新的保留信息都会覆盖以前的信息。
Why and when should you use Retained Messages?(为什么以及何时应使用保留信息?)
当你想让新连接的订阅者立即收到消息时,保留消息是有意义的(不用等到发布客户端发送下一条消息)。 这对于组件或设备在单个主题上的状态更新非常有帮助。例如,设备1的状态是在主题myhome/devices/device1/status上。当使用保留信息时,主题的新订阅者在订阅后立即得到设备的状态(在线/离线)。对于以间隔、温度、GPS坐标和其他数据发送数据的客户端也是如此。如果没有保留的信息,新的订户就会在发布间隔期内被蒙在鼓里。 使用保留信息有助于立即向连接的客户提供最后的良好价值。
我们的MQTT精华系列的第八部分就到此为止。我们希望你喜欢它。在下一篇文章中,我们将谈论一个叫做 "最后的遗嘱 "的功能。这个功能使我们有可能在客户端突然断开连接时发送最后一条消息。
祝您有一个愉快的一周,我们希望在下一个MQTT星期一见到您!
如果你想在每篇新文章发布后立即得到通知,请使用订阅表来注册我们的新闻通讯。如果你喜欢RSS,你可以在这里订阅我们的RSS源。