1. MQTT的连接过程
Client建立到Broker的连接过程如下图所示:
Client发送CONNECT数据包给Broker
Broker在收到CONNECT数据包之后,给Client返回一个CONNACK数据包
1.1. CONNECT数据包
连接的建立由Client发起,Client端首先向Broker发送一个CONNECT数据包,CONNECT数据包包含以下内容(这里略过固定头的阐述,需要的话可以翻看MQTT基础概念)
1.1.1. 可变头
在CONNECT数据包可变头中,包含以下信息:协议名称(Protocol Name):值固定为字符 “MQTT”。
协议版本(Protocol Level):对 MQTT 3.1.1 来说,该值为 4。
用户名标识(User Name Flag):消息体中是否有用户名字段,1bit,0 或者 1。
密码标识(Password Flag):消息体中是否有密码字段,1bit,0 或者 1。
遗愿消息Retain标识(Will Retain):标识遗愿消息是否是 Retain 消息,1bit,0 或者 1。
遗愿消息 QOS 标识(Will QOS):标识遗愿消息的 QOS,2bit,0、1 或者 2。
遗愿标识(Will Flag):标识是否使用遗愿消息,1bit,0 或者 1。
会话清除标识(Clean Session):标识Client是否建立一个持久化的会话,1bit,0或者1。当该标识设为0时,代表Client希望建立一个持久会话的连接,Broker将存储该Client订阅的主题和未接受的消息,否则Broker不会存储这些数据,同时在建立连接时清楚这个Client之前存在的持久化会话所保存的数据。
连接保活(Keep Alive):设置一个以秒为单位的时间间隔,Client和Broker之间在这个时间间隔之内需要至少一次消息交互,否则Client和Broker会认为它们之间的连接已经断开。
1.1.2. 消息体
CONNECT数据包的消息体中包含以下数据:客户端标识符(Client Identifier):Client Identifier 是用来标识 Client 身份的字段,在 MQTT 3.1.1 的版本中,这个字段的长度是 1 到 23 个字节,而且只能包含数字和 26 个字母(包括大小写),Broker 通过这个字段来区分不同的 Client。所以在连接的时候,应该保证 Client Identifier 是唯一的,所以我们可以使用UUID,唯一的设备硬件标识,或者在Android设备中使用的话