李松濤,尹清爽
(河南工程學院 計算機學院,河南 鄭州 451191)
物聯網應用系統是一個復雜的分布式系統,系統通常由數據采集節點、執行器節點和網關組成,不同功能節點之間可以使用ZigBee,BLE等通信協議實現數據通信。通常情況下,這些協議的實現要求所有節點使用同一種開發環境,部署在同一款軟件框架上,在實際應用中,更多的是對原有系統的擴展或者是在原有系統之上再疊加一層新系統。用戶更關注如何復用已有的軟硬件資源,以減少開發周期并降低成本。原有節點可能由不同的開發語言實現,運行在不同的框架和平臺之上。如何在不同的模塊、平臺和應用之間進行數據通信是實際應用過程中亟待解決的問題。消息中間件是解決企業應用系統異構集成的一種有效方法[1-2],這種方法也同樣適用于物聯網[3]。物聯網中的分布式節點本身就是一個小型的嵌入式系統,其硬件配置足以支持其上運行嵌入式操作系統和服務管理軟件,從而為基于消息的異構系統集成在物聯網節點上的實現提供了可能。
本文對基于消息中間件的物聯網應用異構系統集成進行了探索,并在環境監控系統中對設計方案進行了驗證。傳感器節點和網關分別使用不同的開發語言和客戶端軟件,傳感器節點采用Python開發,網關使用基于OSGi框架的插件技術,對網關管理軟件Kura的服務進行擴展,使其支持JMS(Java Message Service,JMS)。借助部署在網關的ActiveMQ消息中間件,實現了在不同節點之間通過消息機制進行數據通信的目的。
Kura是Eclipse基金會發布的物聯網項目,用于構建IoT網關框架,它提供了一種使用開源硬件作為網關的方式。Kura內部嵌入了多種對網關容器進行管理的服務,包括UI Web管理界面以及支持Amazon AWS IoT,Microsoft Azure IoT和IBM IoT云服務的接口[4]。Kura運行在Java虛擬機(JVM)上,使用模塊化OSGi(Open Service Gateway Initiative,OSGi)技術實現。由于網關基于動態可插拔的模塊化技術實現,因此用戶可以很方便地創建自己的功能插件,并集成到系統中實現網關功能的擴展[5-6]。Kura遵循OSGi R4規范,其核心設計思想是面向服務的組件模型。在OSGi中,組件或模塊稱為bundle,OSGi支持軟件熱插拔、多版本并存,具有動態模塊化、面向服務架構和模塊擴展等功能,OSGi的模塊擴展功能可以在不改變原有模塊代碼的情況下注入新的功能或更新原有功能[7]。
消息中間件基于消息驅動方式,為異構系統和平臺提供了一種高效、可靠的數據通信服務[8]。ActiveMQ是被廣泛使用的基于JMS規范的開源消息中間件,它屏蔽了底層軟件框架和硬件的差異,具有部署簡單、占用資源少、運行可靠等特點。消息中間件不僅簡化了在物聯網環境下異構應用的集成,也提供了一種構建松耦合系統的方式。
系統由傳感器節點和網關構成,在局域網內采用分布式部署,節點之間通過消息進行數據通信,系統架構如圖1所示。

圖1 系統架構
傳感器節點采集現場數據后,將傳感器數據封裝到消息負載中,并通過設計開發的ActiveMQ客戶端軟件將消息發送到網關。網關采用Kura框架對軟硬件資源進行管理,與傳感器節點的硬件運行平臺相同,它們運行在開源硬件樹莓派(Raspberry Pi)之上。網關不具有數據采集功能,但具有更多的數據處理和網絡管理功能。系統需要在網關中部署ActiveMQ消息中間件,用于JMS消息管理。由于Kura框架本身不支持JMS服務,無法實現與消息中間件的消息通信,因此,需要設計新的bundle對Kura網關框架進行JMS消息功能擴展,使其支持對JMS消息的訂閱/發布服務。網關既可以利用消息機制接收來自傳感器節點的數據,也可對數據進行格式轉換、分析,并通過MQTT協議與云端相連。
基于JMS消息的通信機制可以屏蔽通信雙方的具體技術實現細節,以統一的消息協議通過第三方消息中間件實現通信,并可以實現一對一、一對多等不同形式的消息通信模式。傳感器節點可以在不同的主題上發布消息,也可以多個節點在同一主題上發布,滿足了系統集成的松耦合和靈活性要求。
系統中節點硬件平臺均選用開源硬件樹莓派開發板,其上可運行Linux或Win10操作系統,開發板搭載1.2 GHz的64位ARM處理器,板上集成802.11 b/g/n無線網卡和低功耗藍牙4.1適配器。為連接外部設備,樹莓派上配置有40個GPIO引腳,支持SPI,I2C以及Serial等接口和總線標準,豐富的軟硬件資源可保證其不僅可作為數據采集終端,也可作為物聯網系統的小型網關。
傳感器節點通過GPIO接口連接溫濕度傳感器DHT11。數據采集程序使用Python開發,獲取數字量的環境溫、濕度數據,然后調用STOMP(Streaming Text Orientated Message Protocol,STOMP)庫函數將數據封裝為JMS消息發送到網關。STOMP即流文本定向消息協議,是一種面向消息中間件設計的簡單文本協議。傳感器節點程序流程如圖2所示。

