MQTT,目前物聯(lián)網(wǎng)的最主要的協(xié)議,基本所有收費的云平臺都是基于MQTT協(xié)議,比如機智云,和所有的開放云平臺比如中國移動的oneNet、百度的云平臺也都支持MQTT的接入。雖然MQTT很火,但是目前對MQTT的很少,尤其是在如何移植到嵌入式上來。大部分的平臺商的做法都是跟模塊商合作把MQTT協(xié)議集成到WiFi模塊跟GPRS模塊里面,捆綁一銷售,不讓用戶過多的了解物聯(lián)網(wǎng)最核心的東西。
在還沒有深入去了解MQTT協(xié)議之前,總以為是非常復雜的東西,畢竟之前一直想深入,但無奈在浩淼的網(wǎng)絡里居然找不到太多實質(zhì)的資料。隨時自己對物聯(lián)網(wǎng)的不斷探索,越來越了解整個物聯(lián)網(wǎng)的架構,對MQTT了解越來越深入。在這篇文章中將帶大家先了解MQTT的協(xié)議,在后面的文章,再帶大家怎么移植MQTT到STM32上,再到怎么搭建自己的MQTT服務器。
MQTT的基礎知識這些大家通過百度知道都可以了解到,這里主要深入去剖析MQTT協(xié)議的整個通信流程。但是如果只是看文字話,大家很難理解。因此我們借助Windows下的MQTT客戶端MQTT.fx跟網(wǎng)絡抓包工具Wireshark來一步步分析MQTT。
名字 | 值 | 流向 | 描述 |
CONNECT | 1 | C->S | 客戶端請求與服務端建立連接 |
CONNACK | 2 | S->C | 服務端確認連接建立 |
PUBLISH | 3 | CóS | 發(fā)布消息 |
PUBACK | 4 | CóS | 收到發(fā)布消息確認 |
PUBREC | 5 | CóS | 發(fā)布消息收到 |
PUBREL | 6 | CóS | 發(fā)布消息釋放 |
PUBCOMP | 7 | CóS | 發(fā)布消息完成 |
SUBSCRIBE | 8 | C->S | 訂閱請求 |
SUBACK | 9 | S->C | 訂閱確認 |
UNSUBSCRIBE | 10 | C->S | 取消訂閱 |
UNSUBACK | 11 | S->C | 取消訂閱確認 |
PING | 12 | C->S | 客戶端發(fā)送PING(連接保活)命令 |
PINGRSP | 13 | S->C | PING命令回復 |
DISCONNECT | 14 | C->S | 斷開連接 |
上面是MQTT的主要的通信協(xié)議,MQTT是基于TCP長連接,首先是先跟MQTT服務器建立TCP連接,然后發(fā)送登錄請求,要保持長連接,還要定時發(fā)心跳包跟服務保持連接。我們先用MQTT.fx來登錄開源的MQTT服務看看。
安裝好MQTT.fx(注意MQTT.fx是java開發(fā)的,電腦要安裝JDK才能安裝打開),一打開里面就默認有一個開源的MQTT服務M2M Eclipse。點開旁邊的齒輪(設置按鈕)可以看服務器的域名m2m.eclipse.org,端口號1833(MQTT的默認端口號),下面還有個Keep Alive Interval就是心跳的時間。再打開Wireshark,選擇要捕獲的網(wǎng)絡接口,然后再過濾器輸入tcp.port==1883后回車,只捕獲1883這個端口號的數(shù)據(jù)包。再點下MQTT.fx的Connect連接服務器,就可以看到Wireshark捕到的數(shù)據(jù)
可以看到MQTT協(xié)議中本地給服務器發(fā)送了一個Connect登錄請求,然后,服務器回應一個ACK,表示登錄成功。再雙擊Connect Command這條數(shù)據(jù)包,我們可以看到詳細的數(shù)據(jù)包數(shù)據(jù)
上面的解析出來的MQTT協(xié)議包的內(nèi)部,下面是對應的二進制數(shù)據(jù),這里我們可以對照附件上資料去了解協(xié)議的內(nèi)容。看這里,大家想是不是如果自己用TCP,再封裝發(fā)送下面的二進制數(shù)據(jù)就可以完成MQTT的登錄了呢?拿出網(wǎng)絡調(diào)試助手來,ping下m2m.eclipse.org得到IP地址,用端口號1883連接,然后發(fā)送Wireshark捕到的MQTT登錄協(xié)議的二進制數(shù)據(jù),可以看到到服務器回應了20 02 00 00表示登錄成功。
再往下Wireshark捕到的數(shù)據(jù)包,可以看到每隔一定的時間,本地向服務器發(fā)送Ping Request心跳包,相應的服務器也會回應Ping Response。
接下來看MQTT最核心的傳輸協(xié)議Subcribe(定閱)和Publish(推送)。簡單來說就是客戶端口(比如物聯(lián)網(wǎng)硬件)Subcribe一個topic(主題)后,其它的客戶端(比如手機)向服務器往這個topic推送Payload(有效數(shù)據(jù)),服務器就會把Payload轉(zhuǎn)發(fā)給定閱這個topic的客戶端(硬件)。
這樣就實現(xiàn)了客戶端(手機)通過服務器(MQTT)遠程發(fā)送數(shù)據(jù)給客戶端(物聯(lián)網(wǎng)硬件)。一樣用MQTT.fx來實驗。先點Subscribe然后面下面輸入led再點旁邊的Subscribe按鈕來定閱led這個topic。然后回到Publish,一樣在輸入框輸入led這個topic,下面大框就是輸入要推送的數(shù)據(jù),輸入on,再點Publish按鈕,就把數(shù)據(jù)推送出去了。再回到Subcribe界面來可以看到右邊已經(jīng)收到有推送過來的數(shù)據(jù)。如果這是硬件收到這個指令,就可以去控制點亮LED,我們就實現(xiàn)遠程控制LED燈。
想深入了解MQTT這一個過程的話,我們再回到Wireshark,來看看捕獲到的數(shù)據(jù)
具體的就不詳細的分析了,大家看附件的文檔來對照就可以很容易了解到。
最后來了解下QoS(定閱等級),分0、1、2三個等級,簡單來說是等級越高越可靠。QoS0,就是推送之后就完事了,至于對方有沒有收到,收到是什么,數(shù)據(jù)有沒有丟失,都不管。
QoS1的話就是你收到推送后,你還得返回一個puback給對方,告訴對方收到了,不然對方會以為你沒收到,隔一段時間后重新給你推送,直到你給對方返回一個Puback為止。
-
物聯(lián)網(wǎng)
+關注
關注
2904文章
44306瀏覽量
371459 -
MQTT
+關注
關注
5文章
649瀏覽量
22439
原文標題:物聯(lián)網(wǎng)核心之MQTT
文章出處:【微信號:gh_dae0718828df,微信公眾號:gh_dae0718828df】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論