摘 要: 基于Android智能操作系统开发平台,以移动通信网为载体,利用短信方式和GPRS方式实现在系统客户端信息采集与传输、进行数据分析处理等功能的物联网无线测控系统。用户通过Android设备终端,可以随时随地查看环境数据并进行实时检测与控制,实现物联网嵌入式的无线测控功能。
关键词: Android OS;GPRS;SMS;物联网;无线测控
目前无线通信处于3G/4G时代,中国移动GPRS业务全面投入运营,无线数据通信的发展和应用向着愈来愈广泛和深入的领域发展[1]。远程测控技术并不是一项新的技术,然而由于移动通信网的介入,使之焕发出新的光辉。因此,随着智能手机的迅速发展,Android操作系统作为最流行的操作平台,充分利用无线通信的现有资源,开展远程物联控制是远程控制充满活力的发展方向,网络远程控制技术也是物联网建设的基本方向之一[2]。
本系统是基于Android操作系统平台,将传统的远程控制技术向基于无线通信网的移动终端设备的方向转变,实现了一种为移动客户端提供远程无线测控的方案。该方案能够对远程数据进行实时监控,提高工作效率,也增加了远程控制的灵活性。
1 Android操作系统平台
Android操作系统是谷歌发布基于Linux平台的开源手机操作系统。该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放移动软件,其开放的平台允许任何人在终端设备上开发[3]。Android所包含的功能如下:
(1)APPLICATIONS(应用程序层):Android装配了一个核心应用集合,包括短信、日历、地图、通信录等。所有应用程序都是用Java语言编写的。
(2)APPLICATION FRAMEWORK(应用程序框架层):Android具有强大的应用层API和丰富的传感器功能,所有的应用程序其实是一组服务和系统,主要包括如下内容:视图(View);内容提供者(Content Providers);资源管理器(Resource Manager); 通知管理器(Notification Manager);活动管理器(Activity Manager)。
(3)LIBRARIES(库):Android包含一个C/C++库的集合,用来提供给Android系统多种组件使用,这些功能通过Android的应用程序框架来提供给开发者。
(4)ANDROID RUNTIME(Android运行时):Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在自己的进程中。
(5)LINUX KERNEL(Linux内核):Android基于Linux2.6提供核心系统服务,例如安全、内存管理、进程管理、网络堆栈、驱动模型等。作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务[4]。
2 硬件平台
该物联网无线测控系统的硬件平台主要由STC12C5A60S2单片机、WISMO228无线通信模块、I/O测控接口、本地串行通信接口等资源组成。硬件总体框架设计如图1所示。
微控制器选用8 bit STC12C5A60S2系列单片机,其指令格式完全兼容8051,但速度要快8~12倍。GPRS模块选用基于GSM/GPRS的工业级无线通信模块WISMO228,可直接由单片机串行口连接并通过AT命令控制等特性,能很好地适应物联网对远程测控的要求。以太网控制器选择高度集成的全双工以太网接口芯片RTL8019AS。
固件程序的主要功能包括初始化228模块、生成短消息、解析短消息、有线和无线网络的通信、控制I/O设备等。
3 终端应用程序开发
3.1 系统方案
(1)系统开发环境:本系统使用Android 应用开发工具和API 接口,基于JDK + Eclipse + ADT插件 + SDK的开发环境。
(2)系统设计流程:系统通过Activity管理相应功能。首先进入LOGO界面,然后跳转到登录界面,验证成功即可进入TabView界面,创建异步任务,进行异步操作,这样能够提高处理速度,使软件更加健全可靠。软件系统架构如图2所示。
(3)模块化设计:系统客户端软件主要包括界面模块、数据库模块和功能控制模块3个部分。
3.2 设计与实现
3.2.1 UI布局实现
Activity是Android的核心类,是一个用来提供屏幕与用户交互的应用组件[5]。Activity类通过onCreat()方法来初始化,由setContentView()方法指定一个布局(layout)文件,显示布局文件的内容。UI布局实现如下:
(3)账户管理界面
在Android中,ListView是一个比较难于使用的控件,一个ListView通常有两种功能,一是将数据填充到布局;二是处理用户的选择点击等操作[8]。ListView以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。一个ListView的创建需要3个元素:ListView中的每一列的View;填入View的数据或者图片等;连接数据域ListView的适配器[9]。
在本系统中设计了account_item.xml和account_manager.xml两个布局文件,分别用来实现ListView中每个item对应的View和管理账户界面AccountManagerActivity对应的布局。本视图通过自定义AccountManagerActivity继承BaseAdapter实现数据绑定、accountList与ListView列表项一一对应。其代码如下:
accountList=(ListView)findViewById(R.id.lvAccountList);
adapter=new AccountManagerAdapter(this,users);
tabHost=getTabHost();
tabHost.addTab(tabHost.newTabSpec("GPRS")
.setIndicator("GPRS",getResources().getDrawable
(R.drawable.gprs))
.setContent(new Intent(this, GPRSActivity.class)));
控制器1完成对电视机的控制功能。当设定的定时时间点击确定按钮,即开始对电视机进行开机或关机操作;获取控制器的响应信息,显示定时完成状态;在获取控制器响应信息之前,显示正在定时状态(如控制器2对冰箱的启动或关闭状态控制)。
3.2.2 数据库设计
本系统在使用过程中会频繁对数据进行操作,而对存储卡文件进行增、删、改、查操作。为了提高效率,这里采取占用资源小的SQLite数据库机制[10]。但数据库并不能自身进行操作,只有通过一个继承了SQLiteOpenHelper的类对象调用相应的函数进行操作。这里定义了一个DBHelper继承SQLiteOpenHelper。为了代码重用,对账户管理操作和终端数据操作分别写了两个基类UserInfoServices和RmcsInfoServices来处理最底层的访问;数据库里的每一行记录与UI列表的每一项一一对应。
根据需求分析,本系统涉及两个表:UserInfo、RmcsInfo,分别用于保存账户信息和终端数据信息,其数据结构分别如表1和表2所示。这两个表分别由UserInfoServices和RmcsInfoServices类管理。在DBHelper类的onCreate方法中通过执行数据库execSQL方法动态创建这两个表。其代码如下:
db.execSQL(DBInfo.Table.SQL_CREATE_USER_INFO_TABLE);
db.execSQL(DBInfo.Table.SQL_CREATE_RMCS_INFO_TABLE);
另外,在UserInfoServices中主要封装对账户的增、删、改、查操作;在RmcsInfoServices中主要封装对终端数据的相应操作。主要采用的数据库操作方法如下:
(1)db.insert(table,nullColumnHack,values)向数据库中插入一条记录。
(2)db.delete(table,whereClause,whereArgs)从数据库中删除一条记录。
(3)db.update(table,values,whereClause,whereArgs)更新数据库中的一条记录。
(4)db.query(table,columns,selection,selectionArgs, groupBy,having,orderBy) 在数据库中 查询一条记录,该方法返回的是一个Cursor对象。
3.2.3 GPRS通信模块设计
物联网无线测控系统的嵌入式微控制器与本地电器终端设备进行数据通信,以获得电器设备的运行状态参数,通过GPRS模块发送到GPRS网络中。手机终端的GPRS接收模块可以接收经无线网络传递进来的数据进行处理,同时还可以由GPRS发送模块将封装后的测控数据传送到终端设备,从而在物联网平台上对电器终端设备的开关,实现定时、排除异常、报警等监控功能。
具体设计如下:
(1)首先判断是否接入网络。在Android手机中可以通过ConnectivityManager类的isAvailable()方法判断是否已联网,查看返回结果判断网络连接是否有效,如果为true,则表示当前Android手机已经联网;为false则表示没有联网。其代码如下:
ConnectivityManager cManager=(ConnectivityManager)get System Service(Context.CONNECTIVITY_SERVICE); NetworkInfo info=cwjManager.getActiveNetworkInfo();
(2)使用过程中必须建立GPRS连接,其代码如下:
DataConnection conn=DataConnection.getInstance();
if(connectMode==0){
ret=conn.openConnection(mContext,"cmwap",
"cmwap","cmwap");
}else {ret=conn.openConnection(mContext,"cmnet","
","");}
(3)Android平台的网络应用绝大部分都是基于Java的编程接口,这里同样采用了基于标准的Java接口。步骤如下:创建URL以及URLConnection/HttpURLConnection对象,设置连接参数,连接到服务器,向服务器读、写数据等通信控制。其代码如下:
URL url=new URL(Values.REQUEST_URL);
HttpURLConnection http
=(HttpURLConnection)url.openConnection();
connection.connect();
InputStream in=connection.getInputStream();
OutputStream outStream=connection.getOutputStream();
(4)最后要在AndroidManifest.xml文件中加入权限:
<uses-permission
android:name="android.permission.ACCESS_NETWORK_ STATE"/>?
<uses-permission android:name="android.permission.INTERNET"/>
3.2.4 SMS通信模块设计
(1)Android SDK提供了用于直接发送短信的SmsManager类[11]。通过sendTextMessage方法可以指定目标电话号码和短信内容。其代码如下:
SmsManager sms=SmsManager.getDefault();
sms.sendTextMessage(number, null, str, null, null);
(2)Android系统只要接收到短信,就会发一个广播。因此,这里定义SMSReceiver继承广播接收器BroadcastReceiver,重写onReceive()方法,用来监听手机接收到的短信。此时要在AndroidManifest.xml文件中定义这个广播接收器。其代码如下:
<receiver android:name=".SMSReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
(3)最后在配置文件中设置如下权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
4 测试与结论
应用程序设计完成后,就可以在Android SDK提供的AVD虚拟机上成功运行,并且在基于Android平台的移动终端上测试运行。本测试环境下使用的移动终端采用华为C8650,该机型采用Android2.3.3系统版本。
将完成的应用程序中的RMCSoftware.apk文件安装在手机中,即可运行程序。经多次测试,手机客户端能够通过GPRS模块和SMS模块分别检测和控制终端设备的运行状态,并能够正确地发送和接收数据,对数据进行封装和处理,可在较短的时间内实现对设备的定时、排除异常等功能,应用程序运行良好,满足了无线测控系统的功能需求。
参考文献
[1] 王莹.物联网为嵌入式带来的机遇[J].电子产品世界,2010(5).
[2] 刘强,崔莉,陈海明,等.物联网关键技术与应用[J].计算机科学.2010(6).
[3] 裴佳迪,马超,孙仁贵,等.Google Android应用开发全程实录[M].北京:人民邮电出版社,2012.
[4] 姚昱旻,刘卫国.Android的框架与应用开发研究[J].计算机系统应用,2008(11).
[5] 孟小华,陈传凯.Android平台手机来电及短信防火墙关键技术研究[C].2010 3rd International Conference on Power Electronics and Intelligent Transportation System. 2010.
[6] 张仕成.基于Google Android平台的应用程序开发与研究[J].电脑知识与技术,2009(28).
[7] 赵亮,张维.基于Android技术的界面设计与研究[J].电脑知识与技术,2009(29).
[8] 韩超,梁泉.Android系统原理及开发要点详解[M].北京:电子工业出版社,2010.
[9] 耿东久,文军.基于Android手机的远程访问和控制系统[J].计算机应用,2011,31(2).
[10] Android如何使用SQLiteOpenHelper[EB/OL]. http://www.cnblogs.com/skynet/archive/2010/06/14/1758284.html<br>.
[11 魏化勇.基于3GAndroid的SMS应用研究[J].计算机光盘软件与应用,2011(11):191-183.