MQTT 消息数据结构介绍

MQTT协议(Message Queuing Telemetry Transport,消息队列遥测传输协议)的结构主要由三个部分组成:固定报头(Fixed Header)、可变报头(Variable Header)和有效载荷(Payload,有时也称为消息体)。以下是对这三个部分的详细说明:

一、固定报头(Fixed Header)

固定报头存在于所有MQTT数据包中,是所有报文的统一格式。它通常占用两个字节(16位),用于标识和控制报文。固定报头包含以下几个关键部分:

  1. 报文类型(Message Type)
    • 占4位(Byte 1的第7-4位),用于标识报文的类型,如CONNECT(连接请求)、PUBLISH(发布消息)、SUBSCRIBE(订阅主题)、SUBACK(订阅确认)等。MQTT协议定义了多种报文类型,每种类型都有其特定的用途和格式。
  2. 标志位(Flags)
    • 占若干位(具体位数根据报文类型而定),用于控制报文的某些行为,如是否需要确认、是否保留消息等。不同的报文类型有不同的标志位组合。
  3. 剩余长度(Remaining Length)
    • 占至少1个字节(最多4个字节),用于表示可变报头和有效载荷的总长度。由于MQTT协议是一种可变长度的协议,因此剩余长度字段是必需的,以便接收端能够正确地解析整个报文。

二、可变报头(Variable Header)

可变报头位于固定报头和有效载荷之间,是某些特定报文具备的额外头部信息。其存在与否以及具体内容取决于固定报头中的报文类型。可变报头可以包含以下信息(但并非所有报文类型都包含以下所有信息):

  1. 协议名(Protocol Name)(仅CONNECT报文):
    • 标识使用的MQTT协议名称,一般为"MQTT"。
  2. 协议级别(Protocol Level)(仅CONNECT报文):
    • 标识MQTT协议的版本,如3.1.1、5.0等。
  3. 连接标志(Connect Flags)(仅CONNECT报文):
    • 包含一系列用于指定MQTT连接行为的参数,如是否为干净会话、是否保存会话信息、是否包含用户名和密码等。
  4. 消息ID(Message ID)(部分报文类型):
    • 用于标识客户端和服务端之间的消息交互,特别是在需要确认的情况下。例如,在PUBLISH报文中,当QoS等级大于0时,需要包含消息ID以便服务端进行确认。
  5. 主题名(Topic Name)(PUBLISH、SUBSCRIBE、SUBACK、UNSUBSCRIBE等报文):
    • 用于指定消息的主题,以便订阅者能够正确地接收和处理消息。

三、有效载荷(Payload)

有效载荷位于可变报头之后,是MQTT协议的具体消息内容。其存在与否以及内容取决于报文类型。对于不同类型的报文,有效载荷的内容也有所不同:

  1. CONNECT报文
    • 包含客户端的连接参数,如客户端ID、用户名、密码、保持连接时间等。
  2. PUBLISH报文
    • 包含实际发布的应用消息内容。这是MQTT协议中最常见的报文类型之一,用于在客户端和服务端之间传输数据。
  3. SUBSCRIBE报文
    • 包含客户端希望订阅的主题以及每个主题的QoS等级。
  4. SUBACK报文
    • 包含服务端对于SUBSCRIBE报文的确认信息,包括每个订阅主题的实际QoS等级。
  5. 其他报文类型
    • 根据报文类型的不同,有效载荷可能包含不同的信息。例如,PINGREQ和PINGRESP报文不包含有效载荷,仅用于检测客户端和服务端之间的连接是否活跃。

总的来说,MQTT协议的这三个部分共同协作,实现了在不可靠的网络环境中为远程设备提供可靠、高效的消息传输服务。其中,固定报头提供了统一的报文格式和消息类型标识;可变报头提供了与消息类型相关的附加信息;而有效载荷则包含了实际的应用消息内容。这种结构使得MQTT协议既能够满足远程设备通讯的需求,又能够保持轻量级的特性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值