MQTT 控制报文 - CONNECT连接服务器报文,CONNACK,DISCONNECT - 第3章

 

目录

3.1 CONNECT - 连接服务器

3.1.1 CONNECT 固定报头

3.1.2 CONNECT 可变报头

3.1.2.1 协议名

3.1.2.2 协议级别

3.1.2.3 连接标志

3.1.2.4 保持连接时间

3.1.3 有效载荷

3.2 CONNACK - 连接响应

3.2.1 固定报头

3.2.2 可变报头

3.3 DISCONNECT - 断开连接

3.3.1 固定报头

实际案例、相关链接


3.1 CONNECT - 连接服务器

  • 客户端到服务端的TCP/UDP网络连接建立后,客户端发送给服务端的第一条报文必须是 CONNECT 报文
  • 在一个网络连接上,客户端只能发送一次 CONNECT 报文
  • 服务端必须将客户端发送的第二个 CONNECT 报文当作协议违规。

 

CONNECT报文 - 帧格式:

 

CONNECT报文 的帧格式
 功能字节空间
固定报头MQTT报文类型+保留位1 Byte
剩余长度1 ~ 4 Byte
可变报头协议名6 Byte
协议级别1 Byte
连接标志1 Byte
保持连接时间2 Byte
有效载荷... ...... ...

 

 

3.1.1 CONNECT 固定报头

 

CONNECT 固定报头 的数据格式
Byte - Bit76543210
Byte 1MQTT 报文的类型(1 - CONNECT)Reserved 保留位
1,0x1 - CONNECT0x0
Byte 2~5剩余长度
  • CONNECT 的第1个字节为 0x10,剩余长度字段需要根据可变报头和有效载荷的长度来确定。
  • 剩余长度字段的计算过程见 2.2.3。

 

 

3.1.2 CONNECT 可变报头

CONNECT的可变报头包含四个字段:

  • 协议名(Protocol Name)
  • 协议级别(Protocol Level)
  • 连接标志(Connect Flags)
  • 保持连接时间(Keep Alive)

 

CONNECT 可变报头 的数据格式
byte 1 ~ 6协议名
byte 7协议级别
byte 8连接标志
byte 9 ~ 10连接保持时间

 

 

3.1.2.1 协议名

可变报头中,协议名字段的6个字节是固定的:

 

CONNECT 固定报头 - 协议名 的数据格式
 功能说明
byte 1协议名长度长度 MSB0x00
byte 2长度 LSB0x04
byte 3协议名' M '0x4D
byte 4' Q '0x51
byte 5' T '0x54
byte 6' T '0x54

 

 

3.1.2.2 协议级别

 

CONNECT 固定报头 - 协议级别 的数据格式
byte 70x04(MQTT3.1.1)

客户端用8位的无符号值表示协议的修订版本。对于3.1.1版MQTT协议,协议级别字段的值是4(0x04)。如果发现不支持的协议级别,服务端必须给发送一个返回码为0x01(不支持的协议级别)的CONNACK报文响应CONNECT报文,然后断开客户端的连接。

 

 

3.1.2.3 连接标志

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

 

CONNECT 固定报头 - 连接标志位 的数据格式
 Bit 7Bit 6Bit 5Bit 4Bit3Bit 2Bit 1Bit 0
byte 8User Name FlagPassword FlagWill RetainWill QosWill FlagClean SessionReserved
用户名标志位密码标志位遗嘱保留遗嘱 Qos遗嘱标志清理会话-

 

Bit 1:清理会话标志位。这个标志位用于控制会话状态的生存时间。如果清理会话(CleanSession)标志被设置为0,服务端必须基于当前会话(使用客户端标识符识别)的状态恢复与客户端的通信;如果清理会话(CleanSession)标志被设置为1,客户端和服务端必须丢弃之前的任何会话并开始一个新的会话。会话仅持续和网络连接同样长的时间。与这个会话关联的状态数据不能被任何之后的会话重用。

Bit 2:遗嘱标志位。遗嘱标志(Will Flag)被设置为1,表示如果连接请求被接受了,遗嘱(Will Message)消息必须被存储在服务端并且与这个网络连接关联。之后网络连接关闭时,服务端必须发布这个遗嘱消息,除非服务端收到DISCONNECT报文时删除了这个遗嘱消息。如果遗嘱标志被设置为1,连接标志中的Will QoS和Will Retain字段会被服务端用到,同时有效载荷中必须包含Will Topic和Will Message字段。

Bit 3~4:遗嘱 Qos。这两位用于指定发布遗嘱消息时使用的服务质量等级。如果遗嘱标志被设置为0,遗嘱QoS也必须设置为0(0x00)。如果遗嘱标志被设置为1,遗嘱QoS的值可以等于0(0x00),1(0x01),2(0x02)。它的值不能等于3。

Bit 5:遗嘱保留标志位。如果遗嘱消息被发布时需要保留,需要指定这一位的值。如果遗嘱标志被设置为0,遗嘱保留(Will Retain)标志也必须设置为0。如果遗嘱标志被设置为1:

  • 如果遗嘱保留被设置为0,服务端必须将遗嘱消息当作非保留消息发布。
  • 如果遗嘱保留被设置为1,服务端必须将遗嘱消息当作保留消息发布。

