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

來源:互聯網
上載者:User

標籤:

在《物聯網核心協議—訊息推送技術演化》一文中已向讀者介紹了多種訊息推送技術的情況,包括HTTP單向通訊、Ajax輪詢、Websocket、MQTT、CoAP等,其中MQTT協議為IBM制定并力推,其具有開放、簡單、輕量級以及易於實現的特點使得其即便在資源受限的環境中也能得到很好的使用,比如運行在資源緊缺型的嵌入式系統中或網路頻寬非常昂貴的環境中,除此之外,它也被廣泛用於遙感勘測、智能家居、能源監測和醫學應用程式等各個領域,是物聯網的重要組成部分,將來可能會成為物聯網的事實標準。

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

一、MQTT協議分析

1.1、MQTT協議簡介

MQTT(MessageQueueing Telemetry Transport Protocol)的全稱是訊息佇列遙感傳輸協議的縮寫,是由IBM公司推出的一種基於輕量級代理的發布/訂閱模式的訊息傳輸協議,運行在TCP協議棧之上,為其提供有序、可靠、雙向串連的網路連接保證。由於其開放、簡單和易於實現所以能夠應用在資源受限的環境中,對於M2M和物聯網應用程式來說是一個相當不錯的選擇。 

1.2、發行者/訂閱者

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

·空間解耦:發行者和訂閱者不必知道對方的存在,例如對方的IP地址或者連接埠;

·時間解耦:發行者和訂閱者不必同時建立串連;

·同步解耦:發行者和訂閱者在發布訊息或接收訊息的時候不需要同步;

 

 

1.3、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.4、主題(topic)

使用主題是伺服器為每一個用戶端管理應用資訊所採用的一種方式,一個主題名可以由多個主題層級(topic level)組成,每一層通過’/’斜杠分隔開,當用戶端指定的主題過濾器包含萬用字元時,即用戶端想一次訂閱多個具有類似結構的主題時,主題層級分隔字元就很有用了。

主題萬用字元只可用在主題過濾器中,在發布應用訊息時的主題名不允許包含萬用字元,主題萬用字元有兩種:

單層萬用字元:’+’,它會匹配某一個主題層級中的所有主題;

多層萬用字元:’#’,它會匹配多個主題主題層級的主題;

例如:如果客訂閱時的主題過濾器為”grade/subject/math/#”,它會收到使用下列主題名發布的訊息:

 

     “grade/subject/math”

    “grade/subject/math/student1”

    “grade/subject/math/student1/lastterm”

1.5、服務品質等級(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.6、支援MQTT協議的伺服器和用戶端

當前流行的開源Proxy 伺服器(MQTT Broker)的實現有:mosquitto, HiveMQ, Apache ActiveMQ, RabbitMQ, mosca等,MQTT用戶端也有不同作業系統和程式設計語言下的實現,流行的用戶端庫(MQTT ClientLibraries)有:Eclipse Paho(支援C,C++, Java, JavaScript, Python, 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)等等。

 

二、Mosquitto部署驗證

2.1、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.2、啟動mosquitto伺服器

mosquitto預設以mosquitto使用者啟動,所以首先建立mosquitto使用者:

adduser mosquitto

啟動Proxy 伺服器: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.3、啟動訂閱者用戶端mosquitto_sub,訂閱test主題

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

 

2.4、啟動發行者用戶端mosquitto_pub,並且多次發布主題資訊

./mosquitto_pub-t test -l

其中-t表示發布的主題名,主題名中不允許包含萬用字元,-l是指通過標準輸入的方式輸入將要發布的應用資訊,更多的屬性可通過:./mosquiito_pub --help瞭解,也可通過官網瞭解:

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

 

 

發行者發布應用資訊:

 

 

2.5、發行者通過鍵入”Ctrl+D”向伺服器發送DISCONNECT控制報文,然後正常退出

如果通過”Ctrl+C”終止用戶端程式(異常網路斷開),伺服器將提示:Scoket error

 

 

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

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.