一 概述
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協(xié)議),是一種基于發(fā)布/訂閱(publish/subscribe)模式的“輕量級”通訊協(xié)議,該協(xié)議構建于TCP/IP協(xié)議上,由IBM在1999年發(fā)布。
MQTT最大優(yōu)點在于,用極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。
作為一種低開銷、低帶寬占用的即時通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設備、移動應用等方面有較廣泛的應用。
二 MQTT協(xié)議特點
MQTT是一個基于客戶端-服務器的消息發(fā)布/訂閱傳輸協(xié)議。
MQTT協(xié)議是輕量、簡單、開放和易于實現(xiàn)的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環(huán)境中,如:機器與機器(M2M)通信和物聯(lián)網(wǎng)(IoT)。
其在,通過衛(wèi)星鏈路通信傳感器、偶爾撥號的醫(yī)療設備、智能家居、及一些小型化設備中已廣泛使用。
MQTT協(xié)議當前版本為,2014年發(fā)布的MQTT v3.1.1。除標準版外,還有一個簡化版MQTT-SN,該協(xié)議主要針對嵌入式設備,這些設備一般工作于TCP/IP網(wǎng)絡,如:ZigBee。
MQTT 與 HTTP 一樣,MQTT 運行在傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議 (TCP/IP) 堆棧之上。
MQTT OSI
發(fā)布和訂閱
MQTT使用的發(fā)布/訂閱消息模式,它提供了一對多的消息分發(fā)機制,從而實現(xiàn)與應用程序的解耦。
這是一種消息傳遞模式,消息不是直接從發(fā)送器發(fā)送到接收器(即點對點),而是由MQTT server(或稱為 MQTT Broker)分發(fā)的。
MQTT 服務器是發(fā)布-訂閱架構的核心。
它可以非常簡單地在Raspberry Pi或NAS等單板計算機上實現(xiàn),當然也可以在大型機或 Internet 服務器上實現(xiàn)。
服務器分發(fā)消息,因此必須是發(fā)布者,但絕不是訂閱者!
客戶端可以發(fā)布消息(發(fā)送方)、訂閱消息(接收方)或兩者兼而有之。
客戶端(也稱為節(jié)點)是一種智能設備,如微控制器或具有 TCP/IP 堆棧和實現(xiàn) MQTT 協(xié)議的軟件的計算機。
消息在允許過濾的主題下發(fā)布。主題是分層劃分的 UTF-8 字符串。不同的主題級別用斜杠/作為分隔符號。
我們來看看下面的設置。
光伏發(fā)電站是發(fā)布者(Publisher)。
主要主題(Topic)級別是"PV",這個工廠發(fā)布兩個子級別"sunshine"和"data";
"PV/sunshine"是一個布爾值(true/fault,也可以是 1/0),充電站需要它來知道是否應該裝載電動汽車(僅在陽光普照時 :))。
充電站(EVSE)是訂閱者,訂閱"PV/sunshine"從服務器獲取信息。
"PV/data" 另一方面,以 kW 為單位傳輸工廠產(chǎn)生的瞬時功率,并且該主題可以例如通過計算機或平板電腦訂閱,以生成一天內(nèi)傳輸功率的圖表。
這就是一個簡單的MQTT的應用場景,具體如下圖所示;
MQTT 發(fā)布和訂閱
QoS(Quality of Service levels)
服務質(zhì)量是 MQTT 的一個重要特性。當我們使用 TCP/IP 時,連接已經(jīng)在一定程度上受到保護。但是在無線網(wǎng)絡中,中斷和干擾很頻繁,MQTT 在這里幫助避免信息丟失及其服務質(zhì)量水平。這些級別在發(fā)布時使用。如果客戶端發(fā)布到 MQTT 服務器,則客戶端將是發(fā)送者,MQTT 服務器將是接收者。當MQTT服務器向客戶端發(fā)布消息時,服務器是發(fā)送者,客戶端是接收者。
QoS 0
這一級別會發(fā)生消息丟失或重復,消息發(fā)布依賴于底層TCP/IP網(wǎng)絡。即:<=1
QoS 1
QoS 1 承諾消息將至少傳送一次給訂閱者。
QoS 2
使用 QoS 2,我們保證消息僅傳送到目的地一次。為此,帶有唯一消息 ID 的消息會存儲兩次,首先來自發(fā)送者,然后是接收者。QoS 級別 2 在網(wǎng)絡中具有最高的開銷,因為在發(fā)送方和接收方之間需要兩個流。
三 MQTT 數(shù)據(jù)包結構
固定頭(Fixed header),存在于所有MQTT數(shù)據(jù)包中,表示數(shù)據(jù)包類型及數(shù)據(jù)包的分組類標識;
可變頭(Variable header),存在于部分MQTT數(shù)據(jù)包中,數(shù)據(jù)包類型決定了可變頭是否存在及其具體內(nèi)容;
消息體(Payload),存在于部分MQTT數(shù)據(jù)包中,表示客戶端收到的具體內(nèi)容;
整體MQTT的消息格式如下圖所示;
3.1 MQTT固定頭
固定頭存在于所有MQTT數(shù)據(jù)包中,其結構如下:
下面簡單分析一下固定頭的消息格式;
MQTT消息類型 / message type
**位置:**byte 1, bits 7-4。
4位的無符號值,類型如下:
標識位 / DUP
**位置:**byte 1, bits 3-0。
在不使用標識位的消息類型中,標識位被作為保留位。如果收到無效的標志時,接收端必須關閉網(wǎng)絡連接:
DUP:發(fā)布消息的副本。用來在保證消息的可靠傳輸,如果設置為 1,則在下面的變長中增加MessageId,并且需要回復確認,以保證消息傳輸完成,但不能用于檢測消息重復發(fā)送。
QoS發(fā)布消息的服務質(zhì)量(前面已經(jīng)做過介紹),即:保證消息傳遞的次數(shù)
00:最多一次,即:<=1
01:至少一次,即:>=1
10:一次,即:=1
11:預留
RETAIN:發(fā)布保留標識,表示服務器要保留這次推送的信息,如果有新的訂閱者出現(xiàn),就把這消息推送給它,如果設有那么推送至當前訂閱者后釋放。
剩余長度(Remaining Length)
位置:byte 1。
固定頭的第二字節(jié)用來保存變長頭部和消息體的總大小的,但不是直接保存的。這一字節(jié)是可以擴展,其保存機制,前7位用于保存長度,后一部用做標識。當最后一位為 1時,表示長度不足,需要使用二個字節(jié)繼續(xù)保存。例如:計算出后面的大小為0
3.2 MQTT可變頭 / Variable header
MQTT數(shù)據(jù)包中包含一個可變頭,它駐位于固定的頭和負載之間。可變頭的內(nèi)容因數(shù)據(jù)包類型而不同,較常的應用是做為包的標識:
很多類型數(shù)據(jù)包中都包括一個2字節(jié)的數(shù)據(jù)包標識字段,這些類型的包有:
PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、
SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK
3.3 Payload消息體
Payload消息體是MQTT數(shù)據(jù)包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的消息 有消息體:
CONNECT,消息體內(nèi)容主要是:客戶端的ClientID、訂閱的Topic、Message以及用戶名和密碼
SUBSCRIBE,消息體內(nèi)容是一系列的要訂閱的主題以及QoS。
SUBACK,消息體內(nèi)容是服務器對于SUBSCRIBE所申請的主題及QoS進行確認和回復。
UNSUBSCRIBE,消息體內(nèi)容是要訂閱的主題。
四 MQTT服務器搭建
目前MQTT代理的主流平臺有下面幾個:
Mosquitto:https://mosquitto.org/
VerneMQ:https://vernemq.com/
EMQTT:http://emqtt.io/
五 MQTT模擬客戶端
目前MQTT主流模擬客戶端有下面幾個:
MQTT fx:https://www.softblade.de/
MQTTX:https://mqttx.app/zh/downloads?os=windows
六 MQTT協(xié)議使用場景
MQTT協(xié)議的應用場景非常豐富,特別是在物聯(lián)網(wǎng)領域。以下是對MQTT協(xié)議應用場景的清晰歸納:
物聯(lián)網(wǎng)設備控制和監(jiān)控:MQTT被廣泛應用于物聯(lián)網(wǎng)設備之間的通信,如智能家居、智能城市和工業(yè)自動化等領域。設備可以發(fā)布自身狀態(tài)到特定主題,用戶或系統(tǒng)可以訂閱這些主題來獲取設備信息,實現(xiàn)對設備的遠程監(jiān)控與控制。
傳感器數(shù)據(jù)傳輸:MQTT可以用于傳感器數(shù)據(jù)的采集、傳輸和監(jiān)控,例如氣象站、環(huán)境監(jiān)測等領域。傳感器將采集到的數(shù)據(jù)通過MQTT協(xié)議發(fā)布到指定的主題,相關系統(tǒng)可以訂閱這些主題以實時獲取數(shù)據(jù)并進行處理。
實時信息發(fā)布和訂閱:MQTT支持實時信息的發(fā)布和訂閱,例如新聞、股票行情、天氣預報等。信息發(fā)布者將信息發(fā)布到特定的主題,信息訂閱者可以訂閱這些主題以實時獲取最新的信息。
聊天應用:MQTT也可以用于實時聊天應用的消息傳輸。通過MQTT協(xié)議,用戶可以實現(xiàn)即時通訊,發(fā)送和接收消息。
遠程監(jiān)控和控制系統(tǒng):在遠程監(jiān)控和控制系統(tǒng)中,MQTT可以用于實現(xiàn)遠程設備的管理和控制。例如,遠程監(jiān)控攝像頭可以通過MQTT協(xié)議將實時視頻流發(fā)布到指定的主題,用戶可以通過訂閱這些主題來查看攝像頭的視頻內(nèi)容。
數(shù)據(jù)傳輸和同步:MQTT還可以用于跨平臺數(shù)據(jù)同步和數(shù)據(jù)備份等場景。通過將數(shù)據(jù)發(fā)布到MQTT主題,不同平臺或設備可以訂閱這些主題以實現(xiàn)數(shù)據(jù)的實時同步和備份。
位置跟蹤:MQTT協(xié)議可以用于實時位置跟蹤,例如車輛追蹤、貨物追蹤等。相關設備可以通過MQTT協(xié)議將位置信息發(fā)布到指定的主題,跟蹤系統(tǒng)可以訂閱這些主題以實時獲取位置信息。
智能城市管理:在智能城市管理中,MQTT可以用于實現(xiàn)不同設備之間的信息交互和協(xié)調(diào)。例如,路燈、交通信號燈、垃圾桶等設備可以通過MQTT協(xié)議連接到一個統(tǒng)一的平臺,實現(xiàn)對這些設備的集中管理和控制。
農(nóng)業(yè)物聯(lián)網(wǎng):MQTT可以應用于農(nóng)業(yè)物聯(lián)網(wǎng)系統(tǒng)中,實現(xiàn)對農(nóng)田環(huán)境的監(jiān)測和控制。傳感器通過MQTT協(xié)議將農(nóng)田的土壤濕度、溫度等信息發(fā)布到指定的主題,農(nóng)民可以訂閱這些主題以實時了解農(nóng)田環(huán)境情況,并進行相應的灌溉和施肥操作。
能源監(jiān)測與管理:MQTT可用于能源監(jiān)測與管理系統(tǒng),如智能電網(wǎng)、智能能源監(jiān)測等。通過將能源設備連接到MQTT網(wǎng)絡,可以實時獲取能源數(shù)據(jù)并進行能源調(diào)度和管理。
總結來說,MQTT協(xié)議在物聯(lián)網(wǎng)領域具有廣泛的應用場景,包括設備控制和監(jiān)控、傳感器數(shù)據(jù)傳輸、實時信息發(fā)布和訂閱、聊天應用、遠程監(jiān)控和控制系統(tǒng)、數(shù)據(jù)傳輸和同步、位置跟蹤以及智能城市管理、農(nóng)業(yè)物聯(lián)網(wǎng)和能源監(jiān)測與管理等領域。這些應用場景展示了MQTT協(xié)議在物聯(lián)網(wǎng)領域的強大功能和靈活性。
七 MQTT組件的使用
1 Gitee鏈接地址
組件位于amaziot_bloom_os_sdklibrariesamxtuam_mqtt.c
Gitee源碼地址:https://gitee.com/ning./hongdou
Github源碼地址:https://github.com/ayumid/hongdou
2 應用層組件功能介紹
提供MQTT連接實例,可以通過調(diào)用組件內(nèi)的API,來實現(xiàn)MQTT本地客戶端和服務器之間的通信。
3 代碼講解
1 dtu_mqtt_wait_init_mqtt
功能:該函數(shù)用于,初始化MQTT。
參數(shù):
參數(shù) | 釋義 |
st_dtu_file | 文件地址 |
返回值:無
示例:
//連接mqtt服務器 dtu_mqtt_wait_connect_mqtt();
2 dtu_mqtt_wait_connect_mqtt
功能:該函數(shù)用于,等待mqtt連接。
參數(shù):無
返回值:無
示例:
//連接mqtt服務器 dtu_mqtt_wait_connect_mqtt();
3 dtu_mqtt_subscribe_topic
功能:該函數(shù)用于,訂閱Topic。
參數(shù):無
返回值:無
示例:
//訂閱Topic dtu_mqtt_subscribe_topic();
4 dtu_mqtt_is_connect
功能:該函數(shù)用于,判斷mqtt是否連接。
參數(shù):
參數(shù) | 釋義 |
st_dtu_file | 文件地址 |
返回值:無
示例:
//判斷是否配置了心跳 if(dtu_mqtt_is_connect(dtu_mqtt_ctx->dtu_mqtt_client) && dtu_file_ctx->gnss.gpsflag == 1)
5 dtu_mqtt_disconnect
功能:該函數(shù)用于,斷開mqtt連接狀態(tài)。
參數(shù):無
返回值:無
示例:
6 dtu_mqtt_msg_dl_arriver
功能:該函數(shù)用于,mqtt下行數(shù)據(jù)回調(diào)函數(shù)。
參數(shù):無
返回值:無
示例:
mqtt_set_interceptor_handler(dtu_mqtt_t.dtu_mqtt_client,dtu_mqtt_msg_dl_arriver);
7 dtu_mqtt_send
功能:該函數(shù)用于,mqtt信息發(fā)送。
參數(shù):
參數(shù) | 釋義 |
data | 數(shù)據(jù)緩沖區(qū)指針 |
data_sz | 數(shù)據(jù)長度 |
返回值:無
示例:
dtu_mqtt_send(send, strlen(send));
8 dtu_mqtt_send_serial_data
功能:該函數(shù)用于,at接口數(shù)據(jù)發(fā)送到mqtt服務器。
參數(shù):
參數(shù) | 釋義 |
uartData | 數(shù)據(jù)指針 |
返回值:無
示例:
dtu_mqtt_send_serial_data(uartData);
4 Demo實戰(zhàn)
本文章源自奇跡物聯(lián)開源的物聯(lián)網(wǎng)應用知識庫Cellular IoT Wiki,更多技術干貨歡迎關注收藏Wiki:Cellular IoT Wiki 知識庫(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)
歡迎同學們走進AmazIOT知識庫的世界!
這里是為物聯(lián)網(wǎng)人構建的技術應用百科,以便幫助你更快更簡單的開發(fā)物聯(lián)網(wǎng)產(chǎn)品。
Cellular IoT Wiki初心:
在我們長期投身于蜂窩物聯(lián)網(wǎng) ODM/OEM 解決方案的實踐過程中,一直被物聯(lián)網(wǎng)技術碎片化與產(chǎn)業(yè)資源碎片化的問題所困擾。從產(chǎn)品定義、芯片選型,到軟硬件研發(fā)和測試,物聯(lián)網(wǎng)技術的碎片化以及產(chǎn)業(yè)資源的碎片化,始終對團隊的產(chǎn)品開發(fā)交付質(zhì)量和效率形成制約。為了減少因物聯(lián)網(wǎng)碎片化而帶來的重復開發(fā)工作,我們著手對物聯(lián)網(wǎng)開發(fā)中高頻應用的技術知識進行沉淀管理,并基于 Bloom OS 搭建了不同平臺的 RTOS 應用生態(tài)。后來我們發(fā)現(xiàn),很多物聯(lián)網(wǎng)產(chǎn)品開發(fā)團隊都面臨著相似的困擾,于是,我們決定向全體物聯(lián)網(wǎng)行業(yè)開發(fā)者開放奇跡物聯(lián)內(nèi)部沉淀的應用技術知識庫 Wiki,期望能為更多物聯(lián)網(wǎng)產(chǎn)品開發(fā)者減輕一些重復造輪子的負擔。
Cellular IoT Wiki沉淀的技術內(nèi)容方向如下:
奇跡物聯(lián)的業(yè)務服務范圍:基于自研的NB-IoT、Cat1、Cat4等物聯(lián)網(wǎng)模組,為客戶物聯(lián)網(wǎng)ODM/OEM解決方案服務。我們的研發(fā)技術中心在石家莊,PCBA生產(chǎn)基地分布在深圳、石家莊、北京三個工廠,滿足不同區(qū)域&不同量產(chǎn)規(guī)模&不同產(chǎn)品開發(fā)階段的生產(chǎn)制造任務。跟傳統(tǒng)PCBA工廠最大的區(qū)別是我們只服務物聯(lián)網(wǎng)行業(yè)客戶。
連接我們,和10000+物聯(lián)網(wǎng)開發(fā)者一起 降低技術和成本門檻
讓蜂窩物聯(lián)網(wǎng)應用更簡單~~
哈哈你終于滑到最重要的模塊了,
千萬不!要!劃!走!忍住沖動!~
歡迎加入飛書“開源技術交流群”,隨時找到我們哦~
點擊鏈接如何加入奇跡物聯(lián)技術話題群(https://rckrv97mzx.feishu.cn/docx/Xskpd1cFQo7hu9x5EuicbsjTnTf)可以獲取加入技術話題群攻略
Hey 物聯(lián)網(wǎng)從業(yè)者,
你是否有了解過奇跡物聯(lián)的官方公眾號“eSIM物聯(lián)工場”呢?
這里是奇跡物聯(lián)的物聯(lián)網(wǎng)應用技術開源wiki主陣地,歡迎關注公眾號,不迷路~
及時獲得最新物聯(lián)網(wǎng)應用技術沉淀發(fā)布
審核編輯 黃宇
-
通信協(xié)議
+關注
關注
28文章
1037瀏覽量
41185 -
物聯(lián)網(wǎng)
+關注
關注
2931文章
46251瀏覽量
392662 -
MQTT
+關注
關注
5文章
682瀏覽量
23723
發(fā)布評論請先 登錄
物聯(lián)網(wǎng)通信協(xié)議的詳解及選擇建議

物聯(lián)網(wǎng)傳輸協(xié)議MQTT到底是個什么?
工業(yè)無線MQTT物聯(lián)網(wǎng)網(wǎng)關
8種物聯(lián)網(wǎng)通信協(xié)議介紹
物聯(lián)網(wǎng)常見通信協(xié)議 精選資料分享
MQTT協(xié)議及其應用開發(fā)介紹
常見的物聯(lián)網(wǎng)通信協(xié)議藍牙簡單對比
物聯(lián)網(wǎng)的基石-MQTT協(xié)議初識
全志T3+Logos FPGA開發(fā)板——MQTT通信協(xié)議案例
mqtt-v3.1.1版協(xié)議
物聯(lián)網(wǎng)硬件接入之通信協(xié)議(MQTT,CoAP,LwM2M協(xié)議)的詳細資料概述

物聯(lián)網(wǎng)硬件接入之通信協(xié)議(MQTT,CoAP,LwM2M協(xié)議)的詳細資料概述

MQTT網(wǎng)關:物聯(lián)網(wǎng)中的關鍵橋梁

評論