基于Android 的物联网移动感知服务平台

时间:2022-06-03 08:45:03

基于Android 的物联网移动感知服务平台

摘要:针对稀疏网络场景造成的感知空洞问题,引入基于智能终端的移动感知服务概念,解决目标区域的感知服务盲区问题,提高感知服务质量。首先,分析移动感知的技术难点,介绍系统的整体框架;其次,针对感知信息的实时获取,在Android平台上编程实现了移动设备交互记录、各种内嵌传感器信息和设备GPS地理位置等感知信息的采集;最后,搭建了用于应用程序开发的编程环境并设置了Android模拟器,实现系统相关核心技术。该项目的研究成果对于提高感知效率,提升感知服务的可靠性具有重要的理论和现实意义。

关键词:物联网;信息采集;移动感知;Android系统;服务质量;

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)04-0925-05

The Mobile-aware Service Platform Based on Android System in Internet of Things

WANG Ming-xiao

(No.631 Research Institute, Aviation Industry Corporation of China, Xi’an 710049,China)

Abstract:Aimed at the cavity problem of perception in sparse network, we introduces the concept of mobile-aware services based on Android system, to realize the perception services in the blind target area and improve the perception of quality of service of Things. Firstly, we analyze the difficulties in mobile-awareness, and introduce the total system framework. Then, by introducing and learning application software development knowledge and technology based on the Android system, we program the application software on the Android platform to realize the functions of collecting the interactive record, variety of embedded sensor information and GPS location information of devices. Finally, the programming environment and simulator is built to realize the related core technologies. The research results of this project have important theoretical and practical significance for improving the node selection and found speed of the perceived service in the target area and enhancing the reliability of perception service.

Key words: Internet of Things; information collecting; mobile-awareness; Android; the quality of service

随着传感技术、嵌入式技术、无线通信技术、高性能计算等相关领域的迅猛发展,“物联网”(Internet of Things)作为新一代的智能互联网络应运而生,而且已经成为新一代信息技术的重要组成部分,被称为是继计算机、互联网以及电信网之后的第三次世界信息浪潮。

由于物联网的感知区域更广泛,受到资金、环境因素、地理特点、后期维护等因素的影响,不可能像传统传感器网络那样部署大量的冗余节点,而应该是一个广泛分布且感知节点又相对稀疏的网络。稀疏网络虽然具有节约资金、便于维护等特点,但必然会造成感知空洞,在降低成本的同时严重的损害了物联网的感知服务质量。因此,如何解决感知空洞问题,将成为物联网感知研究面临的新问题。

因此,课题组利用移动设备中常用的Android平台,构建一个移动感知框架,通过对收集和获取节点各种感知信息,为提升稀疏网络中的感知覆盖范围,减少感知空洞,提高感知服务质量提供帮助。

1 Android开发平台

Android系统结构从上到依次为:应用程序层、应用程序框架层、系统运行库层、Linux核心层。最底层是Linux内核,Android的核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议和驱动模型。Linux内核也同时作为硬件和软件栈之间的抽象层。开发人员可以完全访问核心应用程序所使用的API框架。这种架构设计简化了组件的重用,每一个应用程序都可以它的功能块并且任何其它的应用程序都可以使用这些功能块,这种应用程序重用机制使用户可以方便的替换程序组件。在系统架构图中可以清晰展示,如图1所示。

Android的核心功能之一就是一个应用程序可以使用其它应用程序的元素。你的应用程序并没有吸纳或链接其它应用程序的代码,它只是在有需求的时候启动了其它应用程序的那个功能部分。为达到这个目的,系统必须在一个应用程序的一部分被需要时启动这个应用程序,并将那个部分的Java对象实例化。与在其它系统上的应用程序不同,Android应用程序没有为应用准备一个单独的程序入口(比如说,没有main()方法), 而是为系统依照需求实例化提供了基本的组件。共有四种组件类型:Activity, Service, Broadcast Receiver和Content Provider。

1.1 Activity

Activity是为用户操作而展示的可视化用户界面。一个应用程序可以只有一个activity,也可以包含很多个。每个activity的作用,以及其数目,自然取决于应用程序及其设计。一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的。从一个activity转向另一个的方式是用当前的activity启动下一个。

窗口显示的可视内容是由一系列视图构成的,这些视图均继承自View基类。每个视图均控制着窗口中一块特定的矩形空间。父级视图包含并组织它子视图的布局。叶节点视图(位于视图层次最底端)在它们控制的矩形中进行绘制,并对用户对其直接操作做出响应。所以,视图是activity与用户进行交互的界面。比如说,视图可以显示一个小图片,并在用户指点它的时候产生动作。Android有很多既定的视图供用户直接使用,包括按钮、文本域、卷轴、菜单项、复选框等等。

