MQTT入门- 保留消息和最后遗嘱


(1)保留消息Retained Messages 

MQTT中,无论是发布还是订阅都不会有任何触发事件。 

1个Topic只有唯一的retain消息,Broker会保存每个Topic的最后一条retain消息。 
每个Client订阅Topic后会立即读取到retain消息,不必要等待发送。 
订阅Topic时可以使用通配符,就会收到匹配的每个Topic的retain消息。 

发布消息时把retain设置为true,即为保留信息。 
如果需要删除retain消息,可以发布一个空的retain消息,因为每个新的retain消息都会覆盖最后一个retain消息。 

主要应用: 
1)如果订阅者无法和Broker连接,可以通过retain消息让订阅者在下次成功连接时一次性接收所有的内容 
2)发布者定时发布retain消息,订阅者获取该信息后能推测发布者的状态(last good value) 

(2)最后遗嘱LWT(Last Will & Testament) 

MQTT本身就是为信号不稳定的网络设计的,所以难免一些客户端会无故的和Broker断开连接。 

当客户端连接到Broker时,可以指定LWT,Broker会定期检测客户端是否有异常。 
当客户端异常掉线时,Broker就往连接时指定的topic里推送当时指定的LWT消息。 

LWT的相关信息在连接时可以设置: 

Python代码 
 

client = mqtt.Client()
client.will_set('test/rensanning/will', 'Last will message', 0, False)
client.connect('localhost', 1883)


LWT经常和保留消息一起使用,把每个客户端的状态保存到一个Topic下。 
比如:可以在 client1/status 里保存online或者offline的信息。 

pub_lwt.py 

Python代码 

# coding=utf8
import paho.mqtt.client as mqtt
import time

def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))

client = mqtt.Client()
client.on_connect = on_connect
client.will_set('test/rensanning/will', 'Last will message', 0, False)
client.connect("localhost", 1883)

client.loop_start()

msg = "test LWT " +time.ctime()
client.publish("test/rensanning/time", msg, 0)
print("message published")

#client.disconnect()

client.loop_stop()

print "done."


sub_lwt.py 

Python代码  
 

# coding=utf8
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("test/rensanning/#")

def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("localhost", 1883)
client.loop_forever()

 
 
 

执行以上 sub_lwt.py 和 pub_lwt.py 就会看到接收到两条消息,最后一条就是LWT。 
但是如果把pub_lwt.py里注释的 client.disconnect() 放开,就接收不到LWT了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM