MQTT报文格式

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是可选。

相关文章
相关标签/搜索