1.2 Service

服务没有可视化的用户界面,而是在一段时间内在后台运行。比如说,一个服务可以在用户做其它事情的时候在后台播放背景音乐、从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的activity使用。每个服务都继承自Service基类。

你可以连接至(绑定)一个正在运行的服务(如果服务没有运行,则启动之)。连接之后,你可以通过那个服务暴露出来的接口与服务进行通讯。对于音乐服务来说,这个接口可以允许用户暂停、回退、停止以及重新开始播放。

1.3 Broadcast Receiver

广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的,比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自Broadcast Receiver基类。广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用Notification Manager来通知用户。通知可以用很多种方式来吸引用户的注意力—闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

1.4 Content Provider

内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于Content Provider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 Content Resolver 对象,调用它的方法作为替代。Content Resolver可以与任意的内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

每当出现一个需要被特定组件处理的请求时,Android会确保那个组件的应用程序进程处于运行状态,或在必要的时候启动它。并确保那个相应组件的实例的存在,必要时会创建那个实例。

2 系统框架

本文研究工作主要针对于物联网移动感知服务体系,着力研究手机客户端中基于Android平台的有关传感信息及节点间交互记录等信息的提取等部分,从而为以后的感知服务的提供、传递链路的选择等工作提供基础。系统框架如图2所示。移动端主要实现了各种感知信息的实时获取,例如内嵌传感器信息、通话记录、GPS信息等,这些数据都将为最终的移动感知服务实现提供数据源。

图2 系统整体方案

Android开发平台的搭建,首先需要了解Android开发环境要素和层次架构。Android系统采用软件堆层(Software Stack,又名软件叠层)的架构,主要分为三部分。底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分;其次,通过官方的开发文档学习Eclipse、JDK、ADT等插件功能,配置合理的环境变量;最终构建适合本应用场景的Android模拟器,为下一步的程序开发提供基础。搭建完成后的模拟开发器平台界面如图3示:

图3 Android开发模拟器

3 基于Android客户端实现

Android系统中应用软件的设计采用了组件开发模式,每个应用程序由不同功能的组件搭建起来。所以我们在软件设计中,将调用一个Activity组件,设计成为登陆界面,Activity组建的实现要通过重写其中的onCreat()方法来设计我们需要的功能。登陆界面主要起引导作用,在此登陆界面中可以通过不同按钮来选择启动各项功能进入其相应的操作界面,其中每个主要功能也分别用一个Activity组建实现,通过设置相应的点击事件监听器来响应每一次按钮的的点击动作,这样当点击相应按钮即可在登陆界面中通过实现多个事件唤醒机制intent来启动相应功能,跳转到相应的业务流程中去,而相应各部分主要的功能界面中也设计了返回按钮,当完成相应功能后用户可以点击选择返回主界面,进行其他操作。

3.1 登录界面的实现

为了响应按钮点击事件,我们需要对于每个按钮都设置一个点击事件监听器,其设置方式如下:

button.setOnClickListener(new Button.OnClickListener(){

public void onClick(View V){}

});

通过实现其中的public void onClick(View V)方法就可以实现对点击时间的响应做出相应的动作。

由于每一部分都实现了一个单独的Activity组件,所以当我们点击按钮时所需要做的动作是激活相应的组件转入到其业务流程中去。在Android应用程序设计中Activity组件需要被一种叫做intent的异步消息所激活。intent是一个保存着消息内容的Intent对象。对于Activity来说,它指明了请求的操作名称以及作为操作对象的数据的URI和其它一些信息。具体的实现方法如下:

Intent contact = new Intent();

contact.setClass(MyAndroidActivity.this,Activity1.class);

startActivity(Activity1);

首先声明了一个intent,然后指定Activity组件之间的调用关系,最后一句用来启动相应的组件来转入相应的功能流程。在前面设置的的点击事件监听器中的public void onClick(View V)方法中,实现对intent的声明和调用即可实现按键点击时自动切换组件转入相应功能界面的功能,其实现如下:

Button.setOnClickListener(new Button.OnClickListener(){

public void onClick(View V){

Intent contact = new Intent();

contact.setClass(MyAndroidActivity.this,Activity1.class);

startActivity(Activity1);

}

});

3.2 传感信息的采集

传感器是一种物理装置,能够探测、感受外界的信号、物理条件(如光、热、湿度),并将探知的信息传递给其他装置或器官。Android操作系统提供了非常完整的感应监测管理功能,对于开发手机传感器应用,使用感应检测Sensor的API我们主要按照以下四个开发步骤来完成我们所需的各个传感器信息获取功能的实现:

取得SensorManager

使用感应检测Sensor首先要获取感应设备的检测信号,我们通过调用Sensor Manager的方法来取得感应检测的服务:

