欢迎阅读 MQTT 5.0 报文系列 的第三篇文章。在上一篇中,我们介绍了 MQTT 5.0 的 PUBLISH 及其响应报文。现在,我们将介绍用于订阅和取消订阅的控制报文。
在 MQTT 中,SUBSCRIBE 报文用于发起订阅请求,SUBACK 报文用于返回订阅结果。而 UNSUBSCRIBE 和 UNSUBACK 报文则在取消订阅时使用。相比于取消订阅,订阅操作更加常用。不过在本文中,我们仍然会一并介绍订阅与取消订阅报文的结构与组成。
报文示例
首先我们借助 Wireshark 来捕获一次真实的 MQTT 订阅请求与响应,这里我们使用 MQTTX CLI 向 公共 MQTT 服务器 发起订阅请求。以下命令将创建一个主题为 demo,且最大 QoS 设置为 2 的订阅:
mqttx sub --hostname broker.emqx.io --mqtt-version 5 --topic demo --qos 2
以下是 Wireshark 捕获到的 SUBSCRIBE 和 SUBACK 报文数据:
# SUBSCRIBE
82 0a 05 be 00 00 04 64 65 6d 6f 02
# SUBACK
90 04 05 be 00 02
Linux 环境可以先使用 tcpdump 命令抓取报文,然后导入至 Wireshark 分析。
这些由十六进制字节组成的原始且晦涩的报文数据,它们分别对应着以下报文内容:
也许你开始好奇它们是如何完成从简单的 MQTTX CLI 命令到复杂的报文数据的转换,或者好奇当你捕获到一个 MQTT 报文,你应该如何从中提取你想要的信息。
那么在接下来的 SUBSCRIBE、SUBACK、UNSUBSCRIBE 以及 UNSUBACK 的报文结构的介绍中,你的疑问将得到解答。
SUBSCRIBE 报文结构
固定报头
在 SUBSCRIBE 报文中,固定报头中首字节的高 4 位值必须为 8&#x