導讀:MQTT(英語全稱,Message Queue Telemetry Transport),中文翻譯過來就是遙測傳輸協(xié)議:其主要提供訂閱/發(fā)布模式,更為簡約、輕量,易于使用,針對受限環(huán)境(帶寬低、網(wǎng)絡延遲高、網(wǎng)絡通信不穩(wěn)定),屬于物聯(lián)網(wǎng)(Internet of Thing)的一個傳輸協(xié)議。
2017年最熱門的技術莫過于:人工智能,區(qū)塊鏈和物聯(lián)網(wǎng)。筆者今天就花三分鐘給大家介紹一個物聯(lián)網(wǎng)中非常的基礎一個常用的流行協(xié)議,MQTT。

為什么使用MQTT 協(xié)議?
MQTT(英語全稱,Message Queue Telemetry Transport),中文翻譯過來就是遙測傳輸協(xié)議:其主要提供訂閱/發(fā)布模式,更為簡約、輕量,易于使用,針對受限環(huán)境(帶寬低、網(wǎng)絡延遲高、網(wǎng)絡通信不穩(wěn)定),屬于物聯(lián)網(wǎng)(Internet of Thing)的一個傳輸協(xié)議。設計思想是開放、簡單、輕量、易于實現(xiàn)。這些特點使它適用于受限環(huán)境。例如,但不僅限于此:
特別適合于網(wǎng)絡代價昂貴,帶寬低、不可靠的環(huán)境。
能在處理器和內(nèi)存資源有限的嵌入式設備中運行。
使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,從而解除應用程序耦合。
使用 TCP/IP 提供網(wǎng)絡連接。
提供Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。
對消息中間件,估計大家不得不關心的就是消息的可靠性,也就是消息的發(fā)布服務質(zhì)量,可喜的是,MQTT支持三種消息發(fā)布服務質(zhì)量(QoS):
“至多一次”(QoS==0),消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡。會發(fā)生消息丟失或重復。這一級別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無所謂,因為不久后還會有第二次發(fā)送。
“至少一次”(QoS==1),確保消息到達,但消息重復可能會發(fā)生。
“只有一次”(QoS==2),確保消息到達一次。這一級別可用于如下情況,在計費系統(tǒng)中,消息重復或丟失會導致不正確的結(jié)果。小型傳輸,開銷很小(固定長度的頭部是 2 字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡流量。
協(xié)議規(guī)范的版本
MQTT的協(xié)議最新的三個版本是:3.1.1,3.1.0和5.0的協(xié)議。
3.1.0的規(guī)范如下
http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html
3.1.1的規(guī)范如下
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718029
5.0 的規(guī)范如下
http://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
其中5.0還只是一個提案(2017年7月13日發(fā)布的一個草稿版的提案),所以本篇文章暫時不涉及MQTT 5.0的協(xié)議,考慮到目前主流和成熟的MQTT協(xié)議的應用都是MQTT 3.1.1的協(xié)議,所以筆者還是以MQTT 3.1.1的協(xié)議為基準,給大家分享,只要這個會了,其他的自然不在話下。需要注意的是,MQTT 3.1.0和3.1.1 規(guī)范,還是有小部分的區(qū)別的。比如可變頭部中,在3.1.0的規(guī)范中,其關鍵字是,“MQISdP”。
支持MQTT協(xié)議消息中間件產(chǎn)品?
目前有很多的MQTT消息中間件服務器,如下,都是MQTT協(xié)議的服務器端的實現(xiàn)。
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協(xié)議,支持一對多的基于消息主題(Topic)的消息訂閱,也就是一個MQTT的客戶端,發(fā)送一條特定主題的消息,
能同時支持多個訂閱者同時訂閱。
如下圖所示意,筆記本和手機都訂閱了消息主題為temperature的消息,當溫度傳感器發(fā)布了temperature的消息(當前溫度為21 C), 筆記本和手機都會受到溫度傳感器發(fā)布的溫度。

MQTT客戶端的語言支持
目前市面上的主流語言都支持。
Java
Javascript
C/C++
Python
Ruby
Objective-C
...