0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

物聯(lián)網(wǎng)協(xié)議MQTT

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-11-22 09:53 ? 次閱讀

物聯(lián)網(wǎng)協(xié)議MQTT

MQTT(消息隊列遙測傳輸)是ISO 標(biāo)準(zhǔn)(ISO/IEC PRF 20922)下基于發(fā)布/訂閱范式的消息協(xié)議。它工作在 TCP/IP協(xié)議族上,是為硬件性能低下的遠程設(shè)備以及網(wǎng)絡(luò)狀況糟糕的情況下而設(shè)計的發(fā)布/訂閱型消息協(xié)議,為此,它需要一個消息中間件?。

MQTT是一個基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。由IBM在1999年發(fā)布。MQTT協(xié)議是輕量、簡單、開放和易于實現(xiàn)的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環(huán)境中,作為一種低開銷、低帶寬占用的即時通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動應(yīng)用等方面有較廣泛的應(yīng)用。如:機器與機器(M2M通信和物聯(lián)網(wǎng)(IoT)。其在通過衛(wèi)星鏈路通信傳感器、偶爾撥號的醫(yī)療設(shè)備、智能家居、及一些小型化設(shè)備中已廣泛使用。

MQTT最大優(yōu)點在于,用極少的代碼和有限的帶寬,為連接遠程設(shè)備提供實時可靠的消息服務(wù)。

pYYBAGN8K6-AVFpsAAFSZEnVdl0071.png#pic_center

2.MQTT特點

本協(xié)議運行在 TCP/IP,或其它提供了有序、可靠、 雙向連接的網(wǎng)絡(luò)連接上。MQTT屬于應(yīng)用層協(xié)議,它有以下特點:

使用發(fā)布/訂閱消息模式,提供了一對多的消息分發(fā)和應(yīng)用之間的解耦。

消息傳輸不需要知道負載內(nèi)容。

提供三種等級的服務(wù)質(zhì)量:
QS0:“最多一次”,盡操作環(huán)境所能提供的最大努力分發(fā)消息。 消息可能會丟失。 例如, 這個等級可用于環(huán)境傳感器數(shù)據(jù),單 次的數(shù)據(jù)丟失沒關(guān)系, 因為不久之后會再次發(fā)送。

QS1:“至少一次”,保證消息可以到達, 但是可能會重復(fù)。

QS2: “僅一次”, 保證消息只到達一次。 例如, 這個等級可用在一個計費系統(tǒng)中, 這里如果消息重復(fù)或丟失會導(dǎo)致不正 確的收費。很小的傳輸消耗和協(xié)議數(shù)據(jù)交換,最大限度減少網(wǎng)絡(luò)流量。

3.MQTT控制報文

??MQTT 協(xié)議通過交換預(yù)定義的 MQTT 控制報文來通信。MQTT 控制報文由三部分組成:固定報頭(Fixed header)、可變報頭(Variable header)、有效載荷(Payload)。

Fixed header 固定報頭,所有控制報文都包含
Variable header 可變報頭, 部分控制報文包含
Payload 有效載荷, 部分控制報文包含

3.1 固定報頭格式

poYBAGN8K6-ABJy4AABWgv60g9o461.png#pic_center

控制報文類型

pYYBAGN8K6-AYOzUAAKa8PkrpmY293.png#pic_center

3.2 MQTT控制報文類型集標(biāo)志

固定報頭第1個字節(jié)高4位(4 ~ 7)為控制報文類型,一共14個,低4位(0~3)包含每個 MQTT 控制報文類型特定的標(biāo)志,見下表。表中任何標(biāo)記為“保留”的標(biāo)志位,都是保留給以后使用的,必須設(shè)置為表格中列出的值。如果收到非法的標(biāo)志,接收者必須關(guān)閉網(wǎng)絡(luò)連接。

poYBAGN8K7CALU7WAAHtHXc3bVQ035.png#pic_center


??DUP1 =控制報文的重復(fù)分發(fā)標(biāo)志。
??QoS2 = PUBLISH 報文的服務(wù)質(zhì)量等級。
??RETAIN3 = PUBLISH 報文的保留標(biāo)志。
??PUBLISH 控制報文中的 DUP, QoS 和 RETAIN 標(biāo)志。
??詳情參考MQTT3.1協(xié)議。

3.3 剩余長度計算

剩余長度(Remaining Length) 表示當(dāng)前報文剩余部分的字節(jié)數(shù),包括可變報頭和負載的數(shù)據(jù)。 剩余長度不包括用于編碼剩余長度字段本身的字節(jié)數(shù)。

剩余長度字段使用一個可變長度編碼方案,對小于128的值它使用單字節(jié)編碼。 更大的值按下面的方式處理。低7位有效位用于編碼數(shù)據(jù)8,最高有效位用于指示是否有更多的字節(jié)。 即剩余長度安裝128進制進行計數(shù),剩余長度字段最大 4 個字節(jié)。

剩余長度字段取值如下:

pYYBAGN8K7CARXl_AADFQTtkisQ848.png#pic_center

?剩余長度按128進制計數(shù),采用16進制方式表示,低字節(jié)在前。剩余長度編碼示例:
①例如64:(64/128)取整=0,說明64不需要進位,1個字節(jié)即可表示,即:0x40;
②例如456:(456/128)取整=3,(3/128)取整=0,說明456需要2個字節(jié)表示。
?第一個字節(jié)bit7=1,(bit0~bit6)=456%128=72=0x48,即第一個字節(jié)表示為:0xc8;
?第二個字節(jié)bit7=3/128=0,(bit0~bit6)=3%128=3,即第二個字節(jié)表示位:0x3;
?綜上,456采用2個字節(jié)表示為:0xc8 0x3;
③例如100000:(100000/128)=781,(781/128)=6,說明100000需要3字節(jié)表示
?第一個字節(jié)bit7=1,(bit0~bit6)=100000%128=0x20,即第一個字節(jié)為0xa0;
?第二個字節(jié)bit7=1,(bit0~bit6)=781%128=0x0d,即第二個字節(jié)為0x8d;
?第三個字節(jié)bit7=0,(bit0~bit6)=6%128=6,即第三個字節(jié)為0x6;
?綜上,100000采用3字節(jié)表示為:0xa0 0x8d 0x6;

3.4 剩余長度計算C語言實現(xiàn)示例

剩余長度編碼

int MQTT_RemainSum(int data,u8 buff[])
{
	int cnt=0;//記錄編碼的字節(jié)數(shù)
	do
	{
		u8 encodedByte = data % 128;
		data/=128;
		if(data>0)
		{
			//若data超過128,則將最最高位置1
			encodedByte=encodedByte|=0x80;
		}
		buff[cnt++]=encodedByte;
		
	}while(data>0);
	return cnt;//返回需要編碼的字節(jié)數(shù)個數(shù)
}

剩余長度解碼

int MQTT_remainGet(u8 buff[],int cnt)
{
	int data=0;
	int i=0;
	int count=1;
	for(;i

測試示例:

int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("格式:./a.out <剩余長度>n");
		return 0;
	}
	int data=atoi(argv[1]);
	u8 buff[4];
	int cnt=MQTT_RemainSum(data,buff);
	for(int i=0;i

4.MQTT消息等級

MQTT提供三種等級的服務(wù)質(zhì)量

QS0:“最多一次”,盡操作環(huán)境所能提供的最大努力分發(fā)消息。 消息可能會丟失。 例如,這個等級可用于環(huán)境傳感器數(shù)據(jù),單次的數(shù)據(jù)丟失沒關(guān)系, 因為不久之后會再次發(fā)送。

QS1:“至少一次”,保證消息可以到達, 但是可能會重復(fù)。

QS2: “僅一次”, 保證消息只到達一次。 例如, 這個等級可用在一個計費系統(tǒng)中,這里如果消息重復(fù)或丟失會導(dǎo)致不正確的收費。很小的傳輸消耗和協(xié)議數(shù)據(jù)交換,最大限度減少網(wǎng)絡(luò)流量。

poYBAGN8K7CAB-aXAABqlqhTb8A984.png#pic_center



??PUBLISH報文不能將 QoS所有的位設(shè)置為1。如果服務(wù)端或客戶端收到QoS所有位都為 1的PUBLISH報文,它必須關(guān)閉網(wǎng)絡(luò)連接。

Qos0最多一次

??發(fā)送者 只發(fā)送一次消息,不進行重試。在協(xié)議中也沒有定義重傳的語義。消息可能到達服務(wù)器1次,也可能根本不會到達。

pYYBAGN8K7GAI32ZAAFVpo9-WTs219.png#pic_center

Qos1至少一次

服務(wù)器接收到消息會被確認(rèn),通過傳輸一個PUBACK信息。如果有一個可以辨認(rèn)的傳輸失敗,無論是通訊連接還是發(fā)送設(shè)備,還是過了一段時間確認(rèn)信息沒有收到,發(fā)送方都會將消息頭的DUP位置1,然后再次發(fā)送消息。消息最少一次到達服務(wù)器。

如果客戶端沒有接收到PUBACK信息(無論是應(yīng)用定義的超時,還是檢測到失敗然后通訊session重啟),客戶端都會再次發(fā)送PUBLISH信息,并且將DUP位置1。

當(dāng)它從客戶端接收到重復(fù)的數(shù)據(jù),服務(wù)器重新發(fā)送消息給訂閱者,并且發(fā)送另一個PUBACK消息。

poYBAGN8K7GAP-1OAAEpTwRoQT4630.png#pic_center

? 如上圖所示, Qos1消息等級為了保證至少傳達一次,發(fā)布方會將發(fā)送的消息本地暫存,并且會每隔一段時間重發(fā)一次,直到接收方返回應(yīng)答為止。當(dāng)我們收到應(yīng)答后即可將暫存消息刪除,停止重傳。

對應(yīng)接收方,則需要在每次收到消息后都要回復(fù)應(yīng)答。在上圖中publisher(發(fā)布方)到broker(代理方,服務(wù)器)和broker(代理方,服務(wù)器)到subscriber(訂閱方)是同等的,兩段通信都應(yīng)按以上討論的進行實現(xiàn)。

Qos2僅一次

pYYBAGN8K7KAfZVwAAH_B_epClM970.png#pic_center

? QS2消息等級保證消息一定可以到達一次,publisher(發(fā)布方)到broker(代理方,服務(wù)器)和broker(代理方,服務(wù)器)到subscriber(訂閱方)是同等的,兩段通信都是相同等級。具體消息傳輸過程如下:

1.發(fā)布方發(fā)送消息,并將消息內(nèi)容本地暫存。

2.接收方接收到消息內(nèi)容后,將消息內(nèi)容暫存本地,并給發(fā)送方回復(fù)一個應(yīng)答(PUBREC),發(fā)布方在沒有收到PUBREC之前會隔一段時間進行消息重發(fā)一次,以確保消息一定可以送達。

3.當(dāng)發(fā)布方收到PUBREC后,則停止消息重發(fā),并給接收方發(fā)送釋放(PUBREL)消息內(nèi)容,接收方收到PUBREL后即可確定消息傳輸成功。

4.刪除暫存的消息,之后發(fā)送端每次收到PUBREC都直接發(fā)送一個PUBREL消息給接收端。

5.接收端在收到PUBREL消息后,修改暫存的消息狀態(tài)為發(fā)布完成,停止發(fā)送PUBREC,然后給發(fā)送端發(fā)去一個發(fā)布完成(PUBCOM)的消息。此時接收端則將刪除暫存的消息,之后每次收到PUBREL都直接回復(fù)PUBCOM。

6.發(fā)送端收到PUBCOM,如果發(fā)現(xiàn)暫存的消息還每刪除的話,就刪除暫存消息,如果已經(jīng)刪除了就不管了。

注意:在此過程中本地暫存消息的作用是為了在收到重復(fù)內(nèi)容時可以實現(xiàn)去重,在接收到PUBREL后,就能確定發(fā)送端不再會發(fā)送此消息,所以這個時候就可以刪除暫存消息了,同樣的,發(fā)送端在接收到PUBREC后知道接收端已經(jīng)接收到消息了,所以不必再發(fā)送消息,并且可以刪除暫存了。

審核編輯 黃昊宇


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2894

    文章

    43313

    瀏覽量

    366436
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    629

    瀏覽量

    22286
收藏 人收藏

    評論

    相關(guān)推薦

    什么是ThingsKit聯(lián)網(wǎng)平臺?

    快速了解ThingsKit ThingsKit是一個開箱即用的聯(lián)網(wǎng)平臺,它可以幫助您快速實現(xiàn)聯(lián)網(wǎng)的數(shù)據(jù)收集、分析處理、可視化和設(shè)備管理,支持通過行業(yè)標(biāo)準(zhǔn)
    的頭像 發(fā)表于 08-17 10:14 ?972次閱讀
    什么是ThingsKit<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>平臺?

    聯(lián)網(wǎng)傳輸協(xié)議MQTT到底是個什么?

    MQTT是什么?MQTT是一個聯(lián)網(wǎng)傳輸協(xié)議,它被設(shè)計用于輕量級的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中的
    發(fā)表于 01-08 11:27

    工業(yè)無線MQTT聯(lián)網(wǎng)網(wǎng)關(guān)

    本帖最后由 wtblchenwei1981 于 2018-2-10 16:25 編輯 產(chǎn)品簡介 隨著越來越多的聯(lián)網(wǎng)采用 MQTT 作為支持協(xié)議,您會發(fā)現(xiàn)許多開源應(yīng)用和產(chǎn)品中出現(xiàn)
    發(fā)表于 02-07 14:00

    萌新闖關(guān)之聯(lián)網(wǎng)MQTT協(xié)議梳理

    目前大家的進度已經(jīng)推進到使用聯(lián)網(wǎng)協(xié)議進行控制終端設(shè)備了,先頭部隊已經(jīng)完整的移植了MQTT協(xié)議到我們的開發(fā)板上了,既然應(yīng)用端已經(jīng)實現(xiàn),作為作
    發(fā)表于 11-27 00:23

    萌新闖關(guān)之聯(lián)網(wǎng)MQTT協(xié)議梳理

    目前大家的進度已經(jīng)推進到使用聯(lián)網(wǎng)協(xié)議進行控制終端設(shè)備了,先頭部隊已經(jīng)完整的移植了MQTT協(xié)議到我們的開發(fā)板上了,既然應(yīng)用端已經(jīng)實現(xiàn),作為作
    發(fā)表于 12-02 16:56

    聯(lián)網(wǎng)的基石-MQTT協(xié)議初識

    1、聯(lián)網(wǎng)的基石-mqtt協(xié)議初識隨著 5G 時代的來臨,萬互聯(lián)的偉大構(gòu)想正在成為現(xiàn)實。聯(lián)網(wǎng)
    發(fā)表于 09-08 16:03

    如何采用mqtt協(xié)議實現(xiàn)聯(lián)網(wǎng)模塊消息推送?

    如何采用mqtt協(xié)議實現(xiàn)聯(lián)網(wǎng)模塊消息推送
    發(fā)表于 11-03 06:55

    聯(lián)網(wǎng)傳輸協(xié)議MQTT的優(yōu)勢

    聯(lián)網(wǎng)傳輸協(xié)議為什么首選MQTT
    的頭像 發(fā)表于 01-09 14:46 ?3974次閱讀

    聯(lián)網(wǎng)協(xié)議MQTT協(xié)議的實現(xiàn)

    MQTT是IBM開發(fā)的一個即時通訊協(xié)議,有可能成為聯(lián)網(wǎng)的重要組成部分。該協(xié)議支持所有平臺,幾乎可以把所有
    的頭像 發(fā)表于 05-05 23:07 ?3984次閱讀
    <b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>的實現(xiàn)

    基于以太網(wǎng)通信的遠程IO模塊廣泛應(yīng)用在工業(yè)聯(lián)網(wǎng)領(lǐng)域

    隨著IIOT(Industrial IOT)工業(yè)聯(lián)網(wǎng)技術(shù)的發(fā)展,很多傳統(tǒng)的資產(chǎn)都需要接入互聯(lián)中,實現(xiàn)數(shù)據(jù)的統(tǒng)一采集、分析、處理以及存儲,打破傳統(tǒng)的設(shè)備信息孤島現(xiàn)象。因此支持聯(lián)網(wǎng)
    發(fā)表于 11-21 10:17 ?756次閱讀

    如何實現(xiàn)OPC DA Server和MQTT Broker之間的數(shù)據(jù)交互?

    作為工業(yè)領(lǐng)域重要的通信協(xié)議,OPC DA常用于現(xiàn)場控制系統(tǒng)/設(shè)備之間的數(shù)據(jù)交互;作為聯(lián)網(wǎng)協(xié)議,MQTT常用于
    的頭像 發(fā)表于 03-23 10:08 ?1083次閱讀
    如何實現(xiàn)OPC DA Server和<b class='flag-5'>MQTT</b> Broker之間的數(shù)據(jù)交互?

    智聯(lián)聯(lián)分享之聯(lián)網(wǎng)協(xié)議MQTT簡述,MQTT協(xié)議特點

    )基于客戶端/服務(wù)器的信息發(fā)布/訂閱的聯(lián)網(wǎng)常用傳輸協(xié)議。1999年由開發(fā)商IBM發(fā)布,MQTT協(xié)議是輕量、簡單、開放和易于實現(xiàn)的,這些特點
    的頭像 發(fā)表于 03-28 18:10 ?1155次閱讀
    智聯(lián)<b class='flag-5'>物</b>聯(lián)分享之<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>MQTT</b>簡述,<b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>特點

    ThingsKit聯(lián)網(wǎng)平臺優(yōu)勢

    產(chǎn)品核心優(yōu)勢 ThingsKit是一個開箱即用的聯(lián)網(wǎng)平臺,它可以幫助您快速實現(xiàn)聯(lián)網(wǎng)的數(shù)據(jù)收集、分析處理、可視化和設(shè)備管理,支持通過行業(yè)標(biāo)準(zhǔn)
    的頭像 發(fā)表于 08-21 14:49 ?347次閱讀

    聯(lián)網(wǎng)中的MQTT協(xié)議概述

    MQTT協(xié)議已經(jīng)成了聯(lián)網(wǎng)通信中的一個熱詞,今天我們一起來學(xué)習(xí)一下關(guān)于MQTT協(xié)議的一些知識。
    的頭像 發(fā)表于 11-25 14:09 ?1162次閱讀

    MQTT聯(lián)網(wǎng)平臺是什么

    MQTT聯(lián)網(wǎng)平臺是一種軟件平臺,它基于MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)協(xié)議
    的頭像 發(fā)表于 07-18 14:22 ?314次閱讀