自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

物聯(lián)網(wǎng)
MQTT是一個(gè)基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。由IBM在1999年發(fā)布。MQTT協(xié)議是輕量、簡(jiǎn)單、開放和易于實(shí)現(xiàn)的,這些特點(diǎn)使它適用范圍非常廣泛。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

1、MQTT簡(jiǎn)介

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

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

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

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

2、MQTT特點(diǎn)

本協(xié)議運(yùn)行在 TCP/IP,或其它提供了有序、可靠、 雙向連接的網(wǎng)絡(luò)連接上。MQTT屬于應(yīng)用層協(xié)議,它有以下特點(diǎn):使用發(fā)布/訂閱消息模式,提供了一對(duì)多的消息分發(fā)和應(yīng)用之間的解耦。消息傳輸不需要知道負(fù)載內(nèi)容。

提供三種等級(jí)的服務(wù)質(zhì)量: .

  • QS0:“最多一次”,盡操作環(huán)境所能提供的最大努力分發(fā)消息。 消息可能會(huì)丟失。 ??例如, 這個(gè)等級(jí)可用于環(huán)境傳感器數(shù)據(jù),單次的數(shù)據(jù)丟失沒關(guān)系, 因?yàn)椴痪弥髸?huì)再次發(fā)送。
  • QS1:“至少一次”,保證消息可以到達(dá), 但是可能會(huì)重復(fù)。
  • QS2: “僅一次”, 保證消息只到達(dá)一次。 例如, 這個(gè)等級(jí)可用在一個(gè)計(jì)費(fèi)系統(tǒng)中, 這里如果消息重復(fù)或丟失會(huì)導(dǎo)致不正確的收費(fèi)。很小的傳輸消耗和協(xié)議數(shù)據(jù)交換,最大限度減少網(wǎng)絡(luò)流量。??

在MQTT連接建立時(shí),客戶端需要通過TCP連接到MQTT服務(wù)器,并進(jìn)行握手協(xié)商,包括協(xié)議版本、客戶端標(biāo)識(shí)符、遺囑消息、 QoS級(jí)別等信息,以確保雙方能夠正確地交換數(shù)據(jù)。一旦握手成功,客戶端和服務(wù)器之間就建立了一個(gè)持久化的TCP連接,可以隨時(shí)進(jìn)行消息傳輸。
由于TCP協(xié)議本身已經(jīng)提供了一定程度的可靠性保證,因此MQTT協(xié)議只需要在TCP的基礎(chǔ)上實(shí)現(xiàn)發(fā)布/訂閱機(jī)制、 QoS級(jí)別控制、保留消息等特性即可,從而使得它成為一種輕量級(jí)且高效的物聯(lián)網(wǎng)通信協(xié)議。

3、MQTT協(xié)議數(shù)據(jù)量限制

MQTT協(xié)議本身沒有限制數(shù)據(jù)包的大小,但是它需要遵循底層傳輸協(xié)議(TCP/IP)的限制和約束。在實(shí)際應(yīng)用中,MQTT協(xié)議能夠傳輸?shù)挠行?shù)據(jù)量是受多種因素影響的,如網(wǎng)絡(luò)帶寬、QoS級(jí)別、MQTT消息頭部信息等。一般來說,在默認(rèn)情況下,MQTT協(xié)議對(duì)于單個(gè)消息的有效載荷有一個(gè)限制,即不超過256MB。這個(gè)限制主要由MQTT協(xié)議的消息長(zhǎng)度字段決定,該字段的最大值是4字節(jié),因此最大能表示2^32-1個(gè)字節(jié)的消息長(zhǎng)度,即約為4GB。然而,在實(shí)際應(yīng)用中,由于網(wǎng)絡(luò)帶寬和設(shè)備性能等方面的限制,很難實(shí)現(xiàn)傳輸如此巨大的消息。另外,需要注意的是,如果使用較高級(jí)別的QoS,如“至少一次”或“恰好一次”,則MQTT協(xié)議會(huì)對(duì)每條消息進(jìn)行確認(rèn)和重傳,這可能會(huì)導(dǎo)致更多的網(wǎng)絡(luò)流量和延遲。因此,在選擇QoS級(jí)別時(shí),需要根據(jù)應(yīng)用場(chǎng)景和網(wǎng)絡(luò)環(huán)境的實(shí)際情況進(jìn)行優(yōu)化和調(diào)整,以充分利用MQTT協(xié)議的特點(diǎn)和優(yōu)勢(shì)。

4、MQTT控制報(bào)文

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

Fixed header 固定報(bào)頭,所有控制報(bào)文都包含

Variable header 可變報(bào)頭, 部分控制報(bào)文包含

Payload 有效載荷, 部分控制報(bào)文包含

(1)固定報(bào)頭格式

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

控制報(bào)文類型

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

(2)MQTT控制報(bào)文類型集標(biāo)志

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

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

DUP1 =控制報(bào)文的重復(fù)分發(fā)標(biāo)志。

QoS2 = PUBLISH 報(bào)文的服務(wù)質(zhì)量等級(jí)。

RETAIN3 = PUBLISH 報(bào)文的保留標(biāo)志。

詳情參考MQTT3.1協(xié)議。

(3)剩余長(zhǎng)度計(jì)算

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

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

剩余長(zhǎng)度字段取值如下:

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

剩余長(zhǎng)度按128進(jìn)制計(jì)數(shù),采用16進(jìn)制方式表示,低字節(jié)在前。剩余長(zhǎng)度編碼示例:

