首页 > 编程知识 正文

mqtt协议报文格式,mqtt报文格式

时间:2023-05-04 18:00:05 阅读:12258 作者:4919

建议使用稳定的基于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 个字节

1.2.2 可变报头 1.2.2.1 连接确认标志

00
位置:可变报头的第1个字节的第0位
连接确认,具体的内容可以看考MQTT 标准协议.

1.2.2.2 连接返回码

00
位置:可变报头的第2个字节,返回码定义如下:

值返回码响应描述00x00连接已接受连接已被服务器接受10x01连接已拒绝,不支持的协议版本服务器不支持客户端请求的协议版本20x02连接已拒绝,不合格的客户端ID客户端ID是正确的UTF-8码,但服务器不允许使用30x03连接已拒绝,服务端不可用网络连接已建立,但MQTT服务不可用40x04连接已拒绝,无效的用户名或密码用户名或密码的数据格式无效50x05连接已拒绝,未授权客户端未被授权连接到此服务器6-255Reserved保留1.2.3 有效载荷

CONNACK报文没有有效载荷

2 MQTT Client发送包含 遗嘱 的CONNECT

MQTT Client配置遗嘱LWT如下所示:

2.1 含遗嘱参数的CONNECT 抓包


其中CONNECT报文源码如下:

10 47 00 04 4d 51 54 54 04 ee00 3c 00 08 63 6c 69 65 6e 74 30 31 00 11 2f 6f66 66 6c 69 6e 65 2f 63 6c 69 65 6e 74 30 31 000d 64 65 76 69 63 65 20 6f 66 66 69 63 65 00 0561 64 6d 69 6e 00 08 70 61 73 73 77 6f 72 64 2.1.1 固定报头

0x10 0x47
其中:
0x10–对应的是CONNECT
0x47–剩余长度0x47 = 71个字节。

2.1.2 可变报头 2.1.2.1 协议名

0x00 0x04 0x4d 0x51 0x54 0x54
其中0x00 0x04为协议名称长度–4个字节
0x4d 0x51 0x54 0x54 ,对应的ASCII码为:‘M’, ‘Q’, ‘T’, ‘T’

2.1.2.2 协议等级

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时间内没有收到客户端的消息,会自动断开与客户端建立的连接。

2.1.2.5 Client ID

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

2.1.2.6 Will Topic

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

2.1.2.7 Will Message

**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

2.1.2.8 User Name

00 05 61 64 6d 69 6e
其中:
00 05 --User Name长度为5个字节
61 64 6d 69 6e – 对应的ASCII码值为: a d m i n

2.1.2.9 Password

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

2.2 含遗嘱参数的 CONNACK 抓包


报文源码:

20 02 00 00 2.2.1 固定报头

0x20 0x02
其中:
0x20 – 对应的控制包类型为 CONNACK
02 – 剩余字节长度为 2 个字节

2.2.2 可变报头 2.2.2.1 连接确认标志

00
位置:可变报头的第1个字节的第0位
连接确认,具体的内容可以看考MQTT 标准协议.

2.2.2.2 连接返回码

00
位置:可变报头的第2个字节,返回码定义如下:

值返回码响应描述00x00连接已接受连接已被服务器接受10x01连接已拒绝,不支持的协议版本服务器不支持客户端请求的协议版本20x02连接已拒绝,不合格的客户端ID客户端ID是正确的UTF-8码,但服务器不允许使用30x03连接已拒绝,服务端不可用网络连接已建立,但MQTT服务不可用40x04连接已拒绝,无效的用户名或密码用户名或密码的数据格式无效50x05连接已拒绝,未授权客户端未被授权连接到此服务器6-255Reserved保留2.2.3 有效载荷

CONNACK报文没有有效载荷

小结

MQTT协议的CONNECT/CONNACK还是非常标准的。
如果想要设定遗嘱参数,必须要在进行CONNECT之前就将相关参数设定,才能有效。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。