MQTT客户端连接MQTT服务器的过程:
- TCP网络连接成功
- 发送CONNECT协议包
- 服务器回复CONNECT确认包
After a Network Connection is established by a Client to a Server, the first Packet sent from the Client to the Server MUST be a CONNECT Packet.
A Client can only send the CONNECT Packet once over a Network Connection. The Server MUST process a second CONNECT Packet sent from a Client as a protocol violation and disconnect the Client.
CONNECT
连接参数:
- 客户端标识 ClientID
(1)一般使用GUID
(2)恢复会话依赖客户端标识
(3)CLean Session 为false时,则不能使用GUID,必须是固定值
CleanSession
(1)一般设置成true,清除上次会话。重新连接时,需要重新订阅。
- 协议版本
(1)3.1.0
(2)3.1.1
(3)5.0
如果协议等级不被服务端支持,服务端必须响应一个包含代码0x01(不接受的协议等级)CONNACK包,然后断开和客户端的连接。
-
账户名密码
(1)客户端连接服务器时,需要权限认证。
(2)服务器可以设置无需权限认证,此时客户端的CONNECT包不包含账号字段和密码字段。 -
心跳包 keep alive
(1)Keep Alive是以秒为单位的时间间隔。
(2)客户端有责任确保两个控制包发送的间隔不能超过Keep Alive的值。如果没有其他控制包可发,客户端必须发送PINGREQ包。
(3)如果Keep Alive的值非0,而且服务端在一个半Keep Alive的周期内没有收到客户端的控制包,服务端必须作为网络故障断开网络连接
(4)如果客户端在发送了PINGREQ后,在一个合理的时间都没有收到PINGRESP包,客户端应该关闭和服务端的网络连接。
(5)Keep Alive的值为0,就关闭了维持的机制。这意味着,在这种情况下,服务端不会断开静默的客户端。
(6)Keep Alive的实际值是由应用程序指定的;典型的是几分钟。最大值是18小时12分钟15秒。 -
Will Topic
-
Will Message
Will QoS
发布遗言时的等级。
Will Retain
遗言被发送后服务器是否继续保留。
遗言在连接时被存储到服务器,所以客户端异常断开后,该客户端的遗言仍旧可以被下发到其他客户端。
如果客户端主动调用Disconnect函数并发送了Disconnect协议包,那么遗言不会被发送,且被服务器清除。
遗言等级
清除会话
CONNACK:
The first packet sent from the Server to the Client MUST be a CONNACK Packet.
连接返回码Connect Return code values
如果服务端收到了一个格式良好的CONNECT包,但是服务端由于某种原因不能处理,那么服务端应该尝试发送一个带有非零返回码的CONNACK包。如果服务端发送了一个包含非零返回码的CONNACK包,必须关闭网络连接
Table 3.1 - COnnect Return code values
|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
如果上表中的返回码都不适用,那么服务端必须直接关闭网络连接,不发送CONNACK包。
0x01:非法的MQTT协议版本号
0x02:Clinet ID 非法