Bit 6:密码标志位。如果密码(Password)标志被设置为0,有效载荷中不能包含密码字段。如果密码(Password)标志被设置为1,有效载荷中必须包含密码字段。如果用户名标志被设置为0,密码标志也必须设置为0。

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

连接标志位最常见的组合是:1100 0010,即为 0xC2

 

 

3.1.2.4 保持连接时间

 

CONNECT 固定报头 - 保持连接时间 的数据格式
 Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
byte 9保持连接 Keep Alive MSB
byte 10保持连接 Keep Alive LSB

 

 

保持连接(Keep Alive)是一个以秒为单位的时间长度,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ报文。

不管保持连接的值是多少,客户端任何时候都可以发送PINGREQ报文,并且使用PINGRESP报文判断网络和服务端的活动状态。

如果保持连接的值非零,并且服务端在一点五倍的保持连接时间内没有收到客户端的控制报文,它必须断开客户端的网络连接,认为网络连接已断开。

客户端发送了PINGREQ报文之后,如果在合理的时间内仍没有收到PINGRESP报文,它应该关闭到服务端的网络连接。

保持连接的实际值是由应用指定的,一般是几分钟。允许的最大值是18小时12分15秒

 

 

3.1.3 有效载荷

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

 

 

 

 

 

 

3.2 CONNACK - 连接响应

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

如果客户端在合理的时间内没有收到服务端的CONNACK报文,客户端应该关闭网络连接。

 

CONNACK报文 - 帧格式
  功能
byte 1固定报头MQTT报文类型+保留位
byte 2剩余长度
byte 3可变报头连接确认标志
byte 4连接返回码

 

CONNACK 没有 有效载荷 字段

 

 

3.2.1 固定报头

 

CONNACK 固定报头 的数据格式
 Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
byte 1MQTT报文类型(2 - CONNACK)Reserved 保留位
2,0x2 - CONNACK0000
byte 2剩余长度值
0x02

 

剩余长度值,表示可变报头的长度。对于CONNACK报文这个值为2

 

 

3.2.2 可变报头

 

CONNACK 可变报头 的数据格式
 Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
byte 3Reserved 保留位当前会话标志位 SP
0000000X
byte 4连接返回码
        

 

当前会话标志位 SP(Session Present):如果服务端收到清理会话(CleanSession)标志为1的连接,除了将CONNACK报文中的返回码设置为0之外,还必须将CONNACK报文中的当前会话设置(Session Present)标志为0。

如果服务端收到一个CleanSession为0的连接,当前会话标志的值取决于服务端是否已经保存了ClientId对应客户端的会话状态。如果服务端已经保存了会话状态,它必须将CONNACK报文中的当前会话标志设置为1。如果服务端没有已保存的会话状态,它必须将CONNACK报文中的当前会话设置为0。还需要将CONNACK报文中的返回码设置为0。

如果服务端发送了一个包含非零返回码的CONNACK报文,它必须将当前会话标志设置为0。

 

连接返回码:如果服务端收到一个合法的CONNECT报文,但出于某些原因无法处理它,服务端应该尝试发送一个包含非零返回码的CONNACK报文。

如果服务端发送了一个包含非零返回码的CONNACK报文,那么它必须关闭网络连接

 

CONNACK 可变报头 - 连接返回码 的值
返回码响应描述
00x00连接已接受连接已被服务端接受
10x01连接已拒绝,不支持的协议版本服务端不支持客户端请求的MQTT协议级别
20x02连接已拒绝,不合格的客户端标识符客户端标识符是正确的UTF-8编码,但服务端不允许使用
30x03连接已拒绝,服务端不可用网络连接已建立,但MQTT服务不可用
40x04连接已拒绝,无效的用户名或密码用户名或密码的数据格式无效
50x05连接已拒绝,未授权客户端未被授权连接到此服务器
6 ~ 255 Reserved 保留

 

如果认为上表中的所有连接返回码都不太合适,那么服务端必须关闭网络连接,不需要发送CONNACK报文

CONNACK 没有 有效载荷 字段

 

 

 

 

 

 

3.3 DISCONNECT - 断开连接

DISCONNECT报文是客户端发给服务端的最后一个控制报文。表示客户端正常断开连接。

 

 

3.3.1 固定报头

 

DISCONNECT 固定报头 的数据格式
 Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
byte 1MQTT报文类型(14 - DISCONNECT)Reserved 保留位
14,0xE - DISCONNECT0000
byte 2剩余长度
0x00

 

CONNACK 没有 可变报头 字段

CONNACK 没有 有效载荷 字段

客户端发送DISCONNECT报文之后,必须关闭网络连接,并且不能通过这个网络连接再发送任何控制报文

服务端在收到DISCONNECT报文时,必须丢弃任何与当前连接关联的未发布的遗嘱消息,并且关闭网络连接(如果客户端 还没关闭连接的话)

 

实际案例、相关链接

MQTT 协议详解:MQTT 协议详解

MQTT 报文帧格式详解:MQTT 报文帧格式详解

使用MQTT.fx,MQTT接入阿里云物联网平台:MQTT.fx 接入阿里云

使用电脑网络调试助手,MQTT接入阿里云物联网平台:网络调试助手接入阿里云

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值