圖2 傳感器節點程序流程圖
Kura雖然內置了大量支持物聯網功能的服務,但并未直接提供對JMS的支持。Kura基于OSGi技術實現,用戶可以基于OSGi的動態化插件技術構建自己的功能插件。為了在網關實現JMS客戶端功能,需要做如下兩方面工作:
(1)安裝配置JMS支持插件,OSGi框架只能運行符合bundle規范的Jar庫文件,JMS支持庫文件,以普通Jar庫文件的形式提供,因此需要將Jar文件轉變成bundle插件。
(2)設計可提供JMS服務的bundle,其實質是封裝JMS客戶端的具體實現,以服務的形式發布接口,供其他bundle調用,這部分是系統設計的核心內容。
bundle之間通過服務的方式關聯,可以降低bundle之間的耦合,有利于軟件重用,并提高其靈活性。在發布或使用bundle前,首先需要注冊和獲取bundle所提供的服務。服務的注冊和獲取主要包括如下兩種方式:
(1)通過編碼的方式在bundle激活器中完成;
(2)使用聲明式服務的方式管理bundle,由組件配置文件定義bundle的服務接口以及插件倚賴。
相對于第一種方式,第二種方式具有更大的靈活性。本系統對插件的管理使用第二種方式,聲明式服務可以保證在服務接口不變的情況下,根據需要動態配置、升級、替換bundle,并在服務切換過程中無需重啟系統,實現“熱插拔”。
在系統設計過程中,基于Kura框架設計實現了多個bundle對原有服務進行擴展,包括JMS服務bundle(JMS Service)、服務實現bundle(JMS Service Implement)和JMS服務支持bundle(JMS bundle)。JMS Service提供框架級別的服務,該服務注冊后可被其他bundle使用。JMS Service Implement提供具體的服務實現,將接口與實現分離,對其他插件隱藏了服務實現的細節,符合OSGi對模塊動態性和松耦合的要求。網關擴展bundle之間的依賴關系如圖3所示。

圖3 網關擴展bundle之間的依賴關系
JMS bundle封裝與ActiveMQ通信的基礎類,該bundle不依賴框架的任何bundle,是一個完全獨立的bundle,它可以根據需要向外發布軟件包,供其他bundle進行功能調用。
以上三個bundle使用OSGi機制管理bundle的生命周期,實現服務的注冊和發布。JMS Service Implement和JMS Service bundle還需要使用Kura框架提供的底層服務,如通過事件機制與其他bundle通信。
系統測試環境包含兩塊樹莓派3B開發板,板上運行Raspbian操作系統,分別作為數據采集節點和網關,網關運行Apache ActiveMQ 5.13.0消息中間件和網關管理軟件Kura3.1,系統工作在Internet和WiFi網絡環境。測試環境硬件連接如圖4所示。
數據采集節點以10 s為周期采集環境的溫度數據,并以消息的形式發送到特定的主題或消息隊列中。網關節點啟動服務器消息中間件ActiveMQ和Kura管理軟件后,ActiveMQ將來自傳感器節點的消息保存在隊列中,Kura的功能擴展插件讀取消息隊列消息,并由其他插件對數據進行分析處理。測試結果表明,系統實現了不同節點之間異構應用的集成。

圖4 測試環境硬件連接
本文使用消息中間件實現了物聯網系統的異構集成,重點對Kura的服務功能進行了擴展,設計實現了面向服務的JMS bunble,部署到OSGi框架之上,使Kura支持JMS消息通信。實驗結果表明,消息集成模式可以簡單有效地實現物聯網應用系統的異構集成,在保持原有節點功能不變的情況下,只需添加JMS功能模塊即可可靠地實現數據通信。但由于消息通信的時間延遲,只能在非實時的場景下應用。