三分鐘弄懂物聯網流行協議——MQTT
最近,最熱門的技術莫過于:人工智能,區塊鏈和物聯網。筆者今天就花三分鐘給大家介紹一個物聯網中非常的基礎一個常用的流行協議,MQTT。
為什么使用MQTT 協議?
MQTT(英語全稱,Message Queue Telemetry Transport),中文翻譯過來就是遙測傳輸協議:其主要提供訂閱/發布模式,更為簡約、輕量,易于使用,針對受限環境(帶寬低、網絡延遲高、網絡通信不穩定),屬于物聯網(Internet of Thing)的一個傳輸協議。設計思想是開放、簡單、輕量、易于實現。這些特點使它適用于受限環境。例如,但不僅限于此:
- 特別適合于網絡代價昂貴,帶寬低、不可靠的環境。
- 能在處理器和內存資源有限的嵌入式設備中運行。
- 使用發布/訂閱消息模式,提供一對多的消息發布,從而解除應用程序耦合。
- 使用 TCP/IP 提供網絡連接。
- 提供Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。
對消息中間件,估計大家不得不關心的就是消息的可靠性,也就是消息的發布服務質量,可喜的是,MQTT支持三種消息發布服務質量(QoS):
- “至多一次”(QoS==0),消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用于如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。
- “至少一次”(QoS==1),確保消息到達,但消息重復可能會發生。
- “只有一次”(QoS==2),確保消息到達一次。這一級別可用于如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量。
協議規范的版本
MQTT的協議***的三個版本是:3.1.1,3.1.0和5.0的協議。
- 3.1.0的規范如下:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html
- 3.1.1的規范如下:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718029
- 5.0 的規范如下:http://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
其中5.0還只是一個提案(2017年7月13日發布的一個草稿版的提案),所以本篇文章暫時不涉及MQTT 5.0的協議,考慮到目前主流和成熟的MQTT協議的應用都是MQTT 3.1.1的協議,所以筆者還是以MQTT 3.1.1的協議為基準,給大家分享,只要這個會了,其他的自然不在話下。需要注意的是,MQTT 3.1.0和3.1.1 規范,還是有小部分的區別的。比如可變頭部中,在3.1.0的規范中,其關鍵字是,“MQISdP”。
支持MQTT協議消息中間件產品?
目前有很多的MQTT消息中間件服務器,如下,都是MQTT協議的服務器端的實現。
- IBM Websphere
- MQ Telemetry
- IBM MessageSight
- Mosquitto
- Eclipse Paho
- emqttd Xively
- M2M.io
- webMethods
- Nirvana Messaging
- RabbitMQ
- Apache ActiveMQ
- Apache Apollo
- Moquette
- HiveMQ
- Mosca
- Litmus Automation Loop
- JoramMQ
- ThingMQ
- VerneMQ
支持一對多的消息訂閱
MQTT協議,支持一對多的基于消息主題(Topic)的消息訂閱,也就是一個MQTT的客戶端,發送一條特定主題的消息,
能同時支持多個訂閱者同時訂閱。
如下圖所示意,筆記本和手機都訂閱了消息主題為temperature的消息,當溫度傳感器發布了temperature的消息(當前溫度為21 C), 筆記本和手機都會受到溫度傳感器發布的溫度。
MQTT客戶端的語言支持
目前市面上的主流語言都支持。
- Java
- Javascript
- C/C++
- Python
- Ruby
- Objective-C
- ...