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

CONNECT报文的有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码 。

响应Response

网络连接建立后,如果服务端在合理的时间内没有收到CONNECT报文,服务端应该关闭这个连接。

服务端必须按照3.1节的要求验证CONNECT报文,如果报文不符合规范,服务端不发送CONNACK报文直接关闭网络连接 [MQTT-3.1.4-1]。

服务端可以检查CONNECT报文的内容是不是满足任何进一步的限制,可以执行身份验证和授权检查。如果任何一项检查没通过,按照3.2节的描述,它应该发送一个适当的、返回码非零的CONNACK响应,并且必须关闭这个网络连接。

CONNACK – 确认连接请求

服务端发送CONNACK报文响应从客户端收到的CONNECT报文。服务端发送给客户端的第一个报文必须是CONNACK。

如果客户端在合理的时间内没有收到服务端的CONNACK报文,客户端应该关闭网络连接。合理 的时间取决于应用的类型和通信基础设施。

剩余长度字段

表示可变报头的长度。对于CONNACK报文这个值等于2。

可变报头 连接确认标志 Connect Acknowledge Flags

第1个字节是 连接确认标志,位7-1是保留位且必须设置为0。 第0 (SP)位 是当前会话(Session Present)标志。

当前会话 Session Present

位置:连接确认标志的第0位。

连接返回码 Connect Return code

位置:可变报头的第2个字节。

连接返回码字段使用一个字节的无符号值。如果服务端收到一个合法的CONNECT报文,但出于某些原因无法处理它,服务端应该尝试发送一个包含非零返回码(表格中的某一个)的CONNACK报文。如果服务端发送了一个包含非零返回码的CONNACK报文,那么它必须关闭网络连接 。

表格 3.1 –连接返回码的值 返回码响应 描述
0   0x00连接已接受   连接已被服务端接受  
1   0x01连接已拒绝,不支持的协议版本   服务端不支持客户端请求的MQTT协议级别  
2   0x02连接已拒绝,不合格的客户端标识符   客户端标识符是正确的UTF-8编码,但服务端不允许使用  
3   0x03连接已拒绝,服务端不可用   网络连接已建立,但MQTT服务不可用  
4   0x04连接已拒绝,无效的用户名或密码   用户名或密码的数据格式无效  
5   0x05连接已拒绝,未授权   客户端未被授权连接到此服务器  
6-255       保留  
有效载荷

CONNACK报文没有有效载荷。

 

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

 

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

PUBLISH – 发布消息

PUBLISH控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。

固定报头

DUP =控制报文的重复分发标志

QoS = PUBLISH报文的服务质量等级

RETAIN = PUBLISH报文的保留标志

可变报头

可变报头按顺序包含主题名和报文标识符。

主题名 Topic Name

主题名(Topic Name)用于识别有效载荷数据应该被发布到哪一个信息通道。

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

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