【零基礎(chǔ)學(xué)物聯(lián)網(wǎng)】MQTT篇 2-3 保留消息

為了幫助您學(xué)習(xí),我們專門為本教程制作了視頻。
↓

“保留消息”是十分重要的MQTT概念。通過“保留消息”這一名稱不難判斷,“保留消息”是一種被保留下來的消息。但是這個(gè)“保留消息”為何要被保留?而保留消息又是有什么特殊的用途?這些答案我們將在本節(jié)課揭曉。
保留消息的作用
要講明“保留消息”這一概念,我們先看一個(gè)場景。假設(shè)我們正在利用MQTT協(xié)議開發(fā)一套智能家居物聯(lián)網(wǎng)系統(tǒng)。在該系統(tǒng)中有一臺(tái)專門用于檢測和發(fā)布室溫信息的MQTT客戶端,它每到整點(diǎn)時(shí)就會(huì)測量當(dāng)前室溫并且向MQTT服務(wù)端發(fā)布室溫測量結(jié)果。
假設(shè)在該智能家具物聯(lián)網(wǎng)系統(tǒng)中,還有一臺(tái)環(huán)境信息顯示客戶端。這臺(tái)客戶端的作用就是把當(dāng)前的室溫顯示在屏幕上以便我們實(shí)時(shí)了解室內(nèi)溫度。換句話說,這臺(tái)環(huán)境信息顯示客戶端一啟動(dòng)就會(huì)訂閱室溫主題,這樣室溫檢測客戶端一發(fā)布消息,顯示客戶端就能獲取到最新的溫度消息并顯示在屏幕上了。
假設(shè)某天上午7:00,我們的室溫檢測客戶端將最新的室溫消息發(fā)布到了服務(wù)端,那么訂閱了室溫消息的顯示客戶端也就馬上獲取到室溫消息并且顯示在屏幕上。
然而在7:10的時(shí)候,家里的小狗不小心把顯示客戶端的電源碰掉了,顯示客戶端沒有電也就自動(dòng)關(guān)機(jī)了。我們發(fā)現(xiàn)這一問題后,馬上把顯示客戶端重新通電,客戶端通電啟動(dòng)后會(huì)立刻訂閱室溫主題。
但這時(shí)候問題出現(xiàn)了,室溫測量客戶端每到整點(diǎn)才發(fā)布一次溫度信息。上一次發(fā)布時(shí)間是7:00,下一次發(fā)布時(shí)間是8:00。所以,盡管顯示客戶端訂閱了室溫主題,它還要等到8:00鐘才能收到最新室溫消息。在8:00前的幾十分鐘里,顯示客戶端無法獲知當(dāng)前室溫信息,也就無法將室溫信息顯示在屏幕上供我們查閱。
為了避免以上情況出現(xiàn),我們可以讓室溫測量客戶端在每次向室溫主題發(fā)布消息時(shí)都使用“保留消息”這一模式將溫度信息發(fā)布到服務(wù)端。這樣無論顯示客戶端在任何時(shí)間訂閱室溫主題,都會(huì)馬上收到該主題中的“保留消息”,也就是溫度測量客戶端發(fā)布的最新室溫消息。
發(fā)布保留消息的方法

MQTT設(shè)備發(fā)布的保留消息的流程與發(fā)布普通消息的流程十分類似。唯一區(qū)別是,在發(fā)布保留消息時(shí),MQTT設(shè)備需要將PUBLISH報(bào)文中retainFlag設(shè)置為true(如上圖所示)。
當(dāng)然,如果要發(fā)布非保留消息,那么PUBLISH報(bào)文中retainFlag設(shè)置為false。
修改保留消息的方法
每一個(gè)主題只能有一個(gè)“保留消息”,如果客戶端想要更新“保留消息”,就需要向該主題發(fā)送一條新的“保留消息”,這樣服務(wù)端會(huì)將新的“保留消息”覆蓋舊的“保留消息”。當(dāng)有客戶端訂閱該主題時(shí),服務(wù)端就會(huì)將最新的“保留消息”發(fā)送給訂閱客戶端了。
刪除保留消息的方法
如果要?jiǎng)h除主題的“保留消息”,可以通過向該主題發(fā)布一條空的“保留消息”,也就是發(fā)送一條0字節(jié)payload的“保留消息”

假如您也喜歡太極創(chuàng)客,希望您將本文“分享”給更多的人,讓更多朋友認(rèn)識(shí)我們。您的每一份點(diǎn)贊與投幣,都是對我們最溫暖的鼓勵(lì)與支持。
本文編輯制作:CYNO朔 (https://space.bilibili.com/415252426/)