物聯網MQTT協議分析和開源Mosquitto部署驗證

在《物聯網核心協議消息推送技術演進》一文中已向讀者介紹了多種消息推送技術的狀況,包括HTTP單向通訊、Ajax輪詢、Websocket、MQTT、CoAP等,其中MQTT協議爲IBM制定併力推,其具備開放、簡單、輕量級以及易於實現的特色使得其即使在資源受限的環境中也能獲得很好的使用,好比運行在資源緊缺型的嵌入式系統中或網絡帶寬很是昂貴的環境中,除此以外,它也被普遍用於遙感勘測、智能家居、能源監測和醫療應用程序等各個領域,是物聯網的重要組成部分,未來可能會成爲物聯網的事實標準。javascript

本篇文章將幫助讀者認識MQTT協議以及在Linux環境下部署MQTT的開源實現Mosquitto進行體驗驗證,在後續文章中將展開對其源碼框架的分析,爲構建物聯網平臺作好鋪墊。html

1、MQTT協議分析java

1.一、MQTT協議簡介c++

MQTT(MessageQueueing Telemetry Transport Protocol)的全稱是消息隊列遙感傳輸協議的縮寫,是由IBM公司推出的一種基於輕量級代理的發佈/訂閱模式的消息傳輸協議,運行在TCP協議棧之上,爲其提供有序、可靠、雙向鏈接的網絡鏈接保證。因爲其開放、簡單和易於實現因此可以應用在資源受限的環境中,對於M2M和物聯網應用程序來講是一個至關不錯的選擇。 編程

1.二、發佈者/訂閱者服務器

MQTT採用代理的發佈/訂閱模式實現了發佈者和訂閱者的解耦(decouple),所以,在MQTT協議中有三種角色:代理服務器、發佈者客戶端以及訂閱者客戶端,其中發佈者和訂閱者互不干擾,也就是說發佈者和訂閱者互不知道對方的存在,它們只知道代理服務器,代理服務器負責未來自發布者的消息進行存儲處理並將這些消息發送到正確的訂閱者中去。這種解耦體如今如下3個方面上:網絡

·空間解耦:發佈者和訂閱者沒必要知道對方的存在,例如對方的IP地址或者端口;框架

·時間解耦:發佈者和訂閱者沒必要同時創建鏈接;socket

·同步解耦:發佈者和訂閱者在發佈消息或接收消息的時候不須要同步;編程語言

 

 

1.三、MQTT的消息類型

MQTT的三種角色經過14種不一樣的消息類型進行交互:

1.CONNECT控制報文用於客戶端請求與服務器創建鏈接,應用層的鏈接而不是TCP/IP鏈接,CONNECT控制報文的發送在TCP/IP創建鏈接後;

2.CONNACK控制報文用於服務器向請求鏈接的客戶端回發鏈接確認;

3.PUBLISH控制報文用於發佈指定主題名的應用信息;

4.PUBACK/PUBREC/PUBREL/PUBCOMP控制報文用於針對不一樣服務質量的應用信息的迴應;

5.SUBSCRIBE控制報文用於訂閱者向服務器發送一個主題過濾器列表,用於表示客戶端想要訂閱的主題;

6.SUBACK控制報文用於SUBSCRIBE控制報文的響應;

7.UNSUBSCRIBE控制報文用於向服務器發送一個主題過濾器列表,用於表示客戶端想要取消訂閱的主題;

8.UNSUBACK控制報文用於UNSUBSCRIBE控制報文的響應;

9.PINGREQ/PINGRESP控制報文做爲客戶端和服務器間的心跳包;

10.DISCONNECT控制報文用於客戶端在斷開前告訴服務器其將斷開鏈接;

 

1.四、主題(topic)

使用主題是服務器爲每個客戶端管理應用信息所採用的一種方式,一個主題名能夠由多個主題層級(topic level)組成,每一層經過’/’斜槓分隔開,當客戶端指定的主題過濾器包含通配符時,即客戶端想一次訂閱多個具備相似結構的主題時,主題層級分隔符就頗有用了。

主題通配符只可用在主題過濾器中,在發佈應用消息時的主題名不容許包含通配符,主題通配符有兩種:

單層通配符:’+’,它會匹配某一個主題層級中的全部主題;

多層通配符:’#’,它會匹配多個主題主題層級的主題;

