深度剖析MQTT協議的整個通訊流程

http://www.elecfans.com/d/587483.htmlhtml

 

MQTT,目前物聯網的最主要的協議,基本全部收費的雲平臺都是基於MQTT協議,好比機智雲,和全部的開放雲平臺好比中國移動的oneNet、百度的雲平臺也都支持MQTT的接入。雖然MQTT很火,可是目前對MQTT的不多,尤爲是在如何移植到嵌入式上來。大部分的平臺商的作法都是跟模塊商合做把MQTT協議集成到WiFi模塊跟GPRS模塊裏面,捆綁一銷售,不讓用戶過多的瞭解物聯網最核心的東西。java

在尚未深刻去了解MQTT協議以前,總覺得是很是複雜的東西,畢竟以前一直想深刻,但無奈在浩淼的網絡裏竟然找不到太多實質的資料。隨時本身對物聯網的不斷探索,愈來愈瞭解整個物聯網的架構,對MQTT瞭解愈來愈深刻。在這篇文章中將帶你們先了解MQTT的協議,在後面的文章,再帶你們怎麼移植MQTT到STM32上,再到怎麼搭建本身的MQTT服務器。服務器

MQTT的基礎知識這些你們經過百度知道均可以瞭解到,這裏主要深刻去剖析MQTT協議的整個通訊流程。可是若是隻是看文字話,你們很難理解。所以咱們藉助Windows下的MQTT客戶端MQTT.fx跟網絡抓包工具Wireshark來一步步分析MQTT。網絡

名字 流向 描述
CONNECT 1 C->S 客戶端請求與服務端創建鏈接
CONNACK 2 S->C 服務端確認鏈接創建
PUBLISH 3 CóS 發佈消息
PUBACK 4 CóS 收到發佈消息確認
PUBREC 5 CóS 發佈消息收到
PUBREL 6 CóS 發佈消息釋放
PUBCOMP 7 CóS 發佈消息完成
SUBSCRIBE 8 C->S 訂閱請求
SUBACK 9 S->C 訂閱確認
UNSUBSCRIBE 10 C->S 取消訂閱
UNSUBACK 11 S->C 取消訂閱確認
PING 12 C->S 客戶端發送PING(鏈接保活)命令
PINGRSP 13 S->C PING命令回覆
DISCONNECT 14 C->S 斷開鏈接

 

上面是MQTT的主要的通訊協議,MQTT是基於TCP長鏈接,首先是先跟MQTT服務器創建TCP鏈接,而後發送登陸請求,要保持長鏈接,還要定時發心跳包跟服務保持鏈接。咱們先用MQTT.fx來登陸開源的MQTT服務看看。架構

安裝好MQTT.fx(注意MQTT.fx是java開發的,電腦要安裝JDK才能安裝打開),一打開裏面就默認有一個開源的MQTT服務M2M Eclipse。點開旁邊的齒輪(設置按鈕)能夠看服務器的域名m2m.eclipse.org,端口號1833(MQTT的默認端口號),下面還有個Keep Alive Interval就是心跳的時間。再打開Wireshark,選擇要捕獲的網絡接口,而後再過濾器輸入tcp.port==1883後回車,只捕獲1883這個端口號的數據包。再點下MQTT.fx的Connect鏈接服務器,就能夠看到Wireshark捕到的數據eclipse


 

能夠看到MQTT協議中本地給服務器發送了一個Connect登陸請求,而後,服務器迴應一個ACK,表示登陸成功。再雙擊Connect Command這條數據包,咱們能夠看到詳細的數據包數據tcp

上面的解析出來的MQTT協議包的內部,下面是對應的二進制數據,這裏咱們能夠對照附件上資料去了解協議的內容。看這裏,你們想是否是若是本身用TCP,再封裝發送下面的二進制數據就能夠完成MQTT的登陸了呢?拿出網絡調試助手來,ping下m2m.eclipse.org獲得IP地址,用端口號1883鏈接,而後發送Wireshark捕到的MQTT登陸協議的二進制數據,能夠看到到服務器迴應了 20 02 00 00 表示登陸成功。工具

再往下Wireshark捕到的數據包,能夠看到每隔必定的時間,本地向服務器發送Ping Request心跳包,相應的服務器也會迴應Ping Response。3d

接下來看MQTT最核心的傳輸協議 Subcribe(定閱)和Publish(推送)。簡單來講就是客戶端口(好比物聯網硬件)Subcribe一個topic(主題)後,其它的客戶端(好比手機)向服務器往這個topic 推送 Payload(有效數據),服務器就會把Payload轉發給定閱這個topic的客戶端(硬件)。調試

這樣就實現了客戶端(手機)經過服務器(MQTT)遠程發送數據給客戶端(物聯網硬件)。同樣用MQTT.fx來實驗。先點Subscribe而後面下面輸入led再點旁邊的Subscribe按鈕來定閱led這個topic。而後回到Publish,同樣在輸入框輸入led這個topic,下面大框就是輸入要推送的數據,輸入on,再點Publish按鈕,就把數據推送出去了。再回到Subcribe界面來能夠看到右邊已經收到有推送過來的數據。若是這是硬件收到這個指令,就能夠去控制點亮LED,咱們就實現遠程控制LED燈。

想深刻了解MQTT這一個過程的話,咱們再回到Wireshark,來看看捕獲到的數據

具體的就不詳細的分析了,你們看附件的文檔來對照就能夠很容易瞭解到。

最後來了解下QoS(定閱等級),分0、一、2三個等級,簡單來講是等級越高越可靠。QoS0,就是推送以後就完事了,至於對方有沒有收到,收到是什麼,數據有沒有丟失,都無論。

QoS1的話就是你收到推送後,你還得返回一個puback給對方,告訴對方收到了,否則對方會覺得你沒收到,隔一段時間後從新給你推送,直到你給對方返回一個Puback爲止。

相關文章
相關標籤/搜索