MQTT報文結構
控制報文由三部分組成:
1、Fixed header 固定報頭,所有報文都包含
2、Variable header 可變報頭,部分報文包含
3、Body 有效載荷,部分報文包含
固定報頭
報頭長度:2 ~ 5 Bytes
1、報文類型:由第一個字節4-7 表示;共16個類型,但是保留第0個,第15個類型不用:
2、標志位,標志報文類型的特定標志,第一個字節的0-3:
3、剩余長度,從第二個字節開始,最少一個字節,最長四個字節。表示當前報文剩余部分(可變報頭+負載數據)的字節數。不包括用於編碼Remaining Length字段本身的字節數。
它使用一個變長度編碼方案,對小於128的值,它使用單字節編碼。
大值處理:低7位有效位用於編碼數據,最高有效位用於指示是否有更多的字節。
因此每個字節可以編碼128個數值和一個延續位(continuation bit)。
剩余長度字段的大小:
非負整數x使用變長編碼方案算法:
do
encodedByte = x%128; x = x /128; if (x > 0 ){ encodedByte = encodedByte|128; //延續標志位置1 }else{ encodedByte = encodedByte; } fill_fix_header_remain_len(encodeByte); while(x>0)
剩余長度字段的解碼算法:
multiplier = 1
value = 0
do encodedByte = 'next byte from stream' value += (encodedByte AND 127) * multiplier multiplier *= 128 if (multiplier > 128*128*128) throw Error(Malformed Remaining Length) while ((encodedByte AND 128) != 0)//判斷下一個字節的最高位是否為1,不等於1就表示是最后一個長度字節,value的值就是剩余長度的值
可變報頭
在固定報頭和body之間,內容根據報文類型不同而不同。可變報頭的標識符字段存在於在多個類型的報文里。?
報文標識符類型:
很多控制報文的可變報頭部分,包含一個兩字節的報文標識符字段。比如:PUBLISH(QoS > 0時), PUBACK,PUBREC,PUBREL,
PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCIBE,UNSUBACK。
SUBSCRIBE,UNSUBSCRIBE 和 PUBLISH(QoS大於0)控制報文必須包含一個非零的16位報文標識符。
有效載荷
對於PUBLISH來說就是消息內容了。
需要有效載荷的控制報文:CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE。 PUBLISH是可選。