建议使用稳定的基于c的cMQTT客户端开源库cMQTT
MQTT协议详细信息和开发教程(1) MQTT协议概述
MQTT协议详细信息和开发教程(2)构建MQTT服务器EMQx
MQTT协议详细信息和开发教程(3) MQTT客户端工具软件选择和简单测试
MQTT协议详细信息和开发教程(四) MQTT协议消息格式
前言上一篇文章总体介绍了MQTT协议的消息格式。 本文通过实例代码分析MQTT的不同类型的控制消息。 我们使用以前构建的MQTT服务器和MQTT.fx进行测试,同时使用Wireshark捕获数据包,从最低字节级别分析MQTT控制消息。
1 .启动不包含1.MQTT.fx遗嘱的连接
连接成功后,看看Wireshark包的样子。
从上面照片中包的效果可以看出。
)1) MQTT协议是一种基于TCP协议的APP应用层协议,也就是说MQTT协议也是一种TCP协议。
)2) MQTT的CONNECT分为两个步骤,客户端首先与服务器建立TCP连接(三次握手),连接成功后进行业务级连接。
TCP的三次握手连接在本系列文章中不进行说明。 让我们重点分析一下MQTT的connect连接过程
1.1 mqtt客户端发送CONNECT消息获得Wireshark分析结果如下。
逐一分析消息的内容。
//源代码10250004 d 515404 c 2003 c 000863 c 6965 e 74310005646 d 69 e 00087061737766 f 7264.1.1固定标头0x10 0x25
其中,http://www.Sina.com /对应于connect http://www.Sina.com /剩余长度0x25=37字节。
1.1.2可变标头1.1.2.1协议名称0x10
其中0x25为协议名称长度4字节0x00 0x04 0x4d 0x51 0x54 0x54,对应的ASCII码为‘m’、‘q’、‘t’和‘t’
1.1.2.2协议等级0x00 0x04MQTT版本号,04v3.1. 1
1.1.2.3连接标志0x4d 0x51 0x54 0x54
在bit 76543210 user nameflagpasswordflagwillretainflagwillqosmsbwillqoslsbwillflagcleansessionreserved 1100010的描述之后,键入username,pase
1.1.2.4保持连接的http://www.Sina.com /以十进制表示60秒。
“保持活动”(Keep Alive )以秒为单位的时间间隔表示16位。 这是从客户端发送完一个控制消息到发送下一个消息之间允许在两者之间空闲的最大时间间隔。 客户端有责任确保控制消息的发送间隔不超过维持连接的值。 如果没有其它控制消息可以发送,则客户端必须发送PINGREQ消息。
客户端可以随时发送ping命令。 服务器在KeepAalive时间内发现没有收到客户端的消息时,会自动断开与客户端的连接。
1.1.2.5 clientid http://www.Sina.com /
其中http://www.Sina.com /clientid的长度为8字节http://www.Sina.com /相应的ASCII代码值为clIent0
1.1.2.6 username * * 000561646 d696e * *
其中,对应于http://www.Sina.com /username长度为5字节http://www.Sina.com /的ASCII码值为a d m i n
1.1.2.6 password http://www.Sina.com /
其中,与0x04--Password的长度为5字节0xc2-对应的ASCII码值为p a s s w o r d
1.2mqtt客户端收到的CONNACK消息捕获
br> 报文源码: 20 02 00 00 1.2.1 固定报头0x20 0x02
其中:
0x20 – 对应的控制包类型为 CONNACK
02 – 剩余字节长度为 2 个字节
00
位置:可变报头的第1个字节的第0位
连接确认,具体的内容可以看考MQTT 标准协议.
00
位置:可变报头的第2个字节,返回码定义如下:
CONNACK报文没有有效载荷
2 MQTT Client发送包含 遗嘱 的CONNECTMQTT Client配置遗嘱LWT如下所示:
其中CONNECT报文源码如下:
0x10 0x47
其中:
0x10–对应的是CONNECT
0x47–剩余长度0x47 = 71个字节。
0x00 0x04 0x4d 0x51 0x54 0x54
其中0x00 0x04为协议名称长度–4个字节
0x4d 0x51 0x54 0x54 ,对应的ASCII码为:‘M’, ‘Q’, ‘T’, ‘T’
0x04 MQTT版本号,04 – v3.1.1
2.1.2.3 连接标志0xee
Bit76543210User Name FlagPassword FlagWill Retain FlagWill QoS MSBWill QoS LSBWill FlagClean sessionRreserved11101110说明后面跟着数据有 User Name、Password,可以看到这里will标志都设置为1.Qos1也设置成了1,
2.1.2.4 保持连接时间0x00 0x3c – 对应十进制 为 60 秒。
保持连接(Keep Alive)是一个以秒为单位的时间间隔,表示16位子,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端 必须发送一个PINGREQ 报文。
客户端随时可以发送ping指令,服务器如果发现在KeepAalive时间内没有收到客户端的消息,会自动断开与客户端建立的连接。
00 08 63 6c 69 65 6e 74 30 31
其中:
00 08 – Client ID长度为8个字节
63 6c 69 65 6e 74 30 31 – 对应的ASCII码值为: c l i e n t 0 1
00 11 2f 6f 66 66 6c 69 6e 65 2f 63 6c 69 65 6e 74 30 31
00 11 – Will Topic 长度为17个字节
2f 6f 66 66 6c 69 6e 65 2f 63 6c 69 65 6e 74 30 31 – 对应的ASCII码值为: /offline/client01
**00 0d 64 65 76 69 63 65 20 6f 66 66 69 63 65 **
其中:
00 0d – Will Message 长度为13个字节
64 65 76 69 63 65 20 6f 66 66 69 63 65 – 对应的ASCII码值为: device office
00 05 61 64 6d 69 6e
其中:
00 05 --User Name长度为5个字节
61 64 6d 69 6e – 对应的ASCII码值为: a d m i n
00 08 70 61 73 73 77 6f 72 64
其中:
00 08 --Password 长度为5个字节
70 61 73 73 77 6f 72 64 – 对应的ASCII码值为: p a s s w o r d
报文源码:
0x20 0x02
其中:
0x20 – 对应的控制包类型为 CONNACK
02 – 剩余字节长度为 2 个字节
00
位置:可变报头的第1个字节的第0位
连接确认,具体的内容可以看考MQTT 标准协议.
00
位置:可变报头的第2个字节,返回码定义如下:
CONNACK报文没有有效载荷
小结MQTT协议的CONNECT/CONNACK还是非常标准的。
如果想要设定遗嘱参数,必须要在进行CONNECT之前就将相关参数设定,才能有效。