MQTT協(xié)議之固定頭

簡(jiǎn)介

MQTT (Message Queue Telemetry Transport),遙測(cè)傳輸協(xié)議,其主要提供了訂閱/發(fā)布兩種消息模式,更為簡(jiǎn)約、輕量,易于使用,特別適合于受限環(huán)境(帶寬低、網(wǎng)絡(luò)延遲高、網(wǎng)絡(luò)通信不穩(wěn)定)的消息分發(fā),屬于物聯(lián)網(wǎng)(Internet of Thing)的一個(gè)標(biāo)準(zhǔn)傳輸協(xié)議。

MQTT支持三種消息發(fā)布服務(wù)質(zhì)量(QoS):

1.“至多一次”(QoS==0),消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會(huì)發(fā)生消息丟失或重復(fù)。這一級(jí)別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無所謂,因?yàn)椴痪煤筮€會(huì)有第二次發(fā)送。
2.“至少一次”(QoS==1),確保消息到達(dá),但消息重復(fù)可能會(huì)發(fā)生。
3.“只有一次”(QoS==2),確保消息到達(dá)一次。這一級(jí)別可用于如下情況,在計(jì)費(fèi)系統(tǒng)中,消息重復(fù)或丟失會(huì)導(dǎo)致不正確的結(jié)果。小型傳輸,開銷很?。ü潭ㄩL(zhǎng)度的頭部是 2 字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量。

消息類型

消息類型.png

MQTT協(xié)議內(nèi)容

在MQTT協(xié)議中,一個(gè)MQTT數(shù)據(jù)包由:固定頭(Fixed header)、可變頭(Variable header)、消息體(payload)三部分構(gòu)成。MQTT數(shù)據(jù)包結(jié)構(gòu)如下:
(1)固定頭(Fixed header)。存在于所有MQTT數(shù)據(jù)包中,表示數(shù)據(jù)包類型及數(shù)據(jù)包的分組類標(biāo)識(shí)。
(2)可變頭(Variable header)。存在于部分MQTT數(shù)據(jù)包中,數(shù)據(jù)包類型決定了可變頭是否存在及其具體內(nèi)容。
(3)消息體(Payload)。存在于部分MQTT數(shù)據(jù)包中,表示客戶端收到的具體內(nèi)容。

固定頭

固定頭格式.png

固定頭格式.png

控制報(bào)文的類型【7~4bit】:用于標(biāo)示類型,如:連接(CONNECT)報(bào)文,發(fā)布(PUBLISH)報(bào)文等。他占了四個(gè)字節(jié)。如:連接報(bào)文對(duì)應(yīng)二進(jìn)制:0001。
制報(bào)文類型的標(biāo)志位:這里包含的內(nèi)部比較多。分別為:標(biāo)示發(fā)送重復(fù)數(shù)(DUP)【3bit】 (1字節(jié)) 、服務(wù)質(zhì)量 (QoS)[2~1] (2字節(jié))、保留標(biāo)志(RETAIN)[0](1字節(jié))。同樣子他也占了四個(gè)字節(jié)

decData.ctrlType=(MqttCtrlType)(srcBuff[0]&0xF0) >>4;
decData.publish.qosType=(srcBuff[0]&0x06)>>1;

Qos和DUP含義.png

剩余長(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é),且按照大端方式進(jìn)行編碼。因此每個(gè)字節(jié)可以編碼128個(gè)數(shù)值和一個(gè)延續(xù)位(continuation bit)。剩余長(zhǎng)度字段最大4個(gè)字節(jié)。

例如,十進(jìn)制數(shù)35會(huì)被編碼為一個(gè)字節(jié),數(shù)值是35,十六進(jìn)制表示為0x23,。十進(jìn)制數(shù)字321(=65+2*128)被編碼為兩個(gè)字節(jié),最低有效位在前。第一個(gè)字節(jié)是 65+128=193。注意最高位為1表示后面至少還有一個(gè)字節(jié)。第二個(gè)字節(jié)是2。

十進(jìn)制數(shù)321=0xC1,0x02
注意(上面沒看懂的看這):
還是拿300舉例,十進(jìn)制300 轉(zhuǎn)換成二進(jìn)制就是100101100,即0x012C。由于100101100 超過7位,已經(jīng)不能用一個(gè)字節(jié)表示了(一個(gè)字節(jié)的最高位是指示位,故一個(gè)字節(jié)只有7位數(shù)據(jù)位)。所以我們就要將這個(gè)二進(jìn)制數(shù)切割成10 和0101100,然后低位加上一個(gè)為1 的符號(hào)為成為10101100,即0xAC,然后放在前面,高位的10 直接寫在后面,符號(hào)為為0,即0x02。
所以,最終十進(jìn)制的321 化為剩余長(zhǎng)度形式就是0xAC,0x02。


剩余長(zhǎng)度.png

https://www.runoob.com/w3cnote/mqtt-intro.html(MQTT簡(jiǎn)介)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容