MQTT报文协议

本文深入探讨MQTT协议,详细解析服务器和设备之间的报文结构。包括报文头的功能码、时间戳、PID、MID等关键字段,以及设备发送报文的流程。通过学习,读者将能更好地理解和实现MQTT通信过程。

MQTT报文协议

之前一篇文章讲述了关于后台服务器和设备之间的通信的博客(链接),现在深入具体的协议报文以及一些代码实现。

服务器发送报文

根据topic区分设备和版本:
在这里插入图片描述
报文头(区分报文是谁发送的):

  • 服务器上报
  • 设备上报

数据区

  • 功能码(让设备要执行的一些操作)
  • 时间戳(校验发送与接收时间差,超时的就废弃掉)
  • PID(流水号,识别整个流程)
  • MID(信息号,区分信息发送顺序)
  • 数据长度
  • 数据

校验区

  • 检验报文完整性

封装数据后台代码

public static byte [] getData2Send(ServerProtocolType type, int pid, Date lastCalibrationTime) throws AlertException {
   
   
        byte [] buf;
        int len
### MQTT协议报文结构详解 MQTT协议报文结构由三部分组成:固定报头(Fixed Header)、可变报头(Variable Header)和有效载荷(Payload)。每一部分在不同类型的控制报文中可能有所不同,但整体结构保持一致。 #### 固定报头(Fixed Header) 固定报头存在于每个MQTT控制报文中,用于标识报文的类型(如CONNECT、PUBLISH、SUBSCRIBE等)以及一些控制标志。固定报头的长度为1到5个字节,其中第一个字节的高4位表示报文类型,低4位表示标志位。其余字节用于表示剩余长度(Remaining Length),即报文中可变报头和有效载荷的总长度。例如,在PUBLISH控制报文中,固定报头的标志位可能包含QoS等级和保留消息标志等信息 [^2]。 #### 可变报头(Variable Header) 可变报头并非所有控制报文都包含,它主要用于携带一些额外的信息,这些信息对于特定类型的控制报文是必需的。例如,在CONNECT控制报文中,可变报头包含客户端ID(Client ID)、保持连接时间(Keep Alive)、清理会话标志(Clean Session)等信息。而在PUBLISH控制报文中,可变报头包含主题名称(Topic Name)和数据包标识符(Packet ID)等信息 [^1]。 ##### 主题名称(Topic Name) 主题名称是MQTT协议中用于标识消息订阅的关键信息。MQTT基于订阅/发布模型,主题名称类似于新闻客户端中的栏目订阅,用于区分不同的消息推送类别。主题名称在PUBLISH和SUBSCRIBE控制报文中尤为重要,它可以是任意字符串,最长可达32767个字符 [^3]。 #### 有效载荷(Payload) 有效载荷部分包含了实际的应用消息。在PUBLISH控制报文中,有效载荷即为发布者发送的消息内容。对于其他类型的控制报文,有效载荷可能包含客户端的认证信息(如用户名和密码)、订阅请求的主题列表等。有效载荷的具体内容和格式取决于控制报文的类型和应用场景 [^1]。 ### 示例:PUBLISH控制报文 以PUBLISH控制报文为例,其固定报头通常包含报文类型和QoS等级等信息,可变报头包含主题名称和数据包标识符,而有效载荷则包含实际的消息内容。例如,一个PUBLISH控制报文可能如下所示: ```plaintext Header Flags: 0x30 (Publish Message) Msg Len: 33 Topic: aliyun_mqtt_test Message: hello mqtt demo ``` 在这个例子中,固定报头`0x30`表示这是一个PUBLISH控制报文,`Msg Len: 33`表示可变报头和有效载荷的总长度,`Topic: aliyun_mqtt_test`是可变报头的一部分,而`Message: hello mqtt demo`则是有效载荷 [^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值