MQTT協議是目前物聯網通訊中使用最廣泛的通訊協議之一,協議簡單數據快速。協議本身很容易懂,只是數據長度的計算難倒了很多人。這裡我進行簡單的舉例,幫忙大家理解。
從GIT上抓圖,可以看到剩餘長度的字節是變長度的。
首先,收到字節集數據之後,將數據的十六進位代碼截取,判斷可變長度佔多少字節。判斷方式為:判斷第一個字節是否大於127,如果是,接著判斷下一個字節,一直到小於或等於127的那個字節,字節數量最大為4,超過4則代碼錯誤。放棄讀取。
假設每個字節的十進位整數為Byte1~Byte4
單個字節很好計算,即直接將十六進位轉換為十進位
兩個字節的計算方式:
剩餘長度=(Byte1-128)+Byte2*128
三個字節的計算方式:
剩餘長度=(Byte1-128)+[(Byte2-128)+Byte3*128]*128
以此類推,四個字節的計算方式為:
剩餘長度=(Byte1-128)+{(Byte2-128)+[(Byte3-128)+Byte4*128]*128}*128
反算該如何計算呢?
首先判斷屬於幾個字節,即剩餘長度的範圍
0~127為單字節,即剩餘長度直接轉換為十六進位
128~16838為兩個字節,
先按照說明書上的寫法計算最後字節,即Byte2。
do
encodedByte = X MOD 128
X = X DIV 128
if ( X > 0 )
encodedByte = encodedByte OR 128
Endif
while ( X > 0 )
然後再計算Byte1,反算方式如下:
Byte1=(總長度-encodedByte*128)+128
Byte2=encodedByte
因為剩下的三個字節和四個字節涉及到的計算比較複雜,所以我們利用計算機的強大計算能力,採用迭代的方式進行計算。
如下為了便於理解採用是易語言程序的計算方式:
三個字節的算法:
Byte1=S1+128
Byte2=S2+128
Byte3=encodedByte
四個字節的算法:
Byte1=S1+128
Byte2=S2+128
Byte3=S3+128
Byte4=encodedByte