MQ Telemetry Transport(MQTT)是一種輕量級、基于代理的發布/訂閱式的消息協議。發布/訂閱消息機制可以提供一對多的關系,使用TCP/IP提供基本網絡服務,包含有三種質量的服務:
1)至多一次,可能會出現丟包的現象。可以使用在對實時性要求不高的情況。
2)至少一次,保證包會到達目的地,但是可能出現重包。
3)正好一次,保證包會到達目的地,且不會 出現重包的現象。
一。重要的術語
Message Type
Enumeration解釋
Reserved 0 保留
Connect 1 客戶端到服務端的連接請求
ConnACK 2 服務端對連接請求的響應
Publish 3 發布消息
puback 4 對發布消息的回應
pubRec5
收到發布消息(保證傳輸part1)
pubRel 6 釋放發布消息(保證傳輸part2)
pubComp 7 完成發布消息(保證傳輸part3)
subscribe 8 客戶端訂閱請求
subBack 9 訂閱請求的回應
unsubscribe 10 停止訂閱請求
unsubBack 11 停止訂閱請求響應
pingReq 12 Ping請求(保持連接)
pingResp 13 Ping響應
disconnect 14 客戶端正在斷開
reserved 15 保留
MQTT中有這14種消息類型。
Keep Alive timer
MQTT協議實際上是一個客戶端和服務器端長連接的過程。Keep Alive timer以秒為單位,定義的是從客戶端相鄰兩次接收客戶端消息的最大間隔時間,也可以說是一次長連接的保持時間。因此,客戶端每隔一段時間就需要向服務器發送數據來保持連接(也就相當于心跳包的功能),服務器接收到連接信息后,會反饋一個響應ACK。當服務器端在Keep Alive timer的一倍半的時間內都沒有收到來自客戶端的任何消息,就會默認為客戶端發送了斷開連接的消息而斷開這個長連接。
Topic name
topic name 用來標識已發布消息的信息的渠道。訂閱者用它來確定接收到所關心的信息。它是一個分層的結構,用斜線“/”作為分隔符。有兩種通配符可以在主題發布、訂閱時使用:“#”和“+”。前者可以通配多層結構,而后者只能通配一層結構。例如一個topic : “a/b/c”,則“a/+/c”和“a/#”都可以和它相等。
Quality of Service (qos)
0:發送一次信息而不加確認。(至多一次)
1:至少一次。
2:正好一次
Retained messages
所有的信息都可以通過配置來保存下來。并且新訂閱某個主題的用戶可以收到該主題最后一條
保存的信息。這在某個主題不經常更新的情況下是非常有用的。
clean session/durable connections
在連接的過程中, 一個客戶端設置“cleansession”標記位。如果該位被設置為false,則該連接則被認為是持久連接,其具體表現為:當該客戶斷開后,任何訂閱的主題和QoS被設置為1或2的信息都會保存,直到該客戶端再次連接上server端。若“cleansession”被設置為true,所有的訂閱主題都會被移除。
Will
當一個客戶端斷開連接的時候,它希望客戶端可以發送它指定的消息。該消息和普通消息的結構相同。通過設置該位并填入和信息相關的內容即可。
Payload
以下三種命令包含有payload:
1)connect: payload是一個或多個UTF-8格式編碼的字符串,用來為客戶端指定唯一個標識符、一個主題和消息。用戶名稱和密碼。當然根據頭部選項的不同,這些東西不一定都出來。
2)subscribe:也是UTF-8格式編碼,包含一列Topic的名字和QoS等級。
3)subACK:列出一列QoS等級。
Message identifiers
是一個16位的無符號整數,在同一個方向上的傳輸必須保持其唯一性,一般都是下條消息的ID是上條的ID號加1(類似于TCP連接中的SYN)。當然,你也可以不這么做。它會出現在publish、pubBack、pubRec、pubRel、pubComp、subscribe、subAck、unsubscribe、unsuback類消息的頭部。
二.重要命令的簡介
Connect :當一個TCP/IP套接字在服務器端和客戶端連接建立時需要使用的命令。
publish : 是由客戶端向服務端發送,告訴服務器端自己感興趣的Topic。每一個publishMessage 都會與一個Topic的名字聯系在一起。
pubRec: 是publish命令的響應,只不過使用了2級QoS協議。它是2級QoS協議的第二條消息
pubRel: 是2級QoS協議的第三條消息
publComp: 是2級QoS協議的第四條消息
subscribe: 允許一個客戶端注冊自已感興趣的Topic 名字,發布到這些Topic的消息會以publish Message的形式由服務器端發送給客戶端。
unsubscribe: 從客戶端到服務器端,退訂一個Topic。
Ping: 有客戶端向服務器端發送的“are you alive”的消息。
disconnect:斷開這個TCP/IP協議