MQTT控制报文格式 -- CONNACK (Acknowledge connection request)连接请求应答
该报文由服务端收到CONNECT数据包后发出,客户端可以根据在合理的时间内是否收到该报文而决定是否断开网络连接。
该数据包不包含Payload部分,仅有FixedHeader 和 Variable Header,现对其详述如下:
1. 固定包头 FixedHeader
固定包头共2个字节
byte1 = 0x20
byte2 = 0x02 剩余长度共有2个字节
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
byte 1 |
MQTT Control Packet Type (2) |
Reserved |
||||||
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
byte 2 |
Remaining Length (2) |
|||||||
|
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
2. 可变包头Variable header
可变包头包含两个部分,应答标志 ConnectAcknowledgement Flags和返回码 Connect Return code,各占一个字节
|
Description |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Connect Acknowledge Flags |
Reserved |
SP1 |
|||||||
byte 1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
X |
Connect Return code |
|||||||||
byte 2 |
|
X |
X |
X |
X |
X |
X |
X |
X |
2.1 连接应答标志 Connect Acknowledge Flags
该字节最低位(0bit)是会话存在标志 Session Present Flag
如果服务端正常接受CleanSession=1 的CONNECT报文,则必须将此标志设置为0
如果服务单正常接受CleanSession=0 的CONNECT报文,则该标志取决于服务端是否已经存储所提供ClientId的会话状态。如果已存储,则SessionPresentFlag=1,如果没有存储则 SessionPresentFlag=0 。这是为了确保客户端和服务端的会话状态一致。可以认为是对返回码的补充。
一旦会话的初始设置完成,具有存储会话状态的客户端将期望服务器维持其存储的会话状态。 如果客户端从服务器收到的 Session Present 值与预期不符,客户端可以选择是继续会话还是断开连接。 客户端可以通过断开连接、将 Clean Session 设置为 1 的连接然后再次断开连接来丢弃客户端和服务器上的会话状态。
如果服务器发送包含非零返回码的 CONNACK 数据包,则它必须将会话存在设置为 0
2.2 连接返回码 Connect Return code
客户端收到0x00 的返回码才表示连接正常确认
枚举值如下:
Value |
Return Code Response |
Description |
0 |
0x00 Connection Accepted |
Connection accepted |
1 |
0x01 Connection Refused, unacceptable protocol version |
The Server does not support the level of the MQTT protocol requested by the Client |
2 |
0x02 Connection Refused, identifier rejected |
The Client identifier is correct UTF-8 but not allowed by the Server |
3 |
0x03 Connection Refused, Server unavailable |
The Network Connection has been made but the MQTT service is unavailable |
4 |
0x04 Connection Refused, bad user name or password |
The data in the user name or password is malformed |
5 |
0x05 Connection Refused, not authorized |
The Client is not authorized to connect |
6-255 |
|
Reserved for future use |