MQTT协议数据包结构(固定头)

官方文档中对于MQTT协议包的结构有着具体的说明:http://mqtt.org/documentation

MQTT 协议中,一个 MQTT 数据包由:固定头( Fixed header )、可变头( Variable header )、消息体
payload )三部分构成。 MQTT 数据包结构如下:
1 )固定头( Fixed header )。存在于所有 MQTT 数据包中,表示数据包类型及数据包的分组类标识, 如连接,发布,订阅,心跳等。其中固定头是必须的,所有类型的MQTT 协议中,都必须包含固定头。
2 )可变头( Variable header )。存在于部分 MQTT 数据包中,数据包类型决定了可变头是否存在及其具体内容。可变头部不是可选的意思,而是指这部分在有些协议类型中存在,在有些协议中不存在。
(3 )消息体( Payload )。存在于部分 MQTT 数据包中,表示客户端收到的具体内容。 与可变头一样, 在有些协议类型中有消息内容,有些协议类型中没有消息内容。

1 固定头(Fixed header

     固定头存在于所有MQTT数据包中, 固定头包含两部分内容,首字节(字节1)和剩余消息报文长度(从第二个字 节开始,长度为1-4字节),剩余长度是当前包中剩余内容长度的字节数,包括变量头和有效负载中的数据)。剩余长度不包含用来编码剩余长度的字节。

    剩余长度使用了一种可变长度的结构来编码,这种结构使用单一字节表示 0-127 的值。大于 127 的值如下处 理。每个字节的低7 位用来编码数据,最高位用来表示是否还有后续字节。因此每个字节可以编码 128 个值,再加 上一个标识位。剩余长度最多可以用四个字节来表示。
数据包类型
位置:第一个字节 (Byte 1) 中的 7-4 bit (Bit[7-4]) ,表示 4 位无符号值
通过第一个字节的高 4 位确定消息报文的类型, 4 bit 位能确定 16 种类型,其中 0000 1111 是保留字段。
MQTT 消息报文类型如下:

标志位

位置:第一个字节中的 0-3 bit (Bit[3-0]) 。意思是字节位 Bit[3-0] 用作报文的标识。
首字节的低 4 (bit3~bit0) 用来表示某些报文类型的控制字段,实际上只有少数报文类型有控制位,如下图:

(1):其中Bit[3]DUP字段,如果该值为1,表明这个数据包是一条重复的消息;否则该数据包就是第一次

发布的消息。
2 ): Bit[2-1] Qos 字段:
如果 Bit 1 Bit 2 都为 0 ,表示 QoS 0 :至多一次;
如果 Bit 1 1 ,表示 QoS 1 :至少一次;
如果 Bit 2 1 ,表示 QoS 2 :只有一次;
如果同时将 Bit 1 Bit 2 都设置成 1 ,那么客户端或服务器认为这是一条非法的消息,会关闭当前连接。
 
目前 Bit[3-0] 只在 PUBLISH 协议中使用有效,并且表中指明了是 MQTT 3.1.1 版本。对于其它 MQTT 协议版
本,内容可能不同。所有固定头标记为 " 保留 " 的协议类型, Bit[3-0] 必须保持与表中保持一致,如 SUBSCRIBE
协议,其 Bit 1 必须为 1 。如果接收方接收到非法的消息,会强行关闭当前连接。

MQTT消息QoS

MQTT 发布消息服务质量保证( QoS )不是端到端的,是客户端与服务器之间的。订阅者收到 MQTT 消息的
QoS 级别,最终取决于发布消息的 QoS 和主题订阅的 QoS

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Max恒

为了开源加油 ! !

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值