MQTT协议的报文主要包括以下几种类型:
-
CONNECT(连接):客户端向代理发送连接请求,包括客户端标识、保持连接的持续时间、用户名和密码(如果需要认证)。
-
CONNACK(连接确认):代理对客户端的连接请求作出响应,确认连接建立。
-
PUBLISH(发布):客户端向代理发布消息,消息会被发送到指定的主题。
-
PUBACK(发布确认):代理对客户端发布的消息作出响应,确认消息已成功接收。
-
PUBREC(发布接收):代理对客户端发布的消息作出响应,确认消息已接收但尚未处理。
-
PUBREL(发布释放):代理对客户端发布的消息作出响应,确认消息已处理。
-
PUBCOMP(发布完成):客户端对代理发布的消息作出响应,确认消息已处理完毕。
-
SUBSCRIBE(订阅):客户端向代理请求订阅一个或多个主题。
-
SUBACK(订阅确认):代理对客户端的订阅请求作出响应,确认订阅状态。
-
UNSUBSCRIBE(取消订阅):客户端请求取消对一个或多个主题的订阅。
-
UNSUBACK(取消订阅确认):代理对客户端的取消订阅请求作出响应,确认取消订阅状态。
-
PINGREQ(心跳请求):客户端向代理发送心跳请求,以保持连接活跃。
-
PINGRESP(心跳响应):代理对客户端的心跳请求作出响应,确认连接仍然活跃。
-
DISCONNECT(断开连接):客户端或代理请求断开连接
MQTT报文
基本组成部分
MQTT(Message Queuing Telemetry Transport)报文主要由三部分组成:固定报头(Fixed Header)、可变报头(Variable Header)和有效载荷(Payload)。
-
固定头(Fixed Header):固定头是每个MQTT报文的前几个字节,它包含了报文的类型和标志位,以及剩余长度(如果有的话)。
-
可变头(Variable Header):可变头是报文的第二部分,它包含了与特定报文类型相关的额外信息。例如,在CONNECT报文中,可变头可能包含客户端标识、连接协议版本、会话存在期、用户名和密码等信息。
-
有效载荷(Payload):有效载荷是报文的实际内容,它包含了消息正文或其他与特定报文类型相关的数据。在PUBLISH报文中,有效载荷包含了要发布的消息。
固定头:
| 控制位(Control Bits) | 剩余长度(Remaining Length) |
|------------------------|------------------------------|
可变头(CONNECT报文示例):
| 连接协议版本(Protocol Name and Version) | 连接协议级别(Connect Flags) | 会话存在期(Keep Alive) | 客户端标识(Client Identifier) | 用户名(Username) | 密码(Password) |
|------------------------|------------------------------|-----------------------|-----------------------|-----------------------|-----------------------|
有效载荷(PUBLISH报文示例):
| 主题(Topic Name) | 消息(Message) |
|---------------------|----------------|
MQTT报文中的大致字节数
MQTT报文中的大致字节数:
-
固定头(Fixed Header):固定头的大小取决于报文类型和剩余长度。报文类型占用1字节,剩余长度占1字节到4字节不等,具体取决于剩余长度的大小。
-
可变头(Variable Header):可变头的大小取决于报文的类型和内容。例如,在CONNECT报文中,可变头可能包含客户端标识、连接协议版本、会话存在期、用户名和密码等信息,这些信息的大小各不相同。
-
有效载荷(Payload):有效载荷的大小取决于报文的类型和内容。例如,在PUBLISH报文中,有效载荷包含要发布的消息,其大小可以从一个字节到数千字节不等。
例如,对于一个简单的PUBLISH报文,
其固定头可能是:
- 控制位:1字节
- 剩余长度:2字节(假设剩余长度为65535)
可变头可能是:
- 主题(Topic Name):3字节(假设主题名称为“test/topic”)
- 消息(Message):10字节(假设消息内容为“Hello, MQTT!”)
因此,这个PUBLISH报文的总大小是:
- 固定头:3字节
- 可变头:3字节(主题)+ 10字节(消息)= 13字节
- 有效载荷:13字节
- 总大小:3字节(固定头)+ 13字节(可变头和有效载荷)= 16字节
请注意,这里的字节数是估算的,实际的报文大小可能会因为报文类型的不同和内容的差异而有所不同。在MQTT协议中,为了减少网络带宽的使用,固定头和可变头的大小通常被设计得尽可能小,而有效载荷则可以根据需要灵活调整大小。