欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的相关信息在连接时可以设置:
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了。