SensorManager manager= (SensorManager)getSystemService(SENSOR_SERVICE);

感应检测Sensor状态的监听功能

其主要依靠实现下列两个SensorEventListener方法来实现监听,并取得感应检测Sensor的状态:

public void onAccuracyChanged(Sensor sensor, int accuracy);

public void onSensorChanged(SensorEvent event);

onAccuracyChanged()方法在感应检测到Sensor的精密度有变化时会被调用到,而 onSensorChanged()方法在感应检测到Sensor的值有变化时会被调用到。

实现取得感应检测Sensor目标种类的值

实现下列getSensorList()方法来取得感应检测Sensor的值:

List sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);

注册感应检测Sensor状态的监听功能

已实现取得感应检测Sensor状态的监听功能,要注册到Android系统:

Public void registerListener(SensorEventListener listener, Sensor sensors, int rate);

3.3 通话记录的提取

在这部分的程序中我们要实现的主要功能是提取手机的通话记录,由于手机中都有可以查询的通话记录,因此,我们就可以通过上面提到的方法,访问相应的Content Provider查看通话记录信息。Android平台通话记录开发的API主要是android.provider.CallLog.Calls类,该类是CallLog的内部类。封装了通话记录信息和访问数据的URI,URI有:CONTENT_URI和CONTENT_FILTER_URI。CONTENT_URI是一个通用URI,而CONTENT_FILTER_URI是一个有条件过滤功能的URI。在我们的应用中将只会用到前者。

在具体的查询信息实现代码中,我们分析查询代码:

String[] columns = { CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME,CallLog.Calls.TYPE };

cursor = managedQuery(CallLog.Calls.CONTENT_URI, null, null, null,

CallLog.Calls.DEFAULT_SORT_ORDER);

发现这部分代码中的查询字段有:CallLog.Calls.NUMBER、CallLog.Calls.CACHED_NAME、和CallLog.Calls.TYPE,这些字段都是在CallLog.calls中定义的,制订了需要查询的项目,用户可以根据需要增减其中的相关字段。ManagedQuery()中指定了CallLog.Calls.CONTENT_URI,说明指定查询通话信息,并同时指定CallLog.Calls.DEFAULT_SORT_ORDER参数将查询结果排序显示。此外,为了程序能够正常运行,我们还应该在完成基本的代码之后还要为应用程序声明获取通话记录信息的权限。在程序的AndroidManifest.xml文件中的标记之前插入权限声明:

"

3.4 GPS信息的获取

通过调用LocationManager类的getLastKnowLocation(String provider)方法来获取地理位置信息,并不对其设置特定的查询要求,那么,getLastKnowLocation方法传入参数LocationManager.GPS_PROVIDER。该方法将会返回一个封装了经纬度等信息的Location对象,然后再对其进行解析获取有用信息。虽然我们通过这个调用获得了设备的位置信息和数据,但调用LocationManager类的getLastKnowLocation方法只是主动的查询地理位置信息,如果需要在地理位置信息发生变化后自动通知系统,还必须为LocationManager类添加一个LocationListener监听器。对其添加监听器并在其中重写以上各种方法的部分代码如下:

LocationListener ll = new LocationListener (){

public void onLocationChanged(Location location) {//重写onLocationChanged方法

updateView(location);}

public void onProviderDisabled(String provider) {//重写onProviderDisabled方法

updateView(null);}

public void onProviderEnabled(String provider) {//重写onProviderEnabled方法

Location l= lm.getLastKnownLocation(provider); //获取位置信息

updateView(l); } //更新EditText控件的内容

public void onStatusChanged(String provider, int status, Bundle extras) {//重写onStatusChanged方法

}};

3.5 系统界面

手机端系统的主要界面如图4所示。

4 结论

本文针对移动感知服务场景下的移动感知应用,研究和实现了其中Android平台客户端交互及传感信息获取部分,为解决移动感知中的相关问题,研究和实现移动感知服务体系的其它部分提供了帮助奠定了基础。

参考文献:

[1] International Telecommunication Union UIT.ITU Internet Reports 2005: The Internet of Things [R].2005.

[2] 安健,桂小林.物联网移动感知中的认知模型[J].计算机学报,2012,35(6).

[3] 安健,桂小林.面向物联网移动感知的服务节点发现算法[J].西安交通大学学报,2011,45(12).

[4] 张仕成.基于Google Android平台的应用程序开发与研究[J].电脑知识与技术,2009,5(28).

[5] 赵亮,张维.基于Android技术的界面设计与研究[J].电脑知识与技术,2009,5(29).

[6] WOLF W. Cyber-physical Systems [J].Computer, 2009,42(3):88-89.

上一篇:钢铁工业自动化的关键技术探究 下一篇:基于Web的离散型制造业设备能力管理系统研究