簡介
當客戶端斷開連接時姓惑,發(fā)送給相關的訂閱者的遺囑消息。以下情況下會發(fā)送 Will Message:
- 服務端發(fā)生了I/O 錯誤或者網絡失斉渎摇溉卓;
- 客戶端在定義的心跳時期失聯皮迟;
- 客戶端在發(fā)送下線包之前關閉網絡連接;
- 服務端在收到下線包之前關閉網絡連接桑寨。
遺囑消息一般通過在客戶端 CONNECT 的時候指定伏尼。如下所示,在連接的時候通過調用 MqttConnectOptions
實例的 setWill
方法來設定尉尾。任何訂閱了下面的主題的客戶端都可以收到該遺囑消息烦粒。
//方法1MqttConnectOptions.setWill(MqttTopic topic, byte[] payload, int qos, boolean retained)//方法2MqttConnectOptions.setWill(java.lang.String topic, byte[] payload, int qos, boolean retained)
使用場景
在客戶端 A 進行連接時候,遺囑消息設定為”offline“代赁,客戶端 B 訂閱這個遺囑主題。當 A 異常斷開時兽掰,客戶端 B 會收到這個”offline“的遺囑消息芭碍,從而知道客戶端 A 離線了。
Connect Flag 報文字段
Bit | 7 | 6 | 5 | 4 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
User Name Flag | Password Flag | Will Retain | Will QoS | Will Flag | Clean Start | Reserved | |
byte 8 | X | X | X | X | X | X | X |
遺囑消息在客戶端正常調用 disconnect 方法之后并不會被發(fā)送孽尽。
Will Flag 作用
簡而言之窖壕,就是客戶端預先定義好,在自己異常斷開的情況下杉女,所留下的最后遺愿(Last Will)瞻讽,也稱之為遺囑(Testament)。這個遺囑就是一個由客戶端預先定義好的主題和對應消息熏挎,附加在CONNECT的可變報文頭部中速勇,在客戶端連接出現異常的情況下,由服務器主動發(fā)布此消息坎拐。
當Will Flag位為1時烦磁,Will QoS和Will Retain才會被讀取,此時消息體中要出現Will Topic和Will Message具體內容哼勇,否則Will QoS和Will Retain值會被忽略掉都伪。
當Will Flag位為0時,則Will Qos和Will Retain無效积担。
命令行示例
下面是一個Will Message的示例:
-
Sub端clientid=sub預定義遺囑消息:
mosquitto_sub --will-topic test --will-payload die --will-qos 2 -t topic -i sub -h 192.168.1.1
-
客戶端 clientid=alive 在 192.168.1.1(EMQ服務器) 訂閱遺囑主題
mosquitto_sub -t test -i alive -q 2 -h 192.168.1.1
異常斷開Sub端與Server端(EMQ服務器)連接陨晶,Pub端收到Will Message 。
高級使用場景
這里介紹一下如何將 Retained 消息與Will 消息結合起來進行使用帝璧。
- 客戶端 A 遺囑消息設定為”offline“先誉,該遺囑主題與一個普通發(fā)送狀態(tài)的主題設定成同一個
A/status
; - 當客戶端 A 連接時聋溜,向主題
A/status
發(fā)送 “online” 的 Retained 消息谆膳,其它客戶端訂閱主題A/status
的時候,獲取 Retained 消息為 “online” 撮躁; - 當客戶端 A 異常斷開時漱病,系統自動向主題
A/status
發(fā)送”offline“的消息买雾,其它訂閱了此主題的客戶端會馬上收到”offline“消息;如果遺囑消息被設定了 Retained 的話杨帽,這時有新的訂閱A/status
主題的客戶端上線的時候漓穿,獲取到的消息為“offline”。