目录
前言
本文章举CONNECT控制报文类型,以便于大家更好的理解MQTT,能自主看懂MQTT协议。
一、CONNECT – 连接服务端
TCP/IP连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文。
在一个网络连接上,客户端只能发送一次CONNECT报文。服务端必须将客户端发送的第二个CONNECT报文当作协议违规处理并断开客户端的连接 。
二、CONNECT的格式数据及讲解
接下来我们就开始数据分析了:
固定报头内容分析![](https://i-blog.csdnimg.cn/blog_migrate/49fe9b59e9719564e948457638227d73.png)
有了第一篇MQTT的讲解,我们知道固定头的4-7位是消息类型,由上面的小图我们知道 CONNECT的值为1,所以固定头4-7位为0001。
固定头的CONNECT消息类型0-3位为0000。
剩余长度是怎么样的?大家可以看看这篇文章就懂了。链接如下:
(62条消息) MQTT 剩余长度_但是那是但是的博客-CSDN博客
可变报头内容分析
CONNECT报文的可变报头按下列次序包含四个字段:协议名(Protocol Name),协议级别(Protocol Level),连接标志(Connect Flags)和保持连接(Keep Alive)。
协议名(Protocol Name):
byte3-byte8,协议名前两个字节表示长度,后面是名称。
协议级别(Protocol Level):
3.1.1版协议规定,协议级别字段的值是4(0x04)。如果发现不支持的协议级别,服务端必须给发送一个返回码为0x01(不支持的协议级别)的CONNACK报文响应CONNECT报文,然后断开客户端的连接。
连接标志(Connect Flags):
由6个标志组成,1-7位分别为清理会话(Clean Session)、遗嘱标志(Will Flag)、(占两位)遗嘱(QoS Will QoS)、遗嘱保留(Will Retain)、密码标志 (Password Flag)用户名标志(User Name Flag),0位为保留位。
保留位:
服务端必须验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接。
清理会话(Clean Session):
设置为0,服务端必须基于当前会话(使用客户端标识符识别)的状态恢复与客户端的通信。如果没有与这个客户端标识符关联的会话,服务端必须创建一个新的会话。
设置为1,客户端和服务端必须丢弃之前的任何会话并开始一个新的会话。
遗嘱标志(Will Flag):
设置为0,网络连接断开时,不能发送遗嘱消息 。
设置为1,网络连接准备关闭时,服务端就会发布遗嘱消息。
遗嘱(QoS Will QoS):
指定发布遗嘱消息时使用的服务质量等级。
如果遗嘱标志被设置为0,遗嘱QoS也必须设置为0(0x00)。
如果遗嘱标志被设置为1,遗嘱QoS的值可以等于0(0x00),1(0x01),2(0x02)。
遗嘱保留(Will Retain):
如果发布时需要保留,需要指定这一位的值。
设置为0,遗嘱保留(Will Retain)标志也必须设置为0 。
设置为1:
-
设置为0,服务端必须将遗嘱消息当作非保留消息发布。
-
设置为1,服务端必须将遗嘱消息当作保留消息发布。
密码标志( Password Flag):
设置为1,有效载荷中必须包含密码字段 。
设置为0,有效载荷中不能包含密码字段。如果用户名标志被设置为0,密码标志也必须设置为0。
用户名标志(User Name Flag):
设置为0,有效载荷中不能包含用户名字段 。
设置为1,有效载荷中必须包含用户名字段。
小结:
1、连接标志决定了有效载荷内容。
2、连接标志在图上填X的原因是,在不同场景情况下,连接标志是不一样的。比如,是否连接时需要密码验证。
保持连接(Keep Alive):
保持连接是服务器和客户无操作的时间间隔。以秒为单位,最大值是18小时12分15秒。
有效载荷内容分析
有效载荷(payload):
可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码 。
客户端标识符(Client Identifier):
服务器识别客户端的唯一标识符(1到23个字节)。类似我们的身份证号码,是唯一的。UTF-8编码字符串格式。
遗嘱主题 (Will Topic):
遗嘱主题:客户端与服务器网络连接成功后,服务器给客户端规定一个主题。UTF-8编码字符串格式。
遗嘱消息(Will Message):
定义将被发布到遗嘱主题的应用消息。客户端与服务器断开网络连接前,服务器给客户端发布消息。UTF-8编码字符串格式。
用户名(User Name):
用于身份验证和授权。UTF-8编码字符串格式。
密码 (Password):
顾名思义。UTF-8编码字符串格式。
UTF-8编码字符串格式结构:
二进制位 | 7-0 |
---|---|
byte 1 | 字符串长度的最高有效字节(MSB) |
byte 2 | 字符串长度的最低有效字节(LSB) |
byte 3 …. | 如果长度大于0,这里是UTF-8编码的字符数据。 |
UTF-8 是一个高效的Unicode字符编码格式,大家可以到网上科普科普。
由两个UTF-8存储长度大小的信息作为前缀,后面跟着内容,实现UTF-8编码字符串格式结构。
上面协议名也是这种格式。
总结
本文简单介绍了MQTT协议CONNECT控制报文。博主水平和能力有限,文中难免存在错误和纰漏,请大佬不吝赐教。