MQTT报文类型

1. MQTT 报文类型概述

MQTT 协议定义了 14种报文类型,每种类型有不同的用途。常见的类型包括:

CONNECT:客户端连接请求

PUBLISH:发布消息(携带应用数据)

SUBSCRIBE:订阅主题

PUBACK:QoS 1消息的确认

PINGREQ/PINGRESP:心跳包

2. 何时接收 PUBLISH 报文?

当以下条件满足时,接收到的报文是 PUBLISH 报文:

客户端已订阅主题:客户端通过 SUBSCRIBE 报文订阅了某个主题。

服务端推送消息:服务端(或另一个客户端)向该主题发布消息,通过 PUBLISH 报文传输。

QoS 匹配:根据 QoS 级别,可能伴随 PUBACK/PUBREC 等确认报文。

3. 如何判断报文类型?

通过 Fixed Header 的第一个字节 判断报文类型:

c 复制代码
uint8_t packet_type = packet[0] >> 4;  // 高4位为报文类型

如果 packet_type == 0x3,则为 PUBLISH 报文。

其他值对应不同报文类型(如 0x2=CONNACK、0x9=SUBACK)。

4. PUBLISH 报文的结构

一个典型的 PUBLISH 报文结构如下:

c 复制代码
 Fixed Header (类型+标志+剩余长度) | Variable Header (主题+Packet ID) | Payload (消息内容)

Fixed Header:必选,包含报文类型(0x3)和 QoS 标志。

Variable Header:包含主题名(UTF-8 字符串)和 Packet ID(QoS > 0 时存在)。

Payload:实际传输的数据(可以是任意二进制内容)。

5. 示例:接收 PUBLISH 报文

假设客户端订阅了主题 /sensor/temperature,当服务端向该主题发布消息时,客户端会收到如下 PUBLISH 报文:

c 复制代码
Fixed Header:
  0x30                // 报文类型=0x3 (PUBLISH), QoS=0, RETAIN=0
  0x12                // 剩余长度=18字节

Variable Header:
  0x00 0x10           // 主题长度=16字节
  "/sensor/temp"      // 主题(16字节)

Payload:
  "25.5℃"            // 消息内容(5字节)

6. 其他常见接收报文

7. 如何验证接收的报文类型?

通过代码解析第一个字节的高4位:

c 复制代码
void handle_mqtt_packet(uint8_t *packet) {
    uint8_t packet_type = packet[0] >> 4;
    
    if (packet_type == 0x3) {
        printf("收到 PUBLISH 报文\n");
        parse_publish_packet(packet);
    } else if (packet_type == 0x2) {
        printf("收到 CONNACK 报文\n");
    }
    // 其他类型处理...
}

总结

属于 PUBLISH 的情况:当客户端订阅主题后接收应用数据时,报文类型为 PUBLISH。

不属于 PUBLISH 的情况:连接确认(CONNACK)、订阅确认(SUBACK)等控制报文。

验证方法:通过报文头的第一个字节高4位判断类型。

相关推荐
啊阿狸不会拉杆7 小时前
《计算机网络-自顶向下方法》5.4 ISP之间的路由选择:BGP 读书笔记
网络·计算机网络·接口隔离原则
phltxy7 小时前
C语言操作符详解
java·c语言·算法
RuoZoe8 小时前
从 2026 年 3 月 1 日开源,到 26.10.9:Jalium UI 半年时间到底走了多远?
c语言·c++
Delite8029 小时前
摆脱实验室束缚:便携式卡尔费休微量水分检测技术与现场应用解析
大数据·网络·人工智能
ACP广源盛139246256739 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#YLB3116 中端多盘存储扩展在 AI 服务中的机会与应用场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos
ACP广源盛139246256739 小时前
M6/M5 Pro Mac mini 端侧 AI 新形态@ACP#GSV5800 Serdes 长距离视频传输在 AI 服务中的机会与落地场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos·音视频
我爱cope10 小时前
【计算机网络 | 传输层3:TCP 协议概述:面向连接、可靠传输到底意味着什么?】
网络·网络协议·学习·tcp/ip·计算机网络·传输层
知无不研10 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
OIDCAT11 小时前
国产USB转千兆网卡芯片CH398-RTL8153国产替代实测与选型
网络·嵌入式硬件·智能硬件·国产芯片·usb转千兆网卡