MQTT

mqtt 協議版本: 3.1.1

MQTT 介紹

互聯網的基礎網絡協議是 TCP/IP協議.html

MQTT(消息隊列遙測傳輸)是基於 TCP/IP 協議棧而構建的, 已成爲 IoT 通訊的標準.git

爲何選擇 MQTT

MQTT 有多好多好, 多麼牛逼我就不說了. 說的再多不如一個一個試, 試完了作比對, 剩下的那個就是要選擇的.github

實在不想這樣搞, 技術就跟着一線走.安全

發佈和訂閱模型

MQTT 協議在網絡中定義了兩種實體類型: 一個消息代理和一些客戶端.服務器

代理是一個服務器, 它從客戶端接收全部消息, 而後將這些消息路由到相關的目標客戶端. 客戶端就是可以與代理交互來發送和接收消息的.網絡

客戶端鏈接到代理. 它能夠訂閱代理中的任何消息 「主題」. 此鏈接能夠是簡單的 TCP/IP 鏈接, 也能夠是用於發送敏感消息的加密 TLS 鏈接.session

客戶端經過將消息和主題發送給代理, 代理而後將消息轉發給全部訂閱該主題的客戶端.分佈式

由於 MQTT 消息是按主題進行組織的, 因此應用程序開發人員能靈活地指定某些客戶端只能與某些消息交互.工具

上圖咱們有兩個主題分別是 config_change device_data.ui

設備將在 device_data 主題上發佈設備數據, 通過 Broker 發送給全部訂閱者接收(這裏的訂閱者是數據處理和存儲).

而咱們的設備控制器將命令發佈到 config_change 主題, 通過 Broker 發送給全部訂閱者接收(這裏的訂閱者是設備).

⚠️ Broker = 代理 = MQTT 服務器

MQTT Broker 選擇

下面介紹幾款MQTT服務器:

  • Apache-Apollo: 一個代理服務器, 在 ActiveMQ 基礎上發展而來, 能夠支持 STOMP、AMQP、MQTT、Openwire、SSL和WebSockets 等多種協議, 而且 Apollo 提供後臺管理頁面, 方便開發者管理和調試.
  • EMQ: 號稱百萬級開源MQTT消息服務器, 基於 Erlang/OTP 語言平臺開發, 支持大規模鏈接和分佈式集羣, 發佈訂閱模式的開源MQTT消息服務器.
  • HiveMQ: 一個企業級的MQTT代理,主要用於企業和新興的機器到機器M2M通信和內部傳輸, 最大程度的知足可伸縮性、易管理和安全特性, 提供免費的我的版. HiveMQ提供了開源的插件開發包.
  • Mosquitto: 一款實現了消息推送協議MQTT v3.1的開源消息代理軟件, 提供輕量級的、支持可發佈/訂閱的消息推送模式.

瞭解 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 消息中的實際數據. 它能夠是文本字符串或二進制大對象數據.
相關文章
相關標籤/搜索