當客戶端斷開鏈接時,發送給相關的訂閱者的遺囑消息。如下狀況下會發送 Will Message:java
遺囑消息通常經過在客戶端 CONNECT 的時候指定。以下所示,在鏈接的時候經過調用 MqttConnectOptions
實例的 setWill
方法來設定。任何訂閱了下面的主題的客戶端均可以收到該遺囑消息。git
//方法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 離線了。github
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 方法以後並不會被髮送。服務器
簡而言之,就是客戶端預先定義好,在本身異常斷開的狀況下,所留下的最後遺願(Last Will),也稱之爲遺囑(Testament)。這個遺囑就是一個由客戶端預先定義好的主題和對應消息,附加在CONNECT的可變報文頭部中,在客戶端鏈接出現異常的狀況下,由服務器主動發佈此消息。網絡
當Will Flag位爲1時,Will QoS和Will Retain纔會被讀取,此時消息體中要出現Will Topic和Will Message具體內容,不然Will QoS和Will Retain值會被忽略掉。ui
當Will Flag位爲0時,則Will Qos和Will Retain無效。spa
下面是一個Will Message的示例:命令行
Sub端clientid=sub預約義遺囑消息:code
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
這裏介紹一下如何將 Retained 消息與Will 消息結合起來進行使用。
A/status
;A/status
發送 「online」 的 Retained 消息,其它客戶端訂閱主題 A/status
的時候,獲取 Retained 消息爲 「online」 ;A/status
發送」offline「的消息,其它訂閱了此主題的客戶端會立刻收到」offline「消息;若是遺囑消息被設定了 Retained 的話,這時有新的訂閱A/status
主題的客戶端上線的時候,獲取到的消息爲「offline」。更多信息請訪問咱們的官網 emqx.io,或關注咱們的開源項目 github.com/emqx/emqx ,詳細文檔請訪問 官方文檔。