基於MQTT協議的 org.eclipse.paho.client.mqttv3 原始碼學習(一)
一、MQTT協議簡敘
MQTT 有以下特點:
- 使用釋出/訂閱訊息模式,提供一對多的訊息釋出,解除應用程式耦合
- 使用TCP/IP提供網路連線
- 有三種釋出訊息服務質量
- “至多一次 Qos level=0”,訊息釋出完全依賴底層 TCP/IP 網路。會發生訊息丟失或重複。這一級別可用於如下情況,環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次傳送。
- “至少一次Qos level=1”,確保訊息到達,但訊息重複可能會發生。
- “只有一次Qos level=2”,確保訊息到達一次。這一級別可用於如下情況,在計費系統中,訊息重複或丟失會導致不正確的結果。
- 小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協議交換最小化,以降低網路流量。
- 使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。
MQTT 限制:
- MQTT協議傳輸內容格式目前只支援2中,一個為UTF-8和askii,傳輸的內容最大為256M
- 目前用的比較多的基於MQTT協議的訊息伺服器mosquitto socket 最大連線數僅5W左右。
MQTT訊息型別(4-7),使用4位二進位制表示,可代表16種訊息型別:
Mnemonic | Enumeration | Description |
---|---|---|
Reserved | 0 | Reserved |
CONNECT | 1 | Client request to connect to Server |
CONNACK | 2 | Connect Acknowledgment |
PUBLISH | 3 | Publish message |
PUBACK | 4 | Publish Acknowledgment |
PUBREC | 5 | Publish Received (assured delivery part 1) |
PUBREL | 6 | Publish Release (assured delivery part 2) |
PUBCOMP | 7 | Publish Complete (assured delivery part 3) |
SUBSCRIBE | 8 | Client Subscribe request |
SUBACK | 9 | Subscribe Acknowledgment |
UNSUBSCRIBE | 10 | Client Unsubscribe request |
UNSUBACK | 11 | Unsubscribe Acknowledgment |
PINGREQ | 12 | PING Request |
PINGRESP | 13 | PING Response |
DISCONNECT | 14 | Client is Disconnecting |
Reserved | 15 | Reserved |
0->保留 ;1->客戶端請求連線到伺服器;2->連線確認;3->釋出訊息;4->釋出確認;5->釋出收稿(有保證的交付第一部分);
6->出版發行(有保證的交付第二部分);7->釋出完整(有保證的交付第三部分);8->客戶端訂閱請求;9->訂閱確認;
10->客戶端退訂請求;11->退訂確認;12->ping請求;13->ping響應;14->客戶端埠;15->保留;
三、MQTT訊息釋出流程
下圖是訊息的釋出和確認等一些流程,主要是跟訊息釋出者所設定的QoS level有關。
好了,MQTT協議大致介紹了一下,現在進入對原始碼的分析、
四、目錄分析
org.eclipse.paho.client.mqttv3 :主要用於對外提供服務,此包裡提供的整個功能。
org.eclipse.paho.client.mqttv3.internal: 提供了對mqttv3 中的介面的實現。
org.eclipse.paho.client.mqttv3.internal.nls: 國際化相關檔案。學習中可以忽略
org.eclipse.paho.client.mqttv3.internal.security:MQTT支援SSL加密,這個包內實現了基於TLS協議SSLSocket;
org.eclipse.paho.client.mqttv3.internal.wire : MQTT協議中報文資訊,裡面包含有心跳包、訂閱包、釋出包、確認包等
org.eclipse.paho.client.mqttv3.persist:釋出資訊持久化類,MQTT提供兩種保持釋出訊息的方式,一種是將資訊保持到檔案中,
一種是直接保持 到 記憶體中。
org.eclipse.paho.client.mqttv3.util:工具類。
org.eclipse.paho.client.mqttv3.logging:日誌包
由此可以看出學習基於MQTT協議的paho,只需要啃下藍色部分包內的內容,基本上就全部掌握了。