物联网之MQTT3.1.1和MQTT5协议 (15) DISCONNECT报文
文章目录前言DISCONNECT – 断开连接/断开通知固定报头DISCONNECT可变报头(MQTT 5)断开原因码断开原因码DISCONNECT属性(MQTT5)属性长度会话过期间隔原因字符串用户属性服务端参考DISCONNECT报文可变报头非规范示例有效载荷DISCONNECT行为前言该报文为控制报文,MQTT5将该报文的传递方向由单向变成双向。DISCONNECT – 断开连接/断开...
文章目录
前言
该报文为控制报文,MQTT5将该报文的传递方向由单向变成双向。
DISCONNECT – 断开连接/断开通知
MQTT3.1.1为断开连接,MQTT5为断开通知
【MQTT 3.1.1】
DISCONNECT报文是客户端发给服务端的最后一个控制报文。表示客户端正常断开连接。
【MQTT 5】
DISCONNECT数据报文是从客户端或服务器发送的最终MQTT控制数据报文。
它指示了网络连接被关闭的原因。 客户端或服务器可以在关闭网络连接之前发送一个DISCONNECT数据报文。 如果网络连接被关闭,而客户端没有首先发送原因码为0x00(正常断开连接)的DISCONNECT数据报文,并且该连接有一个Will消息,则将发布Will消息。
服务器在发送原因代码小于0x80的CONNACK之前,不得发送DISCONNECT 报文。
固定报头
服务端必须验证所有的保留位都被设置为0,如果它们不为0,在MQTT3.1.1中则必须断开连接,在MQTT5中,需要发送包含原因码为0x81(无效报文)的DISCONNECT报文。
剩余长度字段
等于可变报头的长度,编码为变长字节整数
DISCONNECT可变报头(MQTT 5)
MQTT3.1.1 DISCONNECT报文没有可变报头
DISCONNECT报文的可变报头按顺序包含以下字段:断开原因码,属性(Properties)。
断开原因码
可变报头的第1个字节是断开原因码。如果剩余长度小于1,则表示使用原因码0x00(正常断开)。
单字节无符号断开原因码字段如下所示。
断开原因码
客户端或服务端发送DISCONNECT报文时必须使用一种DISCONNECT原因码。如果原因码为0x00(正常断开)且没有属性,原因码和属性长度可以被省略。这种情况下DISCONNECT报文剩余长度为0。
DISCONNECT报文用于指示断开的原因,例如没有确认报文(比如QoS等级0的发布消息)或当客户端或服务端不能继续处理连接。
客户端可以使用这些信息来决定是否重新连接,以及在重新尝试之前应该等待多长时间。
DISCONNECT属性(MQTT5)
属性长度
DISCONNECT报文可变报头中的属性(Properties)的长度被编码为变长字节整数。如果剩余长度小于2,属性长度使用0。
会话过期间隔
17 (0x11)Byte,会话过期间隔(Session Expiry Interval)标识符。
跟随其后的是用四字节整数表示的以秒为单位的会话过期间隔(Session Expiry Interval)。包含多个会话2224 过期间隔将造成协议错误(Protocol Error)。
如果没有设置会话过期间隔,则使用CONNECT报文中的会话过期间隔。
会话过期间隔不能由服务端的DISCONNECT报文发送。
如果CONNECT报文中的会话过期间隔为0,则客户端在DISCONNECT报文中设置非0会话过期间隔将造成协议错误(Protocol Error)。如果服务端收到这种非0会话过期间隔,则不会将其视为有效的DISCONNECT报文。服务端使用包含原因码为0x82(协议错误)的DISCONNECT报文。
原因字符串
31 (0x1F)Byte,原因字符串(Reason String)标识符。
跟随其后的是UTF-8编码字符串表示断开原因。此原因字符串是为诊断而设计的可读字符串,不应该被接收端所解析。
如果此属性使得DISCONNECT报文的长度超出了接收端指定的最大报文长度,则发送端不能发送此属性 。包含多个原因字符串将造成协议错误(Protocol Error)。
用户属性
38 (0x26)Byte,用户属性(User Property)标识符。
跟随其后的是UTF-8字符串键值对。
此属性可用于向客户端提供包括诊断信息在内的附加信息。如果加上用户属性之后的DISCONNECT报文长度超出了接收端指定的最大报文长度,则发送端不能发送此属性 。用户属性允许出现多次,以表示多个名字/值对,且相同的名字可以多次出现。
服务端参考
28 (0x1C)Byte,服务端参考列表(Server Reference)标识符。
跟随其后的是一个UTF-8编码字符串,客户端可以使用它来识别其他要使用的服务端。包含多个服务端参考将造成协议错误(Protocol Error)。
服务端发送包含一个服务端参考和原因码0x9C(使用其他服务端)或0x9D(服务端已移动)的DISCONNECT报文。
DISCONNECT报文可变报头非规范示例
有效载荷
DISCONNECT报文没有有效载荷。
DISCONNECT行为
客户端发送DISCONNECT报文之后:
- 必须关闭网络连接 。
- 不能通过那个网络连接再发送任何控制报文。
服务端在收到DISCONNECT报文时:
MQTT5则为当服务端接收到包含原因码为0x00(成功)的DISCONNECT时,才:
-
必须丢弃任何与当前连接关联的未发布的遗嘱消息,而不发布它。
-
【MQTT3.1.1】如果客户端尚未关闭网络连接,则应关闭网络连接。
-
【MQTT5】接收到DISCONNECT报文时,接收端应该关闭网络连接
更多推荐
所有评论(0)