MQTT保留消息說明
【請教】MQTT如何清除PUBLISH到某TOPIC的RETAIN=TRUE的數據
解決辦法:向該topic重新publish數據,RETAIN=TRUE,Payload為空。
http://www.steves-internet-guide.com/mqtt-retained-messages-example/
通常,如果發布者向主題發布消息,並且沒有人訂閱該主題,則該消息將被代理放棄。
但是,發布者可以通過設置保留的消息標志來告訴代理保留該主題的最后一條消息。
這可能非常有用,例如,如果您的傳感器僅在更改時發布其狀態,例如門傳感器。如果新訂戶訂閱此狀態會怎樣?
如果沒有保留的消息,訂戶將不得不在收到消息之前等待狀態改變。
然而,對於保留的消息,訂戶將看到傳感器的當前狀態。
重要的是要理解每個主題只保留一條消息。
在該主題上發布的下一條消息將替換該主題的最后一條保留消息。
MQTT保留消息示例概述
在本教程中,我們將使用Python腳本來發布和訂閱消息。
然后,我們將檢查保留消息如何與各種標志和QOS設置一起使用。
您還應該注意我使用干凈的會話以避免混淆。如果您不使用干凈會話,那么您可能會看到已存儲但未保留的消息!
基本過程是這樣的:
- 發布有關未設置保留消息標記的主題的消息,並進行設置
- 訂閱主題消息
- 監控收到的消息並分析結果
我們還將查看發布多條消息以及如何刪除或刪除保留的消息。
參考下面的屏幕截圖:
示例1 - 未設置保留消息標志,並且新訂戶未收到消息,即未收到消息。
示例2 - 設置恢復消息標志,並且新訂戶獲得消息接收消息所指示的最后消息。
示例3 - 保留消息標志設置,我們發布多個消息OFF,OFF2,OFF3。但是,新訂戶僅獲取最后一條消息OFF3。

QOS設置和保留的消息以及刪除保留的消息
下面的屏幕截圖顯示了4個連接示例以演示QOS效果,然后我們如何刪除保留的消息。
示例1:我們通過將QOS設置為0來檢查QOS設置是否有效。我們看到仍然收到保留的消息,並且已發布消息的QOS無效。
示例2:現在我們嘗試通過將保留消息標志設置為False來刪除保留的消息。但是我們注意到他的消息仍然保留。
示例3:現在我們將消息設置為空白,但將保留的消息標志保持為False。消息仍然保留。
示例4 ::最后,我們將消息設置為空白,並將retain標志設置為true,以清除保留的消息。

下表是一個摘要,顯示了QOS,干凈會話標志和保留消息標志如何影響新訂戶接收主題的消息。

注意:處理保留標志的一些方面是依賴於代理實現的。
Python代碼
使用保留標志集發布的代碼是:
client.publish(“bulb1”,“test message”,qos = 0,retain = True)
哪里:
topic = bulb
nessage = test mesage
QOS = 0
Reatained message Flag = True
檢測保留的消息
當您訂閱具有保留消息的主題時,該消息將被傳遞到您的客戶端。
客戶機可以檢測是通過檢查一個保留的消息message.retain標志在上消息回調如顯示在下面的代碼片斷:
def on_message(client,userdata,message): print(“收到消息”,str(message.payload.decode(“utf-8”)),\ “topic”,message.topic,“retain”,message.retain) if message.retain == 1: 打印(“這是保留的消息”)
腳本
我創建了一個Python腳本,它將清除一組主題上保留的消息,並報告保留消息的主題。請參閱MQTT保留消息工具-Python腳本
發布視頻
這是我創建的視頻,其中包含發布消息,還顯示了保留標志的使用。感謝任何反饋。
常見問題和解答
問:如何刪除或刪除保留的消息?
A-發布空白消息,並將retain標志設置為true,以清除保留的消息。
問題 - 消息的QOS是否對保留的消息有影響?
答 - 不,不。
問:我如何知道如果郵件被保留?
答 -您只知道訂閱主題的時間並檢查保留的標志。
問:如果我訂閱主題並收到保留的消息,那么代理/服務器會刪除該消息嗎?
答 -不會。它會保留,並在訂閱時設置為新客戶。
問:如何刪除或清除Mosquitto上所有保留的消息?
A-如果您沒有使用持久性數據庫,那么最簡單的方法是停止並重新啟動mosquitto。否則,您需要訂閱所有主題以檢查並清除保留的消息。您可以使用我的Python腳本來執行此操作。但是,不建議在繁忙的經紀人處使用。
何時使用保留的消息
通常,當消息包含持久數據時,您將發布帶有保留標志的消息。
例如,傳感器可以發布關於其自身的信息,例如固件版本號,IP地址,當前狀態。
此信息不太可能更改,因此您只需使用retain標志發布一次,任何新客戶端都可以檢索該信息。
有關傳感器主題和屬性的信息,請參閱Homie約定。
摘要
所述已保留消息的特征是保持的物體的最后狀態有用的功能,並且是特別有用的,當狀態不經常變化。
服務質量設置不會影響保留的消息。
MQTT按示例系列
相關教程和資源:
- 使用Paho Python MQTT客戶端
- 使用Paho Python客戶端發布消息
- 安裝和測試Mosquitto MQTT代理
- 非常好的入門系列 - 推薦閱讀MQTT要領。
