MQTT報文結構算法
控制報文由三部分組成:編碼
一、Fixed header 固定報頭,全部報文都包含spa
二、Variable header 可變報頭,部分報文包含3d
三、Body 有效載荷,部分報文包含code
固定報頭orm
報頭長度:2 ~ 5 Bytesblog
一、報文類型:由第一個字節4-7 表示;共16個類型,可是保留第0個,第15個類型不用:ip
二、標誌位,標誌報文類型的特定標誌,第一個字節的0-3:rem
三、剩餘長度,從第二個字節開始,最少一個字節,最長四個字節。表示當前報文剩餘部分(可變報頭+負載數據)的字節數。不包括用於編碼Remaining Length字段自己的字節數。it
它使用一個變長度編碼方案,對小於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是可選。