周时伟 , 谢维波
(1.华侨大学 计算机科学与技术学院,福建 厦门361021;2.华侨大学 厦门软件园嵌入式技术开发实验室,福建 厦门361008)
自2007年Google推出开源手机操作系统Android以来,Android的应用开发一时间风靡全球,各高科技领域应用都在向Android进军。Android的盛行取决于其独特的优势。首先,Android是一款基于Linux内核的开源系统,它具有操作系统、中间件和关键应用程序。对第三方应用开发完全开放、人员具有较大的自由度[1]。其次,Android应用程序的开发采用Java语言,通过应用框架层提供的API,开发简单、周期短。第三,Android具有很强的开放性和灵活性。虽然现在市场上已经出现各种各样的智能家居终端,但Android的出现及其广泛应用,使得很多智能家居厂商正投入很大的人力物力进行研究开发基于Android的智能家居终端。
Android是一个包括操作系统、中间件和关键应用程序的移动设备软件堆。其作为一个开发式的系统平台,包含了众多的功能和庞大的基于Linux的代码,在用户空间又分为本地代码(C/C++)和 Java代码。Android系统可以分为以下各层次:
自底向上依次为Linux操作系统及其驱动层、本地代码框架和Java虚拟机层、Java框架层和Java应用程序层[2]。在各层之间存在相应的分界线接口。如图1所示。
作为开放式的系统,Android提供了丰富的组件和视图控件。大部分的开发只需要调用Android应用框架层提供的API就可以方便地完成,并且在Android的SDK中提供了丰富的实例供参考学习,使得应用开发简单易行。Android各层次的功能如表1所示。
表1 Android各层次功能
一个程序可以调用另外一个程序的程序片段。这是Android程序框架的基本设计理念。例如,在Windows操作系统中,资源管理器可以浏览图片文件,当浏览到这个图片文件时,双击该图片文件,便启动图片浏览软件。Android的程序理念便是如此,所不同的是,在 Windows中,打开图片会启动图片浏览软件的全部功能,虽然实际上只是需要查看图片;Android中是把一个程序的功能分为各种不同的程序片段,每个程序片段都能单独启动。
Android 应 用 程 序 由 Activity、Service、Broadcast Receiver和Content Provider四大组件构成。这四大组件也称为Android的四种类型的程序片段,且每种类型都可以独立运行。
Activity在四大组件中最复杂。从视觉上看,一个Activity占据当前的窗口,响应所有窗口事件,具有控件、菜单等界面元素,为用户提供一个与界面交互的平台。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的工作,还需要妥善管理生命周期和一些转跳逻辑。
Service就是剥离了界面的Activity,都是封装有一个完整的功能逻辑实现,只不过Service不抛头露脸,默默提供后台服务。举例,当用户处理其他问题时,服务可以播放背景音乐,或者可以从网上获取数据、计算、提高,提供给活动所需要的结果。
Broadcast Receiver只能接收广播,一个广播可以有很多广播接收器对它认为重要的通知作出反应。Android系统提供了一个 sendBroadcast()方法,Application Framework内部调用该方法发送广播,比如有新短信息、有来电等广播消息,Broadcast Receiver会响应这些系统消息的独立执行单元[4]。
Content Provider提供了一套特殊的可供其他应用使用的数据。这些数据可以存储在文件系统中、SQLite数据库中或者其他有意义的形式。实现了一套标准的允许其他用户检索、储存数据的方法。通过使用Content-Provider的实例,调用它的方法。
Intent是Android中一个特殊的类,组件之间的通讯,由Intent协助完成。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent在这里起着实现调用者与被调用者之间的解耦作用,如图2所示。
智能家居终端的主要功能如下[5]:
(1)可视对讲。室内机与门口机进行可视对讲;室内机可以监视门口情况;访客留影;两个或多个室内机进行视频对话。
(2)家居安防。防区设定:对室内和室外安装的监视器进行独立的设定;报警:监视器侦测到异常发出报警;家居安防模式设定:外出、在家、就寝等。
(3)家居控制。灯光控制;窗帘控制;空调控制;电源控制;燃气阀控制;电梯控制。
(4)生活资讯。天气预报;万年历;常用电话;物业服务。
(5)系统管理。常用设置;使用说明;安防设置;家居设置。
系统结构功能如图3所示。
整个软件系统架构分为四个层次,每个层次的功能分别如下:
(1)操作系统层。对下为各种硬件设备提供外围设备驱动,控制硬件工作,如音视频的采集播放设备、各类传感器、摄像头等;对上为库函数提供各种设备的驱动接口,以使得上层可以调用设备。
(2)库和接口层。该主要提供给应用框架层一些基本的类库和接口,包括Android的C/C++库、RTP/RTCP库和多媒体的处理接口。
(3)应用框架层。该层采用模块化开发方法,通过使用其下层的函数库提供的接口,将实现相同或相似功能的封装成为一个模块进而供应用层来开发使用。
(4)应用层。通过与应用框架层提供的模块相互交互、资源分配等,基于Android的四大组件及其他相关视图控件完成界面设计,为用户提供一个可视的界面平台。在该软件架构下,涉及到的功能模块有信号处理模块、网络管理模块、媒体流管理模块以及信息存取模块。
2.3.1 主控制模块
最上层为主控制模块,是系统的主要模块,通过使用Android的各种组件和控件,在应用层实现系统的主要功能。一方面,通过 Android的资源文件如布局、菜单、视图等提供的各种类和方法来完成系统的GUI设计,提供给用户一个统一的图形化接口给用户。另一方面,通过使用应用框架中的信号处理、网络管理、媒体流管理、信息存储等功能模块接口,分别实现门磁控制、家居安防、家居控制、生活资讯、可视对讲及系统管理的功能。在此模块中的门磁控制可以直接控制房门的开关[6]。
所有的功能都聚集在主模块中,这就需要一个合理的布局才能使系统使用起来比较协调。由于每个Activity中包含一个Window,每个Window中包含一个View Group,而每个View Group中包含更多的View和View Group。在主模块中的布局如图4所示。
2.3.2 信号处理模块
信号处理模块是为实现家居安防和家居控制来提供服务的。主要是接收一些传感器信息,然后针对各种传感器做出相应的处理,或者是将内部命令发送给各个外围传感器。在Android操作系统中内置了很多传感器,在部分软件中可以自动识别屏幕的横屏、竖屏方向来改变屏幕显示布局。下面是Android支持的几种传感器:
SENSOR_TYPE_LIGHT:亮度传感器;
SENSOR_TYPE_PRESSURE:压力传感器;
SENSOR_TYPE_TEMPERATURE:温度传感器;
SENSOR_TYPE_ORIETATION:方向传感器。
这些传感器都为应用程序提供了API,通过API的调用就可以方便地实现各种需求,如温度超过某一值时自动报警等。对于烟雾传感器等外围设备送来的信号,在系统中把Message交付给相应的Handler处理,输出最终结果。
如果需要使用一些外围设备如关闭电视、空调等家用电器,在系统可以触发一个信号,经由Handler处理之后发送到相应的智能设备。消息处理过程如图5所示。
2.3.3 网络管理模块
网络管理模块主要为生活资讯提供服务。此模块提供服务的分为两种。一种为局域网服务,如物业服务。这里实现起来比较简单,用户根据系统所提供的设备名称向中心管理机报备需要服务的设备。例如:点击某个设备,终端向中心管理机发送一条“智能设备需要服务”指令。物业收到该指令后,会主动联系该用户。另一种为Intenet服务,需要提供各种信息的Web服务,如天气。
2.3.4 媒体流管理模块
媒体流管理模块是为可视对讲提供服务的。在系统中通过调用Android的OpenCORE接口来实现音视频的编解码。OpenCORE是Android多媒体框架的核心,所有Android平台的音频、视频的采集以及播放等操作都是通过它来实现的。它主要包含了两个大方面的内容:
PVPlayer:提供媒体播放器的功能,完成各种音频、视频流的回放功能。
PVAuthor:提供媒体流记录的功能,完成各种音频、视频流以及静态图像的捕获功能。
当门口机需与室内机请求对讲时,室内机只需要对门口机传输过来的音视频进行解码播放,即Android调用MediaPlayer类用来播放音频、视频。
当两个室内机进行视频对讲时,双方机器要同时进行音视频的编码解码。这时就要同时调用MediaPlayer类和MediaRecorder类。MediaRecorder类用来进行媒体采样,包括音频和视频。
2.3.5 信息存取模块
信息存取模块主要为系统管理提供开发接口以实现对系统的管理。如智能家居系统的终端系统管理模块主要提供本机设置、安防设置、家居设置、使用帮助等功能。本机设置包括本机的网络设置、楼栋单元号房间号设置、密码设置等;安防设置可以对室内的各个安防设备进行布防和撤防设置;家居设置则可以调整家用电器的断电或启动时间;使用帮助则是关于本机的使用说明。设置的一般过程为先通过相应的get方法获得要设置的状态,然后通过set方法保存设置。
本文开发是按照Android开发规范进行,应用层使用Java语言,在底层的一些本地库和接口开发过程中,考虑到代码的使用效率及开发的简易性,采用了JNI,是由C/C++语言实现的。如图6为实现效果图。
整个系统充分利用了Android内部资源,极大地提高了开发效率。测试结果表明系统的稳定性极高,具有较强的实用性。
[1]邵长彬,张重阳,郑世宝.基于 Android的可视 IP电话多媒体终端设计与实现[J].电视技术,2011,3(6):62-65.
[2]柯元旦,宋锐.Android程序设计[M].北京:北京航空航天大学出版社,2010:12-35.
[3]尹浩,陈美銮,黎飘.基于 FPSLIC的网络家居终端系统的设计与实现[J].计算机工程与设计,2006,27(8):1442-1445.
[4]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2009:188-219.
[5]金鑫.基于ARM-Linux的智能家居网络终端的设计与实现[J].电脑知识与技术,2010,6(7):1612-1618.
[6]宋小青,周东升.基于Android平台的应用开发研究[J].软件导刊,2011,10(2):104-106.