【摘要】本文介紹一種全新的物聯(lián)網(wǎng)通信協(xié)議——基于發(fā)布/訂閱范式的消息隊列遙測傳輸協(xié)議的原理、組成和實現(xiàn)。研究在計算和通信能力受限的基于單片機的物聯(lián)網(wǎng)節(jié)點上,實現(xiàn)基于MQTT的數(shù)據(jù)傳遞。
【關鍵詞】消息隊列遙測傳輸協(xié)議;發(fā)布/訂閱傳遞機制;基于主題
在設計和部署物聯(lián)網(wǎng)應用系統(tǒng)時,選擇高效、低資源占用的消息傳遞協(xié)議是系統(tǒng)架構(gòu)設計關鍵一步。設計人員看到太多的通信協(xié)議,它們存在一些差別,而傳感節(jié)點提供僅能夠提供非常有限的計算能力、低可靠的通信鏈路和有限的電池電量,消息服務器通常部署在云端。本文討論一種適應物聯(lián)網(wǎng)通信需要的輕量級可靠消息傳遞協(xié)議——MQTT,并介紹以8位單片機為傳感節(jié)點的系統(tǒng)實現(xiàn)。
1.MQTT簡介
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸,以下簡稱MQTT)是IBM和Eurotech開發(fā)的一個發(fā)布/訂閱模式通信協(xié)議。MQTT建立在TCPIP上(圖1),為計算能力有限,且工作在低帶寬、不可靠的網(wǎng)絡的遠程傳感器和控制設備通訊而設計的協(xié)議,是物聯(lián)網(wǎng)的重要通信協(xié)議之一。
MQTT可以在支持TCPIP的不同類型設備上實現(xiàn),例如:計算機、移動設備(智能手機、平板、PDA)、計算機能力有限的傳感節(jié)點等;可以不用OS或者在不同OS環(huán)境下實現(xiàn),包括:Windows、Linux、Android等;MQTT組織提供不同語言的開發(fā)包,目前已有C、JAVA、Python等;MQTT可以在帶寬受限的不可靠通信網(wǎng)絡實現(xiàn)數(shù)據(jù)在數(shù)據(jù)生產(chǎn)者和使用者間有效傳輸。
本文研究MQTT在Arduino單片機開發(fā)板上的實現(xiàn),描述MQTT實現(xiàn)傳感數(shù)據(jù)網(wǎng)絡傳輸?shù)脑?、組成和方法。MQTT建立在Arduino上。消息生產(chǎn)者與接收者之間保持低耦合性。
2.發(fā)布/訂閱消息傳遞機制
發(fā)布/訂閱(Publish/subscribe或pub/sub)是一種消息范式,在這種機制下,多個發(fā)布應用(消息生產(chǎn)者)和多個訂閱應用(消息消費者)通過建立在代理服務中的特定主題作為中介互相通信。生產(chǎn)者與消費者間不需要通過TCP建立直接的通信連接,發(fā)布的消息進入一個先入先出的隊列;訂閱者對一個或多個類別表達興趣,于是只接收感興趣的消息,而不需要知道什么樣的發(fā)布者發(fā)布的消息。這種發(fā)布者和訂閱者的解耦解耦可以允許更好的可擴放性和更為動態(tài)的網(wǎng)絡拓撲。
在發(fā)布/訂閱模型中,訂閱者通常接收所有發(fā)布的消息的一個子集。選擇接受和處理的消息的過程被稱作過濾。有兩種常用的過濾形式:基于主題(例如:MQTT)和基于內(nèi)容。在基于主題的系統(tǒng)中,發(fā)布者發(fā)布消息到一個中間的消息代理,命名一個主題或通道上(圖2)。然后,訂閱者向該消息代理注冊訂閱,由消息代理來進行過濾。訂閱者將收到其訂閱的主題上的所有消息,并且所有訂閱同一主題的訂閱者將接收到同樣的消息。發(fā)布者負責定義訂閱者所訂閱的消息類別。消息代理通常執(zhí)行存儲轉(zhuǎn)發(fā)的功能將消息從發(fā)布者發(fā)送到訂閱者。
與點對點模型不同,使用發(fā)布/訂閱模型發(fā)布到一個主題的消息,能夠由多個訂閱者所接收。有時候,也稱這項技術(shù)為廣播(broad-casting)消息。每個訂閱者都會接收到每條消息的一個副本??偟貋碚f,發(fā)布/訂閱消息傳送模型基本上是一個基于推送(push)的模型,其中消息自動地向消費者廣播,它們無須請求或輪詢主題來獲得新消息。在發(fā)布/訂閱消息傳送模型內(nèi)部,有多種不同類型的訂閱者。非持久訂閱者是臨時訂閱類型,它們只是在主動偵聽主題時才接收消息。而另一方面,持久訂閱者將接收到發(fā)布的每條消息的一個副本,即便在發(fā)布消息,它們處于\"離線\"狀態(tài)時也是如此。
3.基于Arduino UNO的MQTT實現(xiàn)
3.1 支持TCPIP的Arduino開發(fā)板:Arduino UNO單片機板+TCPIP以太網(wǎng)接口板
Arduino是一個開源電子平臺,板載AVR、ARM等單片機,使用Arduino編程語言編程,類似于C編程語言。可加載庫文件所提供的類和函數(shù)提供對外圍器件和通信接口的支持,庫文件用C++編寫。借助這個平臺,物聯(lián)網(wǎng)技術(shù)開發(fā)者可以快速驗證和在實驗室部署連接傳感器和執(zhí)行器的應用。Arduino代碼主要由二部分組成:setup( )和loop( ),前者在程序啟動后運行一次,后者在余下的時間循環(huán)運行,直至被復位。
本文中使用Arduino硬件由二部分組成:Arduino UNO單片機板和W5100 TCPIP以太網(wǎng)接口板(圖3)。Arduino UNO是一塊8位AVR單片機,負責驅(qū)動傳感器、執(zhí)行器,經(jīng)由SPI接口連接到內(nèi)置了TCPIP協(xié)議的W5100以太網(wǎng)接口板,連接互聯(lián)網(wǎng)和交互數(shù)據(jù)。MQTT服務器提供代理服務,介于發(fā)布與訂閱者之間。
3.2 MQTT代理服務器(MQTT Broker Server)
如表1所示,MQTT代理是運行MQTT協(xié)議的服務器,是介于MQTT客戶端(例如:遠程傳感節(jié)點等裝置)和企業(yè)數(shù)據(jù)集層二者間的中介通信。IBM等公司開發(fā)了商用MQTT代理服務,另有一些開源公共平臺供MQTT開發(fā)者研究和測試。Mosquitto是一個開放源代碼的MQTT代理服務器,支持C,C++,Python語言開發(fā)。
MQTT從低到高確定了三種服務質(zhì)量等級:QoS 0、QoS 1、QoS 2。等級越高,意味需要更多的系統(tǒng)開銷,通信效率受影響越多。
3.3 MQTT客戶端在Arduino上的實現(xiàn)
Arduino上的客戶端實現(xiàn)一個周期性的數(shù)據(jù)發(fā)布,通過一個庫提供MQTT客戶端的類與函數(shù)。這個庫包含Arduino下相應代碼和功能——連接、發(fā)布、訂閱等。在下面這個簡單的示例中,首先依次初始化以太網(wǎng)、TCPIP協(xié)議和MQTT協(xié)議建立連接,然后,周期性地向代理服務器發(fā)布消息。這個案例支持QoS等級為0,可設置最大消息長度和心跳間隔時間,默認值分別為128字節(jié)和15秒。Arduino設備使用MQTT協(xié)議發(fā)布消息到代理的某一個主題。
修改如表2所示案例,讀取一個溫度傳感器DS18B20數(shù)值,并發(fā)布到環(huán)境溫度主題,可以通過一個WMQTT工具軟件充當代理服務器來實時監(jiān)測傳感器發(fā)布的數(shù)據(jù)。協(xié)議數(shù)據(jù)與關鍵代碼過程:
(1)創(chuàng)建MQTT客戶端對象,PubSubClient,例如:TempSensor_1;
(2)建立與MQTT代理服務器的連接,Temp Sensor_1.Connect,連接時需要客戶端ID;
(3)發(fā)布消息,TempSensor_1.Publish,帶上主題、內(nèi)容。
4.測試與分析
使用Wireshark數(shù)據(jù)包偵聽和獲取Arduion傳感節(jié)點發(fā)出的數(shù)據(jù)包,觀察和分析這些數(shù)據(jù)包,詳細了解MQTT消息傳遞協(xié)議實現(xiàn)過程。本例發(fā)布的溫度數(shù)據(jù),可以通過代理服務器,向多個訂閱者發(fā)放副本,為不同的數(shù)據(jù)集成應用提供來自底層的數(shù)據(jù)信息。實驗驗證,這種輕量級的發(fā)布/訂閱機制實現(xiàn),將使物聯(lián)網(wǎng)系統(tǒng)的設計帶來極大的靈活性和可靠性。結(jié)合云端的數(shù)據(jù)庫和WEB服務,可以建立功能強大的機到機通信和物聯(lián)網(wǎng)應用。
參考文獻
[1]Oracle,Sun Java System Message Queue 3.7 UR1技術(shù)概述,2010.
[2]徐冉,薛江波.WebSphere MQ V7發(fā)布/訂閱技術(shù),IBM CHINA,2009.4.7.
[3]Boris Lublinsky,王麗娟(譯者).基于AWS技術(shù)實現(xiàn)發(fā)布/訂閱服務,2013.8.20.
[4]Wiznet,W5100 datasheet,Version 1.2.4,2011.1.
[5]MQTT.org,MQTT specification V3.MQ Telemetry Transport(MQTT)V3.1 Protocol Specification,19 Aug 2010.
作者簡介:
張波(1968—),江蘇無錫人,副教授,現(xiàn)供職于無錫機電高等職業(yè)技術(shù)學校自動化系,研究方向:電子技術(shù)應用、工業(yè)自動化。
楊國華(1970—),江蘇武進人,副教授,現(xiàn)供職于無錫商業(yè)職業(yè)技術(shù)學院物聯(lián)網(wǎng)技術(shù)學院,研究方向:通信技術(shù)、物聯(lián)網(wǎng)應用。