`
rensanning
  • 浏览: 3515404 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:37509
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:604425
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:678233
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:87357
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:399894
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69092
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:90534
社区版块
存档分类
最新评论

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

 
阅读更多
(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了。
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics