MQTT
目录
MQTT CONNECT 数据包
MQTT CONNECT 数据包是客户端向服务器发起连接时发送的第一条消息。它包含客户端的标识信息以及认证和遗嘱配置等数据
CONNECT 数据包结构
1. 固定报头 (Fixed Header)
位 | 字段 | 描述 |
---|---|---|
7-4 | 报文类型 | 值为 1 表示 CONNECT 数据包 |
3-0 | 保留位 | 设置为 0000 |
可变长度 | 剩余长度字段 | 数据包的总长度(不包含固定报头) |
剩余长度字段:表示数据包除去固定报头第一个字节外的剩余部分的长度。它使用 可变长度编码,占 1 到 4 字节。
每个字节最高位是一个继续位:
- 如果最高位是 1,表示下一个字节仍然是剩余长度的一部分。
- 如果最高位是 0,表示结束。
2. 可变报头 (Variable Header)
字段内容
字段名 | 长度 | 描述 |
---|---|---|
协议名称 (Protocol Name) | 可变长度 | MQTT 协议名称,通常是 MQTT(长度为 4 字节) |
协议级别 (Protocol Level) | 1 字节 | MQTT 版本号,目前为 4(MQTT 3.1.1)或 5(MQTT 5.0) |
连接标志 (Connect Flags) | 1 字节 | 标志位,定义遗嘱、用户名、密码等信息的使用 |
保活时间 (Keep Alive) | 2 字节 | 以秒为单位,表示客户端发送心跳的间隔时间 |
连接标志 (Connect Flags) 位说明
位位置 | 名称 | 描述 |
---|---|---|
7 | 用户名标志 (User Name Flag) | 若设置为 1,表示负载中包含用户名 |
6 | 密码标志 (Password Flag) | 若设置为 1,表示负载中包含密码 |
5 | 遗嘱保留 (Will Retain) | 若设置为 1,表示遗嘱消息会以保留消息发布 |
4-3 | 遗嘱 QoS (Will QoS) | 遗嘱消息的 QoS 等级 |
2 | 遗嘱标志 (Will Flag) | 若设置为 1,表示负载中包含遗嘱主题和遗嘱消息 |
1 | 清除会话 (Clean Session) | 若设置为 1,表示客户端与服务器间会话状态不持久化 |
0 | 保留位 | 必须设置为 0 |
3. 有效载荷 (Payload)
根据连接标志位的设置,载荷可以包含以下字段:
字段名 | 描述 |
---|---|
客户端标识符 (Client ID) | 必选字段,标识客户端的唯一 ID |
遗嘱主题 (Will Topic) | 如果设置了遗嘱标志,则包含此字段 |
遗嘱消息 (Will Message) | 如果设置了遗嘱标志,则包含此字段 |
用户名 (Username) | 如果设置了用户名标志,则包含此字段 |
密码 (Password) | 如果设置了密码标志,则包含此字段。 |
示例数据包解析
假设客户端发送以下 CONNECT 数据包(十六进制表示):
10 3E 00 04 4D 51 54 54 04 82 00 3C 00 03 63 6C 69 65 6E 74 01 02 77 69 6C 6C 2F 74 6F 70 69 63 08 4C 61 73 74 20 6D 73 67 04 75 73 65 72 08 70 61 73 73 77 6F 72 64
解读:
1. 固定报头:
- 10:报文类型(CONNECT)
- 3E:剩余长度(62 字节)
2. 可变报头:
- 协议名称:MQTT(00 04 4D 51 54 54)
- 协议级别:04(MQTT 3.1.1)
- 连接标志:82(清除会话 + 遗嘱标志 + 遗嘱 QoS = 2 + 用户名标志 + 密码标志)
- 保活时间:00 3C(60 秒)
3. 有效载荷:
- 客户端标识符:client(00 03 63 6C 69 65 6E 74)
- 遗嘱主题:will/topic(01 02 77 69 6C 6C 2F 74 6F 70 69 63)
- 遗嘱消息:Last msg(08 4C 61 73 74 20 6D 73 67)
- 用户名:user(04 75 73 65 72)
- 密码:password(08 70 61 73 73 77 6F 72 64)
mosquitto搭建本地服务器
下载
配置
启动
mosquitto.exe -c mosquitto.conf -v
订阅主题
发布消息
mosquitto_pub -h localhost -t "topic" -i "client" -m "message"