3.2 CONNACK - 确认连接请求
CONNACK数据包是服务器响应从客户端收到的CONNECT数据包发送的数据包。从服务器发送到客户端的第一个数据包必须是CONNACK数据包 [MQTT-3.2.0-1]。
如果客户端在合理的时间内没有从服务器收到CONNACK数据包,则客户端应该关闭网络连接。“合理”的时间量取决于应用程序的类型和通信基础设施。
3.2.1 Fixed header 固定标题
固定报头格式如图3.8所示 - CONNACK Packet固定报头。
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
字节1 |
MQTT控制包类型(2) |
保留的 |
||||||
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
字节2 |
剩余长度(2) |
|||||||
|
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
剩余长度 字段
这是变量头的长度。对于CONNACK Packet,其值为2。
3.2.2 Variable header 可变报文头
可变报头格式如图3.9所示 - CONNACK Packet变量报头。
|
描述 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
连接确认标志 Connect Acknowledge Flags |
保留的 |
SP 1 |
|||||||
字节1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
X |
连接返回代码 |
|||||||||
字节2 |
Connect Return code | X |
X |
X |
X |
X |
X |
X |
X |
3.2.2.1 Connect Acknowledge Flags 连接确认标志
字节1是“Connect Acknowledge Flags”。位7-1保留,必须设置为0. 位0(SP 1)是会话存在标志。
位置:Connect Acknowledge Flags的第0位。
如果服务器接受将CleanSession设置为1的连接,则除了在CONNACK数据包 [MQTT-3.2.2-1]中设置零返回码之外,服务器必须在CONNACK数据包中将Session Present设置为0。
如果服务器接受将CleanSession设置为0的连接,则Session Present中设置的值取决于Server是否已为所提供的客户端ID存储了Session状态。如果服务器已存储会话状态,则它必须在CONNACK数据包 [MQTT-3.2.2-2] 中将Session Present设置为1 。 如果服务器没有存储的会话状态,它必须在CONNACK数据包中将Session Present设置为0。这是在CONNACK数据包中设置零返回码的补充[MQTT-3.2.2-3]。
Session Present标志使客户端能够确定客户端和服务器是否具有关于是否已存储会话状态的一致视图。
完成会话的初始设置后,具有存储会话状态的客户端将期望服务器保持其存储的会话状态。如果客户端从服务器收到的会话存在的值不符合预期,则客户端可以选择是继续会话还是断开连接。客户端可以通过断开连接,将Clean Session设置为1然后再次断开连接来丢弃客户端和服务器上的会话状态。
如果服务器发送包含非零返回码的CONNACK数据包,则必须将Session Present设置为0 [MQTT-3.2.2-4] 。
3.2.2.3 Connect Return code 连接返回码
变量头中的字节2。
表3.1 - 连接返回代码值中列出了单字节无符号连接返回代码字段的值。如果服务器收到格式良好的CONNECT数据包,但服务器由于某种原因无法处理它,则服务器应该尝试从该表发送包含相应的非零连接返回码的CONNACK数据包。如果服务器发送包含非零返回码的CONNACK数据包,则它必须关闭网络连接[MQTT-3.2.2-5]。
值 |
返回代码响应 |
描述 |
0 |
0x00连接已接受 |
接受连接 |
1 |
0x01连接拒绝,不可接受的协议版本 |
服务器不支持客户端请求的MQTT协议级别 |
2 |
0x02连接被拒绝,标识符被拒绝 |
客户端标识符是正确的UTF-8,但服务器不允许 |
3 |
0x03拒绝连接,服务器不可用 |
已建立网络连接但MQTT服务不可用 |
4 |
0x04连接被拒绝,用户名或密码错误 |
用户名或密码中的数据格式不正确 |
5 |
0x05连接被拒绝,未经授权 |
客户端无权连接 |
6-255 |
|
保留供将来使用 |
如果表3.1 - 连接返回代码值中 列出的返回代码均不适用,则服务器必须关闭网络连接而不发送CONNACK [MQTT-3.2.2-6] 。
3.2.3 Payload 有效载荷
CONNACK数据包没有payload。