MQTT特性 七:保留消息(Retained Messages)

如题所述

第1个回答  2022-07-29
保留消息是一条普通的 MQTT 消息,保留标志设置为 true。代理存储最后保留的消息和该主题的相应 QoS。每个订阅与保留消息主题匹配的主题模式的客户端在订阅后立即收到保留消息。代理仅存储每个主题的一条保留消息。

如果订阅客户端在他们订阅的主题模式中包含通配符,即使保留消息的主题不完全匹配,它也会收到保留消息。下面是一个示例:客户端 A 将保留的消息发布到 myhome/livingroom/temperature。稍后,客户端 B 订阅 myhome/#。客户端 B 订阅myhome/#后直接收到myhome/livingroom/temperature保留消息。客户端 B(订阅客户端)可以看到该消息是保留消息,因为代理发送保留标记为 true 的保留消息。客户端可以决定如何处理保留的消息。

保留消息可帮助新订阅的客户端在订阅主题后立即获得状态更新。保留的消息消除了等待发布客户端发送下一个更新的时间。

换句话说,关于一个主题的保留消息是最后一个已知的好值。保留消息不一定是最后一个值,但它必须是保留标志设置为真的最后一条消息。

重要的是要了解保留的消息与持久会话(我们上周讨论的主题)无关。一旦代理存储了保留的消息,就只有一种方法可以将其删除。继续阅读以了解如何操作。

从开发人员的角度来看,发送保留消息非常简单直接。你刚才设置的 保留了标志 的的 MQTT发布消息 为真。通常,您的客户端库提供了一种设置此标志的简单方法。

还有一种非常简单的方法可以删除主题的保留消息:在要删除之前保留消息的主题上发送带有零字节负载的保留消息。代理删除保留的消息,新订阅者不再获得该主题的保留消息。通常,甚至不需要删除,因为每条新保留的消息都会覆盖前一条消息。
(补充:
发布消息的时候,有一个专门控制保留消息的字段retain
当retain = true,发布不为空的消息,则订阅端连接代理后会自动订阅到发布端发布的最后一条消息
当reatin = false,发布不为空的消息,则订阅端连接代理后不会自动订阅到发布端发布的最后一条消息
当reatin = true,发布空的消息,可以消除代理端保留的发布端发生的最后一条消息,这样订阅端连接代理后不会自动订阅到发布端发布的最后一条消息)

当你希望新连接的订阅者立即接受到消息(无需等到发布客户端发送下一条消息)时,保留消息是有意义的。这对于单个主题的组件或者设备的状态更新非常有用。例如:device1的状态在主题myhome/devices/device1/status上。当使用保留消息时,主题的新订阅者在订阅后立即获得设备的状态(在线/离线)。对于按时间间隔、温度、GPS坐标和其他数据发送数据的客户端也是如此。如果没有保留消息,新的订阅者在发布间隔之间将处于黑暗中。使用保留的消息有助立即为连接的客户端提供最后的良好价值。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网