MQTT学习笔记(3)

MQTT协议数据包结构

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:

  • 固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
  • 可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
  • 消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。
    在这里插入图片描述

固定报头

第1个字节是代表控制报文类型,从第2字节开始表示剩余长度

MQTT固定报头第1字节

MQTT固定报头第1个字节的高4bit表示报文类型是代表控制报文类型:
在这里插入图片描述
MQTT固定报头的第一个字节的低4bit表示报文类型对应的标志位:
位置:Byte 1中bits 3-0。
在这里插入图片描述
在不使用标识位的消息类型中,标识位被作为保留位。如果收到无效的标志时,接收端必须关闭网络连接:

  • DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
  • QoS:发布消息的服务质量,即:保证消息传递的次数
    • Ø00:最多一次,即:<=1
    • Ø01:至少一次,即:>=1
    • Ø10:一次,即:=1
    • Ø11:预留
  • RETAIN:发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果没有那么推送至当前订阅者后释放。

在这里插入图片描述

MQTT固定报头第2字节

MQTT固定报头第2字节开始表示剩余长度:
剩余长度 = 可变报头 + 有效负载的长度
剩余长度采用变长度编码方案,规定,一个字节bit7为1表示后面继续属于剩余长度字节,bit0-bit6表示字节数,所以一个字节本身能表示0~127,如果超过127,则要往后加一个字节。
例如:数字 321 编码规则如下
在这里插入图片描述

可变报头

一些报文在固定报头和荷载之间可以有一个可变报头。可变报头的内容根据报文类型不同而不同。最常见的可变报头是报文标识符(PacketIdentifier)。

一些报文可以在最后携带一个荷载。不同的报文可以无荷载,可选荷载,或必须带有荷载。
可变报头字段有很多,比如
协议名 (Protocol Name)
协议级别 (Protocol Level)
连接标志 (Connect Flags)
保活时间 (Keep Alive)
连接标识符(Packet Identifier)
  不同固定报头所搭配的可变报头的字段也不一样,这个在之后详细说到,这里先介绍下报文标识符(Packet Identifier)这个字段,该字段是占2字节的非零数。
 客户端每次发送新类型报文时都必须分配一个已经释放的报文标识符,如果客户端要重发这个这个报文时,就必须使用相同的报文标识符,当客户端处理完这个重发报文对应的确认后,这个报文标识符就被释放可重用。服务端也是这样,但是客户端和服务端是彼此独立的分配报文标识符,因此有可能客户端服务端使用相同的报文标识符。
PUBACK, PUBREC, PUBREL 报文必须包含与最初发送的 PUBLISH 报文相同的报文标识符 。类似地, SUBACK 和 UNSUBACK 必须包含在对应的 SUBSCRIBE 和 UNSUBSCRIBE 报文中使用的报文标识符。
在这里插入图片描述
连接标志:
在这里插入图片描述

  • 清除会话标志位:
    这个标志位定义了如何处理会话状态。如果设置为0,客户端和代理可以恢复上一次连接时的会话状态,如果上一次连接的会话状态不存在,代理将会为客户端建立一个新的会话。如果该位设置为1,则双方将清除掉上一次连接的会话状态并建立一个新的会话。
  • 遗愿标志位: 如果遗愿标志为1,则遗愿消息会被存储在代理上,当连接关闭时,代理将发布这个消息,除非在客户端断开连接时把遗愿消息清除了。
  • 遗愿QoS标志位: 指定了遗愿消息的服务质量等级。
  • 保留遗愿消息标志位: 指定在发布遗愿消息的时候,是否把该消息作为保留消息存储在代理。
  • 用户名标志位: 如果设置为1,则用户名必须出现在荷载中,反之,用户名不允许出现在荷载中。
  • 密码标志位: 如果该位为1,则密码必须出现在荷载中;如果该位为0,则密码不允许出现在荷载中。如果用户名标志位为0,则该位必须也为0。

有效荷载

对于 PUBLISH 来说有效载荷就是应用消息。
在这里插入图片描述
下一节:MQTT学习记录(4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值