例如:若是客戶端訂閱時的主題過濾器爲」grade/subject/math/#」,它會收到使用下列主題名發佈的消息:

 

     「grade/subject/math」

    「grade/subject/math/student1」

    「grade/subject/math/student1/lastterm」

1.五、服務質量等級(QosLevels)

MQTT提供三種Qos的消息傳遞質量:

a.最多一次(Atmost once delivery):QoS=0,協議對此等級應用信息不要求迴應確認,也沒有重發機制,這類信息可能會發生消息丟失或重複,取決於TCP/IP提供的盡最大努力交互的數據包服務。

b.最少一次(Atleast once delivery):QoS=1,確保信息到達,但消息重複可能發生,發送者若是在指定時間內沒有收到PUBACK控制報文,應用信息會被從新發送,且控制報文中DUP標誌位置1。

c.僅僅一次(Exactlyonce delivery):QoS=2,最高級別的服務質量,消息丟失和重複都是不可接受的。

 

 

1.六、支持MQTT協議的服務器和客戶端

當前流行的開源代理服務器(MQTT Broker)的實現有:mosquitto, HiveMQ, Apache ActiveMQ, RabbitMQ, mosca等,MQTT客戶端也有不一樣操做系統和編程語言下的實現,流行的客戶端庫(MQTT ClientLibraries)有:Eclipse Paho(支持C,C++, JavaJavaScriptPython, Go, C#), M2MQTT(C#), Fusesource MQTTClient(Java), MQTT.js(javascript), libmosquitto(c/c++)等等,經過以上庫而開發出的MQTT客戶端應用程序有:mosquitto_pub/mosquitto_sub(可運行於Linux, Windows, MacOSX操做系統), HiveMQWebsocket Client(Web browser), MyMQTT(Android), MQTTLens(Google Chrome)等等。

 

2、Mosquitto部署驗證

2.一、Ubuntu下安裝Mosquitto

1.源碼包下載:http://mosquitto.org/files/source/

版本:mosquitto-1.4.tar.gz

解壓:tar -zxvf mosquitto-1.4.tar.gz

進入目錄:cd mosquitto-1.4

 

2.編譯安裝

打開配置文件,去掉暫且不須要的功能:

vi config.mk

如:WITH_TLS,WITH_TLS_PSK, WITH_SRV, WITH_WEBSOCKETS, WITH_SOCKS, WITH_UUID等

保存退出:wq

安裝mosquitto

make

make install

 

2.二、啓動mosquitto服務器

mosquitto默認以mosquitto用戶啓動,因此首先建立mosquitto用戶:

adduser mosquitto

啓動代理服務器:mosquitto -c/etc/mosquitto/mosquitto.conf.example

在啓動服務器過程當中有可能遇到如下錯誤:找不到libmosquitto.so.1文件,解決方法是添加連接庫路徑:

vi/etc/ld.so.conf.d/liblocal.conf

/usr/local/lib64

/usr/local/lib

退出文件後刷新:ldconfig

從新執行:mosquitto -c /etc/mosquitto/mosquitto.conf.example

 

2.三、啓動訂閱者客戶端mosquitto_sub,訂閱test主題

mosquitto_sub客戶端應用程序位於/mosquitto-1.4/client目錄下,執行./mosquitto_sub-t test, -t表示主題過濾器屬性,後面帶指定的主題過濾器。

 

2.四、啓動發佈者客戶端mosquitto_pub,而且屢次發佈主題信息

./mosquitto_pub-t test -l

其中-t表示發佈的主題名,主題名中不容許包含通配符,-l是指經過標準輸入的方式輸入將要發佈的應用信息,更多的屬性可經過:./mosquiito_pub --help瞭解,也可經過官網瞭解:

http://mosquitto.org/man/mosquitto_pub-1.html

 

 

發佈者發佈應用信息:

 

 

2.五、發佈者經過鍵入」Ctrl+D」向服務器發送DISCONNECT控制報文,而後正常退出

若是經過」Ctrl+C」終止客戶端程序(異常網絡斷開),服務器將提示:Scoket error

 

 

本篇文章初步講述了MQTT協議及以其中的一種實現爲例進行部署和體驗,協議的詳細具體內容如控制報文格式等,讀者可自行到官網下載文檔查閱,也能夠關注嵌入式企鵝圈來獲取共享資源。

相關文章
相關標籤/搜索