Loading

MQTT协议的消息保留标志位:retained

当生产者发布在topic上一条消息,同时在把retained=1。尽管消费者订阅topic是在发布消息之后,但消费者还是能消费到topic最后一条消息

特别注意:MQTT Broker只会为每一个topic保存最近收到的一条retained=true的消息!也就是说,如果MQTT Broker上已经为某个topic保存了一条retained消息,当生产者再次往该topic发布一条新的retained=true的消息,那么MQTT Broker上原来的那条消息会被覆盖。

一、retained消息保留标志位

1-1 retained=true

MQTTClient_message pubmsg = MQTTClient_message_initializer;
pubmsg.retained = 1;

如果生产者发给Broker的PUBLISH报文的消息保留标志被设置为:retained = 1Broker必须存储这个应用消息和它的服务质量等级(QoS),以便它可以被分发给未来的主题名匹配的订阅者。

一个新的消费者订阅多个topic,Broker会检查每个匹配的主题名中是否有retained=1的消息,如果存在最近保留的消息,它必须被发送给这个订阅者。

1-2 retained=false

MQTTClient_message pubmsg = MQTTClient_message_initializer;
pubmsg.retained = 0;

如果客户端发给服务端的PUBLISH报文的保留标志位:retained= 0,服务端不能存储这个消息也不能移除或替换任何现存的保留消息

二、测试实例

注意:此时生产者已经停止发布消息(retained=true),仅新建消费者程序订阅消息

由上图可知,消费者订阅该主题的最后一条消息:1334

三、替换retained消息

消息覆盖方式:只是将retained=true的消息内容进行覆盖,覆盖的内容长度可以是: len > 0 or len == 0

如果客户端想让MQTT Broker删除某个topic下保存的retained=true消息,唯一的方法是向MQTT Broker发布一条retained=true的空消息

四、retained消息的应用

即使生产者掉线了,消费者一旦上线即刻就能订阅生产者最后一条发布的消息。

五、参考

MQTT的retained标志位的作用

posted @ 2022-10-11 11:53  eiSouthBoy  阅读(1262)  评论(0编辑  收藏  举报