MQTT入门(8)- 保留消息和最后遗嘱
程序员文章站
2022-05-01 09:18:15
...
(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的相关信息在连接时可以设置:
LWT经常和保留消息一起使用,把每个客户端的状态保存到一个Topic下。
比如:可以在 client1/status 里保存online或者offline的信息。
pub_lwt.py
sub_lwt.py
执行以上 sub_lwt.py 和 pub_lwt.py 就会看到接收到两条消息,最后一条就是LWT。
但是如果把pub_lwt.py里注释的 client.disconnect() 放开,就接收不到LWT了。
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的相关信息在连接时可以设置:
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
# 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
# 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了。
上一篇: MQTT入门(9)- 连接和会话