在《物聯(lián)網(wǎng)核心協(xié)議—消息推送技術(shù)演進(jìn)》一文中已向讀者介紹了多種消息推送技術(shù)的情況,包括HTTP單向通信、Ajax輪詢、Websocket、MQTT、CoAP等,其中MQTT協(xié)議為IBM制定并力推,其具有開放、簡單、輕量級(jí)以及易于實(shí)現(xiàn)的特點(diǎn)使得其即便在資源受限的環(huán)境中也能得到很好的使用,比如運(yùn)行在資源緊缺型的嵌入式系統(tǒng)中或網(wǎng)絡(luò)帶寬非常昂貴的環(huán)境中,除此之外,它也被廣泛用于遙感勘測(cè)、智能家居、能源監(jiān)測(cè)和醫(yī)療應(yīng)用程序等各個(gè)領(lǐng)域,是物聯(lián)網(wǎng)的重要組成部分,將來可能會(huì)成為物聯(lián)網(wǎng)的事實(shí)標(biāo)準(zhǔn)。
本篇文章將幫助讀者認(rèn)識(shí)MQTT協(xié)議以及在Linux環(huán)境下部署MQTT的開源實(shí)現(xiàn)Mosquitto進(jìn)行體驗(yàn)驗(yàn)證,在后續(xù)文章中將展開對(duì)其源碼框架的分析,為構(gòu)建物聯(lián)網(wǎng)平臺(tái)做好鋪墊。
一、MQTT協(xié)議分析
1.1、MQTT協(xié)議簡介
MQTT(MessageQueueing Telemetry Transport Protocol)的全稱是消息隊(duì)列遙感傳輸協(xié)議的縮寫,是由IBM公司推出的一種基于輕量級(jí)代理的發(fā)布/訂閱模式的消息傳輸協(xié)議,運(yùn)行在TCP協(xié)議棧之上,為其提供有序、可靠、雙向連接的網(wǎng)絡(luò)連接保證。由于其開放、簡單和易于實(shí)現(xiàn)所以能夠應(yīng)用在資源受限的環(huán)境中,對(duì)于M2M和物聯(lián)網(wǎng)應(yīng)用程序來說是一個(gè)相當(dāng)不錯(cuò)的選擇。
1.2、發(fā)布者/訂閱者
MQTT采用代理的發(fā)布/訂閱模式實(shí)現(xiàn)了發(fā)布者和訂閱者的解耦(decouple),因此,在MQTT協(xié)議中有三種角色:代理服務(wù)器、發(fā)布者客戶端以及訂閱者客戶端,其中發(fā)布者和訂閱者互不干擾,也就是說發(fā)布者和訂閱者互不知道對(duì)方的存在,它們只知道代理服務(wù)器,代理服務(wù)器負(fù)責(zé)將來自發(fā)布者的消息進(jìn)行存儲(chǔ)處理并將這些消息發(fā)送到正確的訂閱者中去。這種解耦體現(xiàn)在以下3個(gè)方面上:
·空間解耦:發(fā)布者和訂閱者不必知道對(duì)方的存在,例如對(duì)方的IP地址或者端口;
·時(shí)間解耦:發(fā)布者和訂閱者不必同時(shí)建立連接;
·同步解耦:發(fā)布者和訂閱者在發(fā)布消息或接收消息的時(shí)候不需要同步;

1.3、MQTT的消息類型
MQTT的三種角色通過14種不同的消息類型進(jìn)行交互:

1.CONNECT控制報(bào)文用于客戶端請(qǐng)求與服務(wù)器建立連接,應(yīng)用層的連接而不是TCP/IP連接,CONNECT控制報(bào)文的發(fā)送在TCP/IP建立連接后;
2.CONNACK控制報(bào)文用于服務(wù)器向請(qǐng)求連接的客戶端回發(fā)連接確認(rèn);
3.PUBLISH控制報(bào)文用于發(fā)布指定主題名的應(yīng)用信息;
4.PUBACK/PUBREC/PUBREL/PUBCOMP控制報(bào)文用于針對(duì)不同服務(wù)質(zhì)量的應(yīng)用信息的回應(yīng);
5.SUBSCRIBE控制報(bào)文用于訂閱者向服務(wù)器發(fā)送一個(gè)主題過濾器列表,用于表示客戶端想要訂閱的主題;
6.SUBACK控制報(bào)文用于SUBSCRIBE控制報(bào)文的響應(yīng);
7.UNSUBSCRIBE控制報(bào)文用于向服務(wù)器發(fā)送一個(gè)主題過濾器列表,用于表示客戶端想要取消訂閱的主題;
8.UNSUBACK控制報(bào)文用于UNSUBSCRIBE控制報(bào)文的響應(yīng);
9.PINGREQ/PINGRESP控制報(bào)文作為客戶端和服務(wù)器間的心跳包;
10.DISCONNECT控制報(bào)文用于客戶端在斷開前告訴服務(wù)器其將斷開連接;
1.4、主題(topic)
使用主題是服務(wù)器為每一個(gè)客戶端管理應(yīng)用信息所采用的一種方式,一個(gè)主題名可以由多個(gè)主題層級(jí)(topic level)組成,每一層通過’/’斜杠分隔開,當(dāng)客戶端指定的主題過濾器包含通配符時(shí),即客戶端想一次訂閱多個(gè)具有類似結(jié)構(gòu)的主題時(shí),主題層級(jí)分隔符就很有用了。
主題通配符只可用在主題過濾器中,在發(fā)布應(yīng)用消息時(shí)的主題名不允許包含通配符,主題通配符有兩種:
單層通配符:’+’,它會(huì)匹配某一個(gè)主題層級(jí)中的所有主題;
多層通配符:’#’,它會(huì)匹配多個(gè)主題主題層級(jí)的主題;
例如:如果客戶端訂閱時(shí)的主題過濾器為”grade/subject/math/#”,它會(huì)收到使用下列主題名發(fā)布的消息:
“grade/subject/math”
“grade/subject/math/student1”
“grade/subject/math/student1/lastterm”
1.5、服務(wù)質(zhì)量等級(jí)(QosLevels)
MQTT提供三種Qos的消息傳遞質(zhì)量: