消息中間件在物聯(lián)網(wǎng)網(wǎng)關(guān)中的應(yīng)用
0 引 言
物聯(lián)網(wǎng)應(yīng)用系統(tǒng)是一個復(fù)雜的分布式系統(tǒng),系統(tǒng)通常由數(shù)管理界面以及支持Amazon AWS IoT,Microsoft Azure IoT 和IBM IoT 云服務(wù)的接口 [4]。Kura 運行在 Java 虛擬機(JVM)上,據(jù)采集節(jié)點、執(zhí)行器節(jié)點和網(wǎng)關(guān)組成,不同功能節(jié)點之間可以使用模塊化 OSG(iOpen Service Gateway Initiative,OSGi)技
使用 ZigBee,BLE 等通信協(xié)議實現(xiàn)數(shù)據(jù)通信。通常情況下,這些協(xié)議的實現(xiàn)要求所有節(jié)點使用同一種開發(fā)環(huán)境,部署在同一款軟件框架上,在實際應(yīng)用中,更多的是對原有系統(tǒng)的擴展或者是在原有系統(tǒng)之上再疊加一層新系統(tǒng)。用戶更關(guān)注如何復(fù)用已有的軟硬件資源,以減少開發(fā)周期并降低成本。原有節(jié)點可能由不同的開發(fā)語言實現(xiàn),運行在不同的框架和平臺之上。如何在不同的模塊、平臺和應(yīng)用之間進行數(shù)據(jù)通信是實際應(yīng)用過程中亟待解決的問題。消息中間件是解決企業(yè)應(yīng)用系統(tǒng)異構(gòu)集成的一種有效方法 [1-2],這種方法也同樣適用于物聯(lián)網(wǎng) [3]。物聯(lián)網(wǎng)中的分布式節(jié)點本身就是一個小型的嵌入式系統(tǒng),其硬件配置足以支持其上運行嵌入式操作系統(tǒng)和服務(wù)管理軟件,從而為基于消息的異構(gòu)系統(tǒng)集成在物聯(lián)網(wǎng)節(jié)點上的實現(xiàn)提供了可能。
本文對基于消息中間件的物聯(lián)網(wǎng)應(yīng)用異構(gòu)系統(tǒng)集成進行了探索,并在環(huán)境監(jiān)控系統(tǒng)中對設(shè)計方案進行了驗證。傳感器節(jié)點和網(wǎng)關(guān)分別使用不同的開發(fā)語言和客戶端軟件,傳感器節(jié)點采用Python 開發(fā),網(wǎng)關(guān)使用基于 OSGi 框架的插件技術(shù),對網(wǎng)關(guān)管理軟件 Kura 的服務(wù)進行擴展,使其支持 JMS(Java Message Service,JMS)。借助部署在網(wǎng)關(guān)的 ActiveMQ 消息中間件,實現(xiàn)了在不同節(jié)點之間通過消息機制進行數(shù)據(jù)通信的目的。
1 相關(guān)技術(shù)介紹
1.1 Kura 開源網(wǎng)關(guān)框架
Kura 是 Eclipse 基金會發(fā)布的物聯(lián)網(wǎng)項目,用于構(gòu)建 IoT網(wǎng)關(guān)框架,它提供了一種使用開源硬件作為網(wǎng)關(guān)的方式。Kura內(nèi)部嵌入了多種對網(wǎng)關(guān)容器進行管理的服務(wù),包括 UI Web管理界面以及支持 Amazon AWS IoT,Microsoft Azure IoT 和IBM IoT 云服務(wù)的接口[4]。Kura 運行在 Java 虛擬機(JVM)上,使用模塊化 OSGi(Open Service Gateway Initiative,OSGi)技術(shù)實現(xiàn)。由于網(wǎng)關(guān)基于動態(tài)可插拔的模塊化技術(shù)實現(xiàn),因此用戶可以很方便地創(chuàng)建自己的功能插件,并集成到系統(tǒng)中實現(xiàn)網(wǎng)關(guān)功能的擴展 [5-6]。Kura 遵循 OSGi R4 規(guī)范,其核心設(shè)計思想是面向服務(wù)的組件模型。在 OSGi 中,組件或模塊稱為 bundle,OSGi 支持軟件熱插拔、多版本并存,具有動態(tài)模塊化、面向服務(wù)架構(gòu)和模塊擴展等功能,OSGi 的模塊擴展功能可以在不改變原有模塊代碼的情況下注入新的功能或更新原有功能 [7]。
1.2 ActiveMQ 消息服務(wù)
消息中間件基于消息驅(qū)動方式,為異構(gòu)系統(tǒng)和平臺提供了一種高效、可靠的數(shù)據(jù)通信服務(wù) [8]。ActiveMQ 是被廣泛使用的基于 JMS 規(guī)范的開源消息中間件,它屏蔽了底層軟件框架和硬件的差異,具有部署簡單、占用資源少、運行可靠等特點。消息中間件不僅簡化了在物聯(lián)網(wǎng)環(huán)境下異構(gòu)應(yīng)用的集成,也提供了一種構(gòu)建松耦合系統(tǒng)的方式。
2 系統(tǒng)框架設(shè)計
系統(tǒng)由傳感器節(jié)點和網(wǎng)關(guān)構(gòu)成,在局域網(wǎng)內(nèi)采用分布式部署,節(jié)點之間通過消息進行數(shù)據(jù)通信,系統(tǒng)架構(gòu)如圖 1 所示。
傳感器節(jié)點采集現(xiàn)場數(shù)據(jù)后,將傳感器數(shù)據(jù)封裝到消息負(fù)載中,并通過設(shè)計開發(fā)的 ActiveMQ 客戶端軟件將消息發(fā)送到網(wǎng)關(guān)。網(wǎng)關(guān)采用 Kura 框架對軟硬件資源進行管理,與傳感器節(jié)點的硬件運行平臺相同,它們運行在開源硬件樹莓派(Raspberry Pi)之上。網(wǎng)關(guān)不具有數(shù)據(jù)采集功能, 但具有更多的數(shù)據(jù)處理和網(wǎng)絡(luò)管理功能。系統(tǒng)需要在網(wǎng)關(guān)中部署ActiveMQ 消息中間件,用于 JMS 消息管理。由于 Kura 框架本身不支持 JMS 服務(wù),無法實現(xiàn)與消息中間件的消息通信, 因此,需要設(shè)計新的 bundle 對 Kura 網(wǎng)關(guān)框架進行 JMS 消息功能擴展,使其支持對JMS 消息的訂閱 / 發(fā)布服務(wù)。網(wǎng)關(guān)既可以利用消息機制接收來自傳感器節(jié)點的數(shù)據(jù),也可對數(shù)據(jù)進行格式轉(zhuǎn)換、分析,并通過 MQTT 協(xié)議與云端相連。
基于 JMS 消息的通信機制可以屏蔽通信雙方的具體技術(shù)實現(xiàn)細節(jié),以統(tǒng)一的消息協(xié)議通過第三方消息中間件實現(xiàn)通信, 并可以實現(xiàn)一對一、一對多等不同形式的消息通信模式。傳感器節(jié)點可以在不同的主題上發(fā)布消息,也可以多個節(jié)點在同一主題上發(fā)布,滿足了系統(tǒng)集成的松耦合和靈活性要求。
3 主要功能的設(shè)計與實現(xiàn)
3.1 傳感器節(jié)點
系統(tǒng)中節(jié)點硬件平臺均選用開源硬件樹莓派開發(fā)板,其上可運行 Linux 或Win10 操作系統(tǒng),開發(fā)板搭載 1.2 GHz 的64 位 ARM 處理器,板上集成 802.11 b/g/n 無線網(wǎng)卡和低功耗藍牙 4.1 適配器。為連接外部設(shè)備,樹莓派上配置有 40 個GPIO 引腳,支持 SPI,I2C 以及Serial 等接口和總線標(biāo)準(zhǔn),豐富的軟硬件資源可保證其不僅可作為數(shù)據(jù)采集終端,也可作為物聯(lián)網(wǎng)系統(tǒng)的小型網(wǎng)關(guān)。
傳感器節(jié)點通過 GPIO 接口連接溫濕度傳感器 DHT11。數(shù)據(jù)采集程序使用 Python 開發(fā),獲取數(shù)字量的環(huán)境溫、濕度數(shù)據(jù),然后調(diào)用 STOMP(Streaming Text Orientated Message Protocol,STOMP)庫函數(shù)將數(shù)據(jù)封裝為 JMS 消息發(fā)送到網(wǎng)關(guān)。 STOMP 即流文本定向消息協(xié)議,是一種面向消息中間件設(shè)計的簡單文本協(xié)議。傳感器節(jié)點程序流程如圖 2 所示。
圖 2 傳感器節(jié)點程序流程圖
3.2 網(wǎng)關(guān) JMS插件實現(xiàn)
Kura 雖然內(nèi)置了大量支持物聯(lián)網(wǎng)功能的服務(wù),但并未直接提供對JMS 的支持。Kura 基于 OSGi 技術(shù)實現(xiàn),用戶可以基于 OSGi 的動態(tài)化插件技術(shù)構(gòu)建自己的功能插件。為了在網(wǎng)關(guān)實現(xiàn) JMS 客戶端功能,需要做如下兩方面工作 :
(1) 安裝配置 JMS支持插件,OSGi 框架只能運行符合bundle規(guī)范的 Jar庫文件,JMS支持庫文件,以普通 Jar庫文件的形式提供,因此需要將 Jar文件轉(zhuǎn)變成 bundle插件。
(2) 設(shè)計可提供 JMS服務(wù)的 bundle,其實質(zhì)是封裝 JMS客戶端的具體實現(xiàn),以服務(wù)的形式發(fā)布接口,供其他 bundle調(diào)用,這部分是系統(tǒng)設(shè)計的核心內(nèi)容。
bundle 之間通過服務(wù)的方式關(guān)聯(lián),可以降低 bundle 之間的耦合,有利于軟件重用,并提高其靈活性。在發(fā)布或使用bundle 前,首先需要注冊和獲取 bundle 所提供的服務(wù)。服務(wù)的注冊和獲取主要包括如下兩種方式 :
(1) 通過編碼的方式在 bundle激活器中完成 ;
(2) 使用聲明式服務(wù)的方式管理 bundle,由組件配置文件定義 bundle的服務(wù)接口以及插件倚賴。
相對于第一種方式,第二種方式具有更大的靈活性。本系統(tǒng)對插件的管理使用第二種方式,聲明式服務(wù)可以保證在服務(wù)接口不變的情況下,根據(jù)需要動態(tài)配置、升級、替換bundle,并在服務(wù)切換過程中無需重啟系統(tǒng),實現(xiàn)“熱插拔”。
在系統(tǒng)設(shè)計過程中,基于 Kura 框架設(shè)計實現(xiàn)了多個bundle 對原有服務(wù)進行擴展,包括 JMS 服務(wù) bundle(JMS Service)、服務(wù)實現(xiàn) bundle(JMS Service Implement)和 JMS服務(wù)支持 bundle(JMS bundle)。JMS Service 提供框架級別的服務(wù),該服務(wù)注冊后可被其他 bundle 使用。JMS Service Implement 提供具體的服務(wù)實現(xiàn),將接口與實現(xiàn)分離,對其他插件隱藏了服務(wù)實現(xiàn)的細節(jié),符合 OSGi 對模塊動態(tài)性和松耦合的要求。網(wǎng)關(guān)擴展 bundle 之間的依賴關(guān)系如圖 3 所示。
不依賴框架的任何 bundle,是一個完全獨立的 bundle,它可以根據(jù)需要向外發(fā)布軟件包,供其他 bundle 進行功能調(diào)用。
以上三個 bundle 使用 OSGi 機制管理 bundle 的生命周期,實現(xiàn)服務(wù)的注冊和發(fā)布。JMS Service Implement 和 JMS Service bundle 還需要使用 Kura 框架提供的底層服務(wù),如通過事件機制與其他 bundle 通信。
4 系統(tǒng)功能測試
系統(tǒng)測試環(huán)境包含兩塊樹莓派 3B 開發(fā)板,板上運行Raspbian 操作系統(tǒng),分別作為數(shù)據(jù)采集節(jié)點和網(wǎng)關(guān),網(wǎng)關(guān)運行Apache ActiveMQ 5.13.0 消息中間件和網(wǎng)關(guān)管理軟件 Kura3.1,系統(tǒng)工作在 Internet 和 WiFi 網(wǎng)絡(luò)環(huán)境。測試環(huán)境硬件連接如圖 4 所示。
數(shù)據(jù)采集節(jié)點以 10 s 為周期采集環(huán)境的溫度數(shù)據(jù),并以消息的形式發(fā)送到特定的主題或消息隊列中。網(wǎng)關(guān)節(jié)點啟動服務(wù)器消息中間件 ActiveMQ 和 Kura 管理軟件后,ActiveMQ將來自傳感器節(jié)點的消息保存在隊列中,Kura 的功能擴展插件讀取消息隊列消息,并由其他插件對數(shù)據(jù)進行分析處理。測試結(jié)果表明,系統(tǒng)實現(xiàn)了不同節(jié)點之間異構(gòu)應(yīng)用的集成。
5 結(jié) 語
本文使用消息中間件實現(xiàn)了物聯(lián)網(wǎng)系統(tǒng)的異構(gòu)集成,重點對 Kura 的服務(wù)功能進行了擴展,設(shè)計實現(xiàn)了面向服務(wù)的JMS bunble,部署到 OSGi 框架之上,使 Kura支持 JMS 消息通信。實驗結(jié)果表明,消息集成模式可以簡單有效地實現(xiàn)物聯(lián)網(wǎng)應(yīng)用系統(tǒng)的異構(gòu)集成,在保持原有節(jié)點功能不變的情況下,只需添加 JMS 功能模塊即可可靠地實現(xiàn)數(shù)據(jù)通信。但由于消息通信的時間延遲,只能在非實時的場景下應(yīng)用。