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 = 1
,Broker
必须存储这个应用消息和它的服务质量等级(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消息的应用
即使生产者掉线了,消费者一旦上线即刻就能订阅生产者最后一条发布的消息。