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