Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上 (5)

如果协议名不正确服务端可以断开客户端的连接,也可以按照某些其它规范继续处理CONNECT报文。对于后一种情况,按照本规范,服务端不能继续处理CONNECT报文

协议级别(Protocol Level)

客户端用8位的无符号值表示协议的修订版本。对于3.1.1版协议,协议级别字段的值是4(0x04)。

如果发现不支持的协议级别,服务端必须给发送一个返回码为0x01(不支持的协议级别)的CONNACK报文响应CONNECT报文,然后断开客户端的连接 。

连接标志(Connect Flags)

连接标志字节包含一些用于指定MQTT连接行为的参数。它还指出有效载荷中的字段是否存在

+-------+---------+----------+--------+------+-------+-------+--------+--------+
|       |         |         |       |     |       |       |       |       |
| Bit |   7   |   6     |   5   | 4   | 3   |   2   |   1   |   0   |
+--------------------------------------------+---------------------------------+
|       |User Name|Password | Will   |             | Will | Clean |       |
|       | Flag   | Flag     | Retain | Will Qos   | Flag |Session |Reser^ed|
+--------------------------------------------+---------------------------------+
|       |         |         |       |     |       |       |       |       |
| byte8 |   X   |   X     |   X   |   X |   X   |   X   |   X   |   0   |
+-------+---------+----------+--------+------+-------+-------+--------+--------+

服务端必须验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接 。

清理会话 Clean Session

位置:连接标志字节的第1位

这个二进制位指定了会话状态的处理方式。

客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输。这个标志位用于控制会话状态的生存时间。

遗嘱标志 Will Flag

位置:连接标志的第2位。

遗嘱标志(Will Flag)被设置为1,表示如果连接请求被接受了,遗嘱(Will Message)消息必须被存储在服务端并且与这个网络连接关联。之后网络连接关闭时,服务端必须发布这个遗嘱消息,除非服务端收到DISCONNECT报文时删除了这个遗嘱消息

遗嘱QoS Will QoS

位置:连接标志的第4和第3位。

这两位用于指定发布遗嘱消息时使用的服务质量等级。

遗嘱保留 Will Retain

位置:连接标志的第5位。

如果遗嘱消息被发布时需要保留,需要指定这一位的值。

用户名标志 User Name Flag

位置:连接标志的第7位。

如果用户名(User Name)标志被设置为0,有效载荷中不能包含用户名字段 。

如果用户名(User Name)标志被设置为1,有效载荷中必须包含用户名字段 。

密码标志 Password Flag

位置:连接标志的第6位。

如果密码(Password)标志被设置为0,有效载荷中不能包含密码字段 。

如果密码(Password)标志被设置为1,有效载荷中必须包含密码字段 。

如果用户名标志被设置为0,密码标志也必须设置为0 。

保持连接 Keep Alive

保持连接(Keep Alive)是一个以秒为单位的时间间隔,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。

客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ报文 。

有效载荷

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsffgz.html