①例如64:(64/128)取整=0,說明64不需要進(jìn)位,1個(gè)字節(jié)即可表示,即:0x40。

②例如456:(456/128)取整=3,(3/128)取整=0,說明456需要2個(gè)字節(jié)表示。

第一個(gè)字節(jié)bit7=1,(bit0~bit6)=456%128=72=0x48,即第一個(gè)字節(jié)表示為:0xc8。

第二個(gè)字節(jié)bit7=3/128=0,(bit0~bit6)=3%128=3,即第二個(gè)字節(jié)表示位:0x3。

綜上,456采用2個(gè)字節(jié)表示為:0xc8 0x3。

③例如100000:(100000/128)=781,(781/128)=6,說明100000需要3字節(jié)表示。

第一個(gè)字節(jié)bit7=1,(bit0~bit6)=100000%128=0x20,即第一個(gè)字節(jié)為0xa0。

第二個(gè)字節(jié)bit7=1,(bit0~bit6)=781%128=0x0d,即第二個(gè)字節(jié)為0x8d。

第三個(gè)字節(jié)bit7=0,(bit0~bit6)=6%128=6,即第三個(gè)字節(jié)為0x6。

綜上,100000采用3字節(jié)表示為:0xa0 0x8d 0x6。

(4)剩余長(zhǎng)度計(jì)算C語言實(shí)現(xiàn)示例

剩余長(zhǎng)度編碼

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ù)個(gè)數(shù)
}

剩余長(zhǎng)度解碼

int MQTT_remainGet(u8 buff[],int cnt)
{
int data=0;
int i=0;
int count=1;
for(;i<cnt;i++)
{
data+=(buff[i]&0x7f)*count;
count<<=7;
}
return data;
}

測(cè)試示例:

int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("格式:./a.out <剩余長(zhǎng)度>\n");
return 0;
}
int data=atoi(argv[1]);
u8 buff[4];
int cnt=MQTT_RemainSum(data,buff);
for(int i=0;i<cnt;i++)
{
printf("%#x ",buff[i]);
}
printf("\n");
printf("data=%d\n", MQTT_remainGet(buff,cnt));
}
[wbyq@wbyq work]$ ./a.out 64
0x40
data=64
[wbyq@wbyq work]$ ./a.out 456
0xc8 0x3
data=456
[wbyq@wbyq work]$ ./a.out 100000
0xa0 0x8d 0x6
data=100000
[wbyq@wbyq work]$ ./a.out 268435455
0xff 0xff 0xff 0x7f
data=268435455

5、MQTT消息等級(jí)

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

  • QS0:“最多一次”,盡操作環(huán)境所能提供的最大努力分發(fā)消息。 消息可能會(huì)丟失。 例如,這個(gè)等級(jí)可用于環(huán)境傳感器數(shù)據(jù),  單次的數(shù)據(jù)丟失沒關(guān)系, 因?yàn)椴痪弥髸?huì)再次發(fā)送。
  • QS1:“至少一次”,保證消息可以到達(dá), 但是可能會(huì)重復(fù)。
  • QS2: “僅一次”, 保證消息只到達(dá)一次。 例如, 這個(gè)等級(jí)可用在一個(gè)計(jì)費(fèi)系統(tǒng)中,這里如果消息重復(fù)或丟失會(huì)導(dǎo)致不正確的收費(fèi)。很小的傳輸消耗和協(xié)議數(shù)據(jù)交換,最大限度減少網(wǎng)絡(luò)流量。

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

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

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

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

Qos1至少一次


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

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

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

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)


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

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

Qos2僅一次

#創(chuàng)作者激勵(lì)#物聯(lián)網(wǎng)協(xié)議MQTT-開源基礎(chǔ)軟件社區(qū)

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

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

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

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

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

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

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

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

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-09-24 23:18:50

2024-03-26 11:52:13

2022-06-27 10:41:45

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

2018-08-17 06:13:16

物聯(lián)網(wǎng)協(xié)議MQTTMQTT-SN

2023-09-07 14:59:42

物聯(lián)網(wǎng)MQTTCoAP

2023-07-18 10:38:09

2024-01-23 12:47:27

2024-01-12 07:46:07

MQTT協(xié)議物聯(lián)網(wǎng)應(yīng)用.NET

2020-11-15 23:25:50

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

2022-06-02 10:10:24

物聯(lián)網(wǎng)傳感器

2020-07-26 00:25:07

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)應(yīng)用

2022-10-28 11:44:44

物聯(lián)網(wǎng)IoT

2019-12-27 10:42:45

HTTPMQTT物聯(lián)網(wǎng)

2013-04-28 10:29:07

MQTT物聯(lián)網(wǎng)消息隊(duì)列遙測(cè)傳輸

2023-04-19 15:02:01

MQTT人工智能物聯(lián)網(wǎng)

2019-08-12 08:50:23

物聯(lián)網(wǎng)平臺(tái)物聯(lián)網(wǎng)IOT

2021-03-28 09:24:48

工業(yè)物聯(lián)網(wǎng)IIOT物聯(lián)網(wǎng)

2021-05-20 14:42:42

物聯(lián)網(wǎng)互聯(lián)網(wǎng)IoT

2019-11-21 17:46:35

物聯(lián)網(wǎng)智能照明3D打印

2022-12-07 15:04:16

物聯(lián)網(wǎng)蜂窩物聯(lián)網(wǎng)通信
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)