歡迎閱讀 MQTT 5.0 報文系列 的第五篇文章,。在上一篇中,,我們已經(jīng)介紹了 MQTT 5.0 的 PINGREQ 和 PINGRESP 報文。現(xiàn)在,,我們將介紹下一個控制報文:DISCONNECT,。 在 MQTT 中,客戶端和服務端可以在斷開網(wǎng)絡連接前向?qū)Χ税l(fā)送一個 DISCONNECT 報文,,來指示連接關(guān)閉的原因,。客戶端發(fā)送的 DISCONNECT 報文還可以影響服務端在連接斷開后的行為,,例如是否發(fā)送遺囑消息,,是否更新會話過期間隔。 DISCONNECT 報文示例我們使用 MQTTX CLI 向 公共 MQTT 服務器 發(fā)起一個指定了 Client ID 的客戶端連接,,并將 --reconnect-period 設置為 0 來禁用自動重連,然后在另一個終端中運行相同的命令創(chuàng)建一個使用相同 Client ID 的連接,。 整個過程使用 Wireshark 工具來抓取在客戶端與服務器之間往返的 MQTT 報文,,Linux 環(huán)境可以使用 tcpdump 命令抓取報文,然后導入至 Wireshark 分析,。 以下命令將創(chuàng)建一個 Client ID 為 mqtt-892324 的客戶端連接,,為了避免 Client ID 與別人重復,建議將它改為其他隨機字符串: mqttx conn --hostname broker.emqx.io --mqtt-version 5 --client-id mqtt-892324 \ --reconnect-period 0 在我們發(fā)起第二個連接后,,Wireshark 將捕獲到公共 MQTT 服務器返回給第一個連接的 DISCONNECT 報文: e0 02 8e 00 這四個十六進制字節(jié),,對應著以下報文內(nèi)容: 通過下文對 DISCONNECT 報文結(jié)構(gòu)的介紹,你將了解到如何從原始的報文數(shù)據(jù)中提取你想要的信息,。 DISCONNECT 報文結(jié)構(gòu)固定報頭固定報頭首字節(jié)的高 4 位,,即報文類型字段的值為 14(0b1110),低 4 位全部為 0,,表示這是一個 DISCONNECT 報文,。 可變報頭DISCONNECT 報文的可變報頭按順序包含以下字段:
與之前介紹的其他報文不同,,客戶端和服務端在 DISCONNECT 報文中可以使用的原因碼和屬性是不同的,例如 Session Expiry Interval 屬性就只能在客戶端發(fā)送的 DISCONNECT 報文中使用,,所以我們在上面的列表中均列出了它們的可用范圍,。 有效載荷DISCONNECT 報文不包含有效載荷,。 總結(jié)客戶端和服務端都可以發(fā)送 DISCONNECT 報文,表示準備斷開網(wǎng)絡連接,,報文中的原因碼可以向接收方指示連接關(guān)閉的原因,。當 MQTT 連接意外斷開時,我們可以優(yōu)先查看是否收到了 DISCONNECT 報文以及報文中原因碼的值,。 雖然客戶端和服務端在 DISCONNECT 報文中可以用的原因碼和屬性存在差異,,但我們并不需要強行去記憶它們。它們通常都和對應的機制與行為相關(guān),,例如遺囑消息只會由服務端發(fā)布,,所以希望連接正常關(guān)閉但對端仍要發(fā)布遺囑消息的原因碼 0x04,也會被客戶端使用,。 以上就是對 DISCONNECT 報文的介紹,,在下一篇文章中我們將介紹 MQTT 5.0 增強認證特性所使用的 AUTH 報文,它也是 MQTT 中最后一個報文類型,。 |
|
來自: EMQ映云科技 > 《技術(shù)文章》