簡介
MQTT (Message Queue Telemetry Transport),遙測傳輸協議,其主要提供了訂閱/發布兩種消息模式,更為簡約、輕量,易于使用,特別適合于受限環境(帶寬低、網絡延遲高、網絡通信不穩定)的消息分發,屬于物聯網(Internet of Thing)的一個標準傳輸協議。
MQTT支持三種消息發布服務質量(QoS):
1.“至多一次”(QoS==0),消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用于如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。
2.“至少一次”(QoS==1),確保消息到達,但消息重復可能會發生。
3.“只有一次”(QoS==2),確保消息到達一次。這一級別可用于如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量。
消息類型
MQTT協議內容
在MQTT協議中,一個MQTT數據包由:固定頭(Fixed header)、可變頭(Variable header)、消息體(payload)三部分構成。MQTT數據包結構如下:
(1)固定頭(Fixed header)。存在于所有MQTT數據包中,表示數據包類型及數據包的分組類標識。
(2)可變頭(Variable header)。存在于部分MQTT數據包中,數據包類型決定了可變頭是否存在及其具體內容。
(3)消息體(Payload)。存在于部分MQTT數據包中,表示客戶端收到的具體內容。
固定頭
控制報文的類型【7~4bit】:用于標示類型,如:連接(CONNECT)報文,發布(PUBLISH)報文等。他占了四個字節。如:連接報文對應二進制:0001。
制報文類型的標志位:這里包含的內部比較多。分別為:標示發送重復數(DUP)【3bit】 (1字節) 、服務質量 (QoS)[2~1] (2字節)、保留標志(RETAIN)[0](1字節)。同樣子他也占了四個字節
decData.ctrlType=(MqttCtrlType)(srcBuff[0]&0xF0) >>4;
decData.publish.qosType=(srcBuff[0]&0x06)>>1;
剩余長度(Remaining Length)表示當前報文剩余部分的字節數,包括可變報頭和負載的數據。剩余長度不包括用于編碼剩余長度字段本身的字節數。
剩余長度字段使用一個變長度編碼方案,對小于128的值它使用單字節編碼。更大的值按下面的方式處理。低7位有效位用于編碼數據,最高有效位用于指示是否有更多的字節,且按照大端方式進行編碼。因此每個字節可以編碼128個數值和一個延續位(continuation bit)。剩余長度字段最大4個字節。
例如,十進制數35會被編碼為一個字節,數值是35,十六進制表示為0x23,。十進制數字321(=65+2*128)被編碼為兩個字節,最低有效位在前。第一個字節是 65+128=193。注意最高位為1表示后面至少還有一個字節。第二個字節是2。
十進制數321=0xC1,0x02
注意(上面沒看懂的看這):
還是拿300舉例,十進制300 轉換成二進制就是100101100,即0x012C。由于100101100 超過7位,已經不能用一個字節表示了(一個字節的最高位是指示位,故一個字節只有7位數據位)。所以我們就要將這個二進制數切割成10 和0101100,然后低位加上一個為1 的符號為成為10101100,即0xAC,然后放在前面,高位的10 直接寫在后面,符號為為0,即0x02。
所以,最終十進制的321 化為剩余長度形式就是0xAC,0x02。