MQTT重点概念

MQTT客户端连接MQTT服务器的过程:

  1. TCP网络连接成功
  2. 发送CONNECT协议包
  3. 服务器回复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
连接参数:

  1. 客户端标识 ClientID
    (1)一般使用GUID
    (2)恢复会话依赖客户端标识
    (3)CLean Session 为false时,则不能使用GUID,必须是固定值

CleanSession
(1)一般设置成true,清除上次会话。重新连接时,需要重新订阅。

  1. 协议版本
    (1)3.1.0
    (2)3.1.1
    (3)5.0

如果协议等级不被服务端支持,服务端必须响应一个包含代码0x01(不接受的协议等级)CONNACK包,然后断开和客户端的连接。

  1. 账户名密码
    (1)客户端连接服务器时,需要权限认证。
    (2)服务器可以设置无需权限认证,此时客户端的CONNECT包不包含账号字段和密码字段。

  2. 心跳包 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秒。

  3. Will Topic

  4. 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 非法

上一篇:QT编程入门系列文章之九——深入了解槽函数


下一篇:Failed to connect to raw.githubusercontent.com port 443: Connection refused