保留消息&心跳機制
Retained message?保留消息
? ? ? ? 作用:和普通消息不同的是當(dāng)我們發(fā)布了一個保留消息以后,任意一個客戶端只要訂閱這個主題就會馬上收到這個主題里的保留消息。
? ? ? ??刪除某個主題保留消息的方式:
? ? ? ?在該主題下發(fā)布一條空的保留消息。
?
? ? ? ??客戶端如何發(fā)布保留消息?
? ? ? ??當(dāng)publish報文中retainFlag設(shè)置為true時,payload下的內(nèi)容將作為保留消息來處理。
?
? ? ? ??什么場合下需要用到保留消息?
? ? ? ?客戶端發(fā)布信息的時間間隔過于長,其他客戶端想要訂閱主題等待的時間可能會很久,不利于客戶端工作,如果用到了保留消息這個機制,訂閱端馬上就可以收到這個主體中最新的消息內(nèi)容。

服務(wù)端根據(jù)客戶端是否能給它發(fā)消息來判斷客戶端服務(wù)端是否與它保持連接。
缺陷:若某客戶端只收取信息不發(fā)布信息,那么MQTT服務(wù)端無法判斷是否保持連接
? ? ? ??心跳機制:要求不常向服務(wù)端發(fā)布消息的客戶端定時向服務(wù)端發(fā)布消息。
? ? ? ??設(shè)置心跳時間間隔/保持連接間隔:客戶端向服務(wù)端發(fā)起連接請求時會向服務(wù)端發(fā)送CONNECT報文,該數(shù)據(jù)包中的KeepAlive就是設(shè)置的地方。
? ? ? ??MQTT客戶端可以設(shè)置一個心跳間隔時間(Keep Alive Timer),表示在每個心跳間隔時間內(nèi)發(fā)送一條消息。如果在這個時間周期內(nèi),沒有業(yè)務(wù)數(shù)據(jù)相關(guān)的消息,客戶端會發(fā)一個PINGREQ消息,相應(yīng)的,服務(wù)器會返回一個PINGRESP消息進(jìn)行確認(rèn)。如果服務(wù)器在一個半(1.5)心跳間隔時間周期內(nèi)沒有收到來自客戶端的消息,就會斷開與客戶端的連接。心跳間隔時間最大值大約可以設(shè)置為18個小時,0值意味著客戶端不斷開。