Linux平台搭建MQTT测试环境-CSDN博客基于这里的测试代码抓包
sudo tcpdump -i any -w mqtt1.cap
上述源码中 tcp://localhost:1883
配置连接:
- Broker Address:
localhost
- Port:
1883
整体通信流程
1. Subscriber和Broker(代理服务器)建立连接
-
客户端向Broker发送CONNECT报文,包含:
- Client ID:唯一标识客户端的ID(若为
clean session=true
,Broker不保存会话状态)。 - 认证信息:如用户名、密码(可选)。
- 遗嘱消息(Last Will):客户端异常断开时,Broker自动发布的预设消息。
- 心跳间隔(Keep Alive):客户端定期发送心跳包维持连接。
- Client ID:唯一标识客户端的ID(若为
-
Broker → 客户端
Broker返回CONNACK报文,确认连接成功或失败(包含状态码)。
2. 订阅主题(Subscriber)
-
Subscriber → Broker
订阅者发送SUBSCRIBE报文,指定要订阅的主题(Topic)(支持通配符+
和#
,如sensor/+/temperature
)。 -
Broker → Subscriber
Broker返回SUBACK报文,确认订阅成功及QoS等级。
3. Publisher和Broker(代理服务器)建立连接
4. 发布消息(Publisher)
-
Publisher → Broker
发布者发送PUBLISH报文,包含:- Topic:消息的主题(如
sensor/room1/temperature
)。 - Payload:消息内容(二进制或文本)。
- QoS等级:服务质量级别(0、1、2)。
- QoS 0:最多一次(可能丢包)。
- QoS 2:精确一次(需两次握手)。
- QoS 1:至少一次(需确认)。
-
Broker → Subscriber
Broker根据主题匹配规则,将消息转发给所有订阅该主题的客户端。
- Topic:消息的主题(如
5. 消息确认(QoS 1/2)
- QoS 1:接收方返回PUBACK报文确认收到。
- QoS 2:发送方和接收方通过PUBREC/PUBREL/PUBCOMP报文完成两次握手,确保消息不重复。
6. 取消订阅
-
Subscriber → Broker
发送UNSUBSCRIBE报文,移除对特定主题的订阅。 -
Broker → Subscriber
返回UNSUBACK报文确认。