MQTT协议详细讲解
报文排序目录 虽和手册报文排序存有差异 但符合常理认知 方便快速学习
OneNet MQTT服务器IP地址和端口号 183.230.40.39:6002
设备名称:测试
客户端受控端 (设备ID) :894672089 app
密码 (鉴权信息):dndfssj
单片机控制端 (设备ID) :894767958
密码 (鉴权信息):dpjfssj
二者都为客户端
用户名 (产品ID) :489402
MQTT协议手册
百度网盘链接
MQTT协议
CONNECT
10 ?? 00 04 4D 51 54 54 04 C2 00 78
固定报头 剩余长度 可变报头 MQTT 协议级别 连接标志 保持连接
登录服务器 —— 信息转成十六进制
10 ?? 00 04 4D 51 54 54 04 C2 00 78 00 09 38 39 34 36 37 32 30 38 39 00 06 34 38 39 34 30 32 00 07 64 6E 64 66 73 73 6A
26 == 38 个十六进制数 标记 设备ID字符个数 设备ID十六进制 标记 用户ID字符个数 用户ID十六进制 标记 密码ID字符个数 用户ID十六进制
CONNECT(1) —— 客户端请求与服务端建立连接
客户端登录服务器 (客户端受控端举例)
10 26 00 04 4D 51 54 54 04 C2 00 78 00 09 38 39 34 36 37 32 30 38 39 00 06 34 38 39 34 30 32 00 07 64 6E 64 66 73 73 6A
CONNACK(2) —— 服务端确认连接建立
客户端受控端 回复
20 02 01 00
20 02 01 00
固定报头(成功) 可变+负载(第一个字节为零) 可变报头(不使用离线消息SP) 连接返回码(连接已接受)
DISCONNACK(14) —— 断开连接
E0 00
PING(12) —— 客户端发送PING(连续保活)命令
C0 00
PINGPSP(13) —— PING命令回复
D0 00
固定报头 剩余长度(字节)
SUBSCRIBE(8) —— 订阅请求
例如单片机控制端订阅 app_topic:app_topic 转十六进制 61 70 70 5F 74 6F 70 69 63
82 0E 00 0A 00 09 61 70 70 5F 74 6F 70 69 63 00
82 0E 00 0B 00 09 61 70 70 5F 74 6F 70 69 63 01 (不是同一报文 订阅质量等级1)
82 ?? 00 0A 00 09 61 70 70 5F 74 6F 70 69 63 00
固定报头 剩余长度(字节) 报文标识符(编号10) 有效载荷 转十六进制数 订阅质量等级0
82 ?? 00 0B 00 09 61 70 70 5F 74 6F 70 69 63 01
固定报头 剩余长度(字节) 报文标识符(编号11) 有效载荷 转十六进制数 订阅质量等级1
(不是同一报文)
SUBACK(9) —— 订阅确认
90 03 00 0A 00
固定报头 剩余长度(字节) 服务器回复 报文标识符(编号10) 回复 质量等级0
90 03 00 0B 01
固定报头 剩余长度(字节) 服务器回复 报文标识符(编号11) 回复 质量等级1
UNSUBSCRIBE(10) —— 取消订阅
A2 0D 00 0C 00 09 61 70 70 5F 74 6F 70 69 63
A2 ?? 00 0C 00 09 61 70 70 5F 74 6F 70 69 63
固定报头 剩余长度(字节) 报文标识符(编号13) 有效载荷 无需质量等级
UNSUBACK(11) —— 取消订阅确认
B0 02 00 0C
固定报头 剩余长度(字节) 服务器回复 报文标识符(编号13) 无质量等级0
MQTT协议(C<==>S)
连接服务器
客户端受控端 (设备ID) :894672089
密码 (鉴权信息):dndfssj
客户端受控端 发送连接服务器
10 26 00 04 4D 51 54 54 04 C2 00 78 00 09 38 39 34 36 37 32 30 38 39 00 06 34 38 39 34 30 32 00 07 64 6E 64 66 73 73 6A
单片机控制端 (设备ID) :894767958
密码 (鉴权信息):dpjfssj
单片机控制端 发送连接服务器
10 26 00 04 4D 51 54 54 04 C2 00 78 00 09 38 39 34 37 36 37 39 35 38 00 06 34 38 39 34 30 32 00 07 64 70 6A 66 73 73 6A
相互订阅
受控端订阅控制端 控制端订阅受控端 ———— 相互订阅
客户端受控端订阅 kfb_topic
82 0E 00 0A 00 09 6B 66 62 5F 74 6F 70 69 63 00
单片机控制端订阅 app_topic
82 0E 00 0A 00 09 61 70 70 5F 74 6F 70 69 63 00
PUBLISH(3) —— 发布消息
推送数据 123
服务等级 QoS0 无报文标识符
服务等级 QoS0服务器速度快开销小
30 0E 00 09 6B 66 62 5F 74 6F 70 69 63 31 32 33
30 ?? 00 09 6B 66 62 5F 74 6F 70 69 63 31 32 33
QoS0固定报头 剩余长度(字节) 有效载荷 订阅 kfb_topic 推送的数据
30(十六进制)的二进制为 0 0 1 1 0 0 0 0
MQTT控制报文类型(3) DUP QoS-H QoS- RETAIN(保留标志)
如图所示:
二者相互订阅(只演示订阅等级为0)
单片机推送数据给客户端
客户端也可推送数据给单片机
如不订阅,则收不到任何数据
推送数据 123
服务等级 QoS1 有报文标识符
32 10 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33
32 ?? 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33
QoS1固定报头 剩余长度(字节) 有效载荷 订阅 kfb_topic 报文标识符 推送的数据
30(十六进制)的二进制为 0 0 1 1 0 0 1 0
MQTT控制报文类型(3) DUP QoS-H QoS- RETAIN(保留标志)
PUBACK(4) —— 收到发布消息确认(QoS1 等级)
40 02 00 01
QoS1固定报头 剩余长度(字节) 报文标识符
二者相互订阅(只演示订阅等级为0)
单片机发送 32 10 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33(QoS1 等级)
单片机接收 客户端发来的推送确认 40 02 00 01 —— 回复
表示单片机 推送数据成功
如单片机没有接收到 40 02 00 01则需要重发
把 PUBLISH —— 发布消息 的 DUP置位 3A 10 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33
PUBREC(5) —— 发布消息收到(QoS2 等级)
PUBLISH —— 发布消息
服务等级 QoS2 有报文标识符
34 10 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33
34 10 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33
固定报头为34 十六进制 0100 0 1 0 0
MQTT控制报文类型(3) DUP QoS-H QoS- RETAIN(保留标志)
单片机发送数据 34 10 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33(QoS2 等级)
单片机接收 客户端发来的推送确认 50 02 00 01 —— 第一次推送确认
单片机发送 60 02 00 01 —— 确认 再问
客户端接收数据 34 10 00 09 6B 66 62 5F 74 6F 70 69 63 00 01 31 32 33
单片机接收 客户端发来的推送再确认 70 02 00 01 —— 第二次推送确认
客户端发送 70 02 00 01 —— 确定完成
任何一步没有签收 将重发
结束
PUBREL(6) —— 发布消息释放(QoS2 等级)
二次询问
单片机发送 60 02 00 01 —— 签收 再问
PUBCOMP(7) —— 发布消息完成(QoS2 等级)
客户端发送 70 02 00 01 —— 确定签收完成
表示彻底完成一次数据传输
结束