mqtt 協議版本: 3.1.1
互聯網的基礎網絡協議是 TCP/IP協議.html
MQTT(消息隊列遙測傳輸)是基於 TCP/IP 協議棧而構建的, 已成爲 IoT 通訊的標準.git
MQTT 有多好多好, 多麼牛逼我就不說了. 說的再多不如一個一個試, 試完了作比對, 剩下的那個就是要選擇的.github
實在不想這樣搞, 技術就跟着一線走.安全
MQTT 協議在網絡中定義了兩種實體類型: 一個消息代理和一些客戶端.服務器
代理是一個服務器, 它從客戶端接收全部消息, 而後將這些消息路由到相關的目標客戶端. 客戶端就是可以與代理交互來發送和接收消息的.網絡
客戶端鏈接到代理. 它能夠訂閱代理中的任何消息 「主題」. 此鏈接能夠是簡單的 TCP/IP 鏈接, 也能夠是用於發送敏感消息的加密 TLS 鏈接.session
客戶端經過將消息和主題發送給代理, 代理而後將消息轉發給全部訂閱該主題的客戶端.分佈式
由於 MQTT 消息是按主題進行組織的, 因此應用程序開發人員能靈活地指定某些客戶端只能與某些消息交互.工具
上圖咱們有兩個主題分別是 config_change
device_data
.ui
設備將在 device_data
主題上發佈設備數據, 通過 Broker 發送給全部訂閱者接收(這裏的訂閱者是數據處理和存儲).
而咱們的設備控制器將命令發佈到 config_change
主題, 通過 Broker 發送給全部訂閱者接收(這裏的訂閱者是設備).
⚠️ Broker = 代理 = MQTT 服務器
下面介紹幾款MQTT服務器:
更詳細的協議介紹在這裏
MQTT 是一種鏈接協議, 它指定了如何組織數據字節並經過 TCP/IP 網絡傳輸它們. 但實際上, 開發人員並不須要瞭解這個鏈接協議.
全部 MQTT 庫和工具都提供了直接處理這些消息的簡單方法, 並能自動填充一些必需的字段, 好比消息和客戶端 ID.
首先, 客戶端發送一條 CONNECT 消息來鏈接代理. CONNECT 消息要求創建從客戶端到代理的鏈接. CONNECT 消息包含如下內容參數.
表 1. CONNECT 消息參數
參數 | 說明 |
---|---|
cleanSession | 此標誌指定鏈接是不是持久性的. 持久會話會將全部訂閱和可能丟失的消息 (具體取決於 QoS) 都存儲在代理中 (請參閱 表 3 獲取 QoS 的描述) |
username | 代理的身份驗證和受權憑證 |
password | 代理的身份驗證和受權憑證 |
lastWillTopic | 鏈接意外中斷時,代理會自動向某個主題發送一條 「last will」 消息. |
lastWillQos | 「last will」 消息的 QoS. (請參閱 表 3 來查看 QoS 的描述) |
lastWillMessage | 「last will」 消息自己 |
keepAlive | 這是客戶端經過 ping 代理來保持鏈接有效所需的時間間隔 |
客戶端收到來自代理的一條 CONNACK 消息. CONNACK 消息包含如下內容參數.
表 2. CONNACK 消息參數
參數 | 說明 |
---|---|
sessionPresent | 此參數代表鏈接是否已有一個持久會話. 也就是說, 鏈接已訂閱了主題, 並且會接收丟失的消息. |
returnCode | 0 表示成功. 其餘值指出了失敗的緣由. |
創建鏈接後, 客戶端向代理髮送一條或多條 SUBSCRIBE 消息, 代表它會從代理接收針對某些主題的消息. 如表 3.
表 3. SUBSCRIBE 消息參數
參數 | 說明 |
---|---|
qos | 代表此主題範圍內的消息傳送到客戶端所需的一致程度. 值 0:不可靠, 消息基本上僅傳送一次, 若是當時客戶端不可用, 則會丟失該消息. 值 1:消息應傳送至少 1 次. 值 2:消息僅傳送一次. |
topic | 要訂閱的主題. 一個主題能夠有多個級別, 級別之間用斜槓字符分隔. 例如, 「dw/demo」 和 「ibm/bluemix/mqtt」 是有效的主題. |
客戶端成功訂閱某個主題後, 代理會返回一條 SUBACK 消息, 其中包含一個或多個 returnCode 參數.
表 4. SUBACK 消息參數
參數 | 說明 |
---|---|
returnCode | SUBCRIBE 命令中的每一個主題都有一個返回代碼. 值 0 - 2:成功達到相應的 QoS 級別. 值 128:失敗. |
與 SUBSCRIBE 消息對應, 客戶端也能夠經過 UNSUBSCRIBE 消息取消訂閱一個或多個主題.
表 5. UNSUBSCRIBE 消息參數
參數 | 說明 |
---|---|
topic | 此參數可重複用於多個主題. |
客戶端可向代理髮送 PUBLISH 消息. 該消息包含一個主題和數據. 代理將消息轉發給全部訂閱該主題的客戶端.
表 6. PUBLISH 消息參數
參數 | 說明 |
---|---|
topicName | 發佈消息的相關主題. |
qos | 消息傳遞的服務質量水平. |
retainFlag | 此標誌代表代理是否保留該消息做爲針對此主題的最後一條已知消息. |
payload | 消息中的實際數據. 它能夠是文本字符串或二進制大對象數據. |