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