基于OSGI的智能家庭系統(tǒng)的設(shè)計與實現(xiàn)
3 服務(wù)網(wǎng)關(guān)的實現(xiàn)
OSGi服務(wù)框架利用Java的平臺獨立和動態(tài)代碼裝載特性,可以更容易地開發(fā)和動態(tài)配置小內(nèi)存設(shè)備的應(yīng)用程序。它運行于Java虛擬機上,而各種各樣的應(yīng)用服務(wù)則運行于具體的OSGi服務(wù)框架軟件之上。
根據(jù)圖3的層次結(jié)構(gòu),需要解決3方面問題:本文引用地址:http://m.butianyuan.cn/article/161671.htm
1)在JVM之上實現(xiàn)OSGi服務(wù)框架;
2)對于每個具體的設(shè)備,提供將設(shè)備服務(wù)封裝成Bundle并發(fā)布的技術(shù);
3)設(shè)備的靈活接入。
3.1 OSGi服務(wù)框架——equinox
利用eclipse的equinox實現(xiàn)的OSGi框架,它安裝在JVM之上,是與OSGi release 3兼容的OSGi服務(wù)框架的一個實現(xiàn)。它提供了各種服務(wù)的執(zhí)行環(huán)境,并提供一組核心服務(wù)集,負責(zé)所有服務(wù)的生命期管理,注冊等功能。
3.2 設(shè)備服務(wù)的封裝——Bundle的設(shè)計
OSGi兼容的具體設(shè)備通過各種本地總線(如Ethenet,Bluetooth,Lonworks,無線等)接入家庭網(wǎng)關(guān),具有不同的硬件特性,只有將設(shè)備相關(guān)的服務(wù)打包成Bundle后,由服務(wù)提供商發(fā)布,家庭網(wǎng)關(guān)從服務(wù)提供商下載、安裝并注冊后,才能使用設(shè)備相應(yīng)的服務(wù),從而滿足靈活接入的要求。
3.3 設(shè)備的靈活接入
服務(wù)框架中的設(shè)備管理器模塊負責(zé)對接入的設(shè)備進行管理,接受服務(wù)的注冊、更改和注銷,這個過程對用戶是透明的:設(shè)備管理器檢測到某些設(shè)備服務(wù)被注冊到服務(wù)網(wǎng)關(guān)后,利用驅(qū)動定位器服務(wù)或驅(qū)動選擇器服務(wù)查找與這些服務(wù)最匹配的驅(qū)動服務(wù),建立關(guān)聯(lián)關(guān)系。如果所需的驅(qū)動服務(wù)還不存在,設(shè)備管理器會自動查找、安裝并啟動驅(qū)動服務(wù)對應(yīng)的Bundle。若找不到,則該設(shè)備服務(wù)就處于閑置(idle)狀態(tài)。
在這里,設(shè)備服務(wù)反映了設(shè)備的某一方面特性,一般可以映射到某個硬件設(shè)備,也可以體現(xiàn)設(shè)備在不同的抽象層上的特性,提供某個功能。它要么從屬于某個特定的設(shè)備類別,要么就是通用型的。設(shè)備類別給出了這類服務(wù)必須實現(xiàn)的接口,即與設(shè)備服務(wù)通信的方法,以允許基于相同底層技術(shù)(如Lonworks,IEEE1394,Jini)的Bundle間進行互操作。驅(qū)動服務(wù)負責(zé)完成實際的底層通信,控制硬件設(shè)備。因此,對每個具體的設(shè)備,至少要有兩個Bundle:DeviceBundle和Driver Bundle,對于同一類的設(shè)備可以連接到相同的Driver Bundle上。
4 設(shè)備封裝——Bundle的具體實現(xiàn)
在OSGI平臺上,服務(wù)是由一個iava Interface來定義的。Bundle可以實現(xiàn)這個接口并且把服務(wù)注冊到服務(wù)注冊表中去,并且OSGI框架管理Bundle的安裝和更新,同時管理Bundle和服務(wù)直接的關(guān)系。
在這里,設(shè)備服務(wù)的Bundle設(shè)計流程如下:
1)編寫服務(wù)接口及對應(yīng)的Java類實現(xiàn);
2)實現(xiàn)相應(yīng)的BundleAetivator和ServiceListener接口。這是兩個必須實現(xiàn)的特殊接口。其中BundleActivator接口包含start和stop兩個方法,start方法注冊服務(wù)和資源,而stop取消注冊,start類似于普通Java類中的public main函數(shù);
3)編寫一個manifest文件描述該JAR文件的內(nèi)容;
4)將上述的所有接口、Java類、manifest文件以及其他資源文件打包成一個JAR文件;
5)在需要時將該Bundle安裝到OSGi服務(wù)網(wǎng)關(guān),完成注冊。如果要獲取由其他Bundle提供的某個服務(wù),可以從該Bundle對應(yīng)的Bundle Con-text對象調(diào)用getServieeReference方法來獲得特定服務(wù)的引用,然后就可以以該引用為參數(shù)調(diào)用getService方法得到服務(wù)對象。
在此基礎(chǔ)上開發(fā)了多個場景應(yīng)用程序,下面以室內(nèi)光強亮度環(huán)境調(diào)節(jié)應(yīng)用和紅外無線自動報警為例,說明相應(yīng)Bundle的開發(fā)方法。
評論