3 服务网关的实现
OSGi服务框架利用Java的平台独立和动态代码装载特性,可以更容易地开发和动态配置小内存设备的应用程序。它运行于Java虚拟机上,而各种各样的应用服务则运行于具体的OSGi服务框架软件之上。
根据图3的层次结构,需要解决3方面问题:
1)在JVM之上实现OSGi服务框架;
2)对于每个具体的设备,提供将设备服务封装成Bundle并发布的技术;
3)设备的灵活接入。
3.1 OSGi服务框架——equinox
利用eclipse的equinox实现的OSGi框架,它安装在JVM之上,是与OSGi release 3兼容的OSGi服务框架的一个实现。它提供了各种服务的执行环境,并提供一组核心服务集,负责所有服务的生命期管理,注册等功能。
3.2 设备服务的封装——Bundle的设计
OSGi兼容的具体设备通过各种本地总线(如Ethenet,Bluetooth,Lonworks,无线等)接入家庭网关,具有不同的硬件特性,只有将设备相关的服务打包成Bundle后,由服务提供商发布,家庭网关从服务提供商下载、安装并注册后,才能使用设备相应的服务,从而满足灵活接入的要求。
3.3 设备的灵活接入
服务框架中的设备管理器模块负责对接入的设备进行管理,接受服务的注册、更改和注销,这个过程对用户是透明的:设备管理器检测到某些设备服务被注册到服务网关后,利用驱动定位器服务或驱动选择器服务查找与这些服务最匹配的驱动服务,建立关联关系。如果所需的驱动服务还不存在,设备管理器会自动查找、安装并启动驱动服务对应的Bundle。若找不到,则该设备服务就处于闲置(idle)状态。
在这里,设备服务反映了设备的某一方面特性,一般可以映射到某个硬件设备,也可以体现设备在不同的抽象层上的特性,提供某个功能。它要么从属于某个特定的设备类别,要么就是通用型的。设备类别给出了这类服务必须实现的接口,即与设备服务通信的方法,以允许基于相同底层技术(如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方法得到服务对象。
在此基础上开发了多个场景应用程序,下面以室内光强亮度环境调节应用和红外无线自动报警为例,说明相应Bundle的开发方法。