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

剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。

 

可变报头(Variable header)

某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。这个在后续的MQTT各个控制报文中进行手撕

 

有效载荷(Payload)

某些MQTT控制报文在报文的最后部分包含一个有效载荷,对于PUBLISH来说有效载荷就是应用消息。

包含有效载荷的控制报文Control Packets that contain a Payload

控制报文 有效载荷
CONNECT   需要  
CONNACK   不需要  
PUBLISH   可选  
PUBACK   不需要  
PUBREC   不需要  
PUBREL   不需要  
PUBCOMP   不需要  
SUBSCRIBE   需要  
SUBACK   需要  
UNSUBSCRIBE   需要  
UNSUBACK   不需要  
PINGREQ   不需要  
PINGRESP   不需要  
DISCONNECT   不需要  

 

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

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

 

MQTT控制报文 CONNECT – 连接服务端

客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文 。

在一个网络连接上,客户端只能发送一次CONNECT报文。服务端必须将客户端发送的第二个CONNECT报文当作协议违规处理并断开客户端的连接。

有效载荷包含一个或多个编码的字段。包括客户端的唯一标识符,Will主题,Will消息,用户名和密码。除了客户端标识之外,其它的字段都是可选的,基于标志位来决定可变报头中是否需要包含这些字段。

可变报头

CONNECT报文的可变报头按下列次序包含四个字段:协议名(Protocol Name),协议级别(Protocol Level),连接标志(Connect Flags)和保持连接(Keep Alive)。

协议名(Protocol Name)

协议名是表示协议名 MQTT 的UTF-8编码的字符串。MQTT规范的后续版本不会改变这个字符串的偏移和长度。

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

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