MQTT报文枚举
时间: 2025-07-22 08:10:59 AIGC 浏览: 23
在MQTT协议中,**报文类型(Packet Type)**通过控制报文的首字节(`Control Packet Type`字段)的高4位标识,低4位为标志位(Flags)。以下是MQTT 3.1.1和5.0协议中定义的**标准报文类型枚举**及其用途:
---
### **1. MQTT 3.1.1 报文类型枚举**
| 十进制值 | 二进制(高4位) | 报文名称 | 方向(C→S/S→C/双向) | 用途说明 |
|----------|------------------|-------------------|----------------------|--------------------------------------------------------------------------|
| 1 | `0001` | CONNECT | C→S | 客户端发起连接请求,包含客户端ID、用户名、密码等。 |
| 2 | `0010` | CONNACK | S→C | 服务器响应连接请求,返回成功或错误码(如协议版本不兼容)。 |
| 3 | `0011` | PUBLISH | 双向 | 发布消息到主题,QoS级别决定是否需要确认(PUBACK/PUBREC等)。 |
| 4 | `0100` | PUBACK | 双向 | QoS1消息的确认响应。 |
| 5 | `0101` | PUBREC | 双向 | QoS2消息的第一阶段确认(接收方收到PUBLISH后回复)。 |
| 6 | `0110` | PUBREL | 双向 | QoS2消息的第二阶段确认(发送方收到PUBREC后回复)。 |
| 7 | `0111` | PUBCOMP | 双向 | QoS2消息的完成确认(接收方收到PUBREL后回复)。 |
| 8 | `1000` | SUBSCRIBE | C→S | 客户端订阅一个或多个主题,包含QoS级别。 |
| 9 | `1001` | SUBACK | S→C | 服务器响应订阅请求,返回每个主题的授权QoS。 |
| 10 | `1010` | UNSUBSCRIBE | C→S | 客户端取消订阅一个或多个主题。 |
| 11 | `1011` | UNSUBACK | S→C | 服务器确认取消订阅请求。 |
| 12 | `1100` | PINGREQ | C→S | 客户端保活请求,检测连接是否存活。 |
| 13 | `1101` | PINGRESP | S→C | 服务器响应保活请求。 |
| 14 | `1110` | DISCONNECT | C→S | 客户端主动断开连接。 |
---
### **2. MQTT 5.0 新增报文类型**
MQTT 5.0在3.1.1基础上扩展了以下报文(主要用于增强功能如属性、原因码等):
| 十进制值 | 二进制(高4位) | 报文名称 | 方向 | 新增特性 |
|----------|------------------|-------------------|------|--------------------------------------------------------------------------|
| 15 | `1111` | AUTH | 双向 | 用于增强认证(如挑战-响应机制),替代部分CONNECT/CONNACK中的认证逻辑。 |
---
### **3. 报文类型在代码中的定义**
#### **(1) 枚举示例(C语言)**
```c
typedef enum {
MQTT_PKT_CONNECT = 1,
MQTT_PKT_CONNACK = 2,
MQTT_PKT_PUBLISH = 3,
MQTT_PKT_PUBACK = 4,
MQTT_PKT_PUBREC = 5,
MQTT_PKT_PUBREL = 6,
MQTT_PKT_PUBCOMP = 7,
MQTT_PKT_SUBSCRIBE = 8,
MQTT_PKT_SUBACK = 9,
MQTT_PKT_UNSUBSCRIBE = 10,
MQTT_PKT_UNSUBACK = 11,
MQTT_PKT_PINGREQ = 12,
MQTT_PKT_PINGRESP = 13,
MQTT_PKT_DISCONNECT = 14,
MQTT_PKT_AUTH = 15 // MQTT 5.0
} MQTT_PacketType;
```
#### **(2) 报文解析逻辑**
```c
uint8_t MQTT_ParsePacketType(uint8_t *packet) {
return (packet[0] >> 4); // 取首字节高4位
}
// 示例:判断报文类型
uint8_t pkt_type = MQTT_ParsePacketType(received_data);
switch (pkt_type) {
case MQTT_PKT_CONNACK:
printf("Received CONNACK\n");
break;
case MQTT_PKT_PUBLISH:
printf("Received PUBLISH\n");
break;
// ...其他类型处理
}
```
---
### **4. 关键注意事项**
1. **方向性**:
- 部分报文仅单向使用(如`PINGREQ`仅客户端发送),需在代码中严格校验方向。
2. **MQTT 5.0兼容性**:
- 若支持MQTT 5.0,需处理`AUTH`报文和属性字段(如`Reason Code`、`Properties`)。
3. **错误处理**:
- 收到未知报文类型(如`0x00`或`0x0F`在MQTT 3.1.1中无效)应断开连接。
4. **QoS影响**:
- `PUBLISH`报文的QoS级别决定是否需要`PUBACK`/`PUBREC`等后续交互。
---
### **5.
阅读全文
相关推荐




















