文献标识码: A
文章编号: 0258-7998(2012)08-0129-04
随着移动互联网的快速发展,云计算在移动平台的应用引发了一场变革。在移动领域的云计算(移动云计算)是利用云计算技术解决移动终端的存储和数据处理等问题,帮助用户摆脱硬件设备、存储设备、应用程序等条件的限制,实现将移动终端应用的“计算”从终端转移到服务器端, 从而弱化了对移动终端设备的处理要求[1]。Openmobster是一个开源的集成了手机应用的云服务平台,具有开发手机同步应用、开发推送应用、开发离线手机应用、应用开发框架、移动云服务的服务器端开发框架和管理控制台等特征。其目的是让应用开发人员省掉开发底层同步及消息通知中间件的工作,只需将注意力集中于更好地实现业务需求上。
本文介绍了一种基于Android智能终端的远程控制系统,在系统中Android手机利用周围的无线网络资源,与云端服务器自发交互,如远程下发通知、远程设置密码、远程GPS定位、远程数据同步等操作。通过该系统使云计算真正“落地”,实实在在地为手机提供服务。
1 Openmobster平台的概述
1.1 Openmobster对应用的支持
(1)数据同步
无需任何特定的设备间的同步程序,即可支持云端和终端间数据的自动同步。允许应用工作于在线或离线模式,一旦检测到终端数据状态变更,立即发起对云端的自动数据同步。
(2)实时推送通知消息
云端的状态变更可以通过实时消息推送通知到终端,该推送机制使用基于网络Socket的方式,而不是发送短消息或电邮的方式。
(3)移动远程调用(Mobile RPC)
提供了一种访问云端服务的方式,无需复杂的网络底层编码(http编码)即可通过RPC API接口进行调用。
(4)管理控制台
提供了一个管理控制台用于对云端服务器进行管理(含安全认证、账号设置等)。
1.2 Openmobster平台的架构
(1)网络拓扑结构
Openmobster平台的网络拓扑结构如图1所示[2]。
(2)终端软件堆栈结构
Openmobster平台的终端软件堆栈结构如图2所示。主要包含以下模块:
同步模块:自动将所有本地状态变更与云端数据保持同步。
推送模块:管理来自云端服务器的状态更新通知,从而改善了用户体验,使其不必主动查询新的通知。
离线应用模块:用于Sync模块和Push模块之间的管理协调,用户可不必关注任何实际同步流程的细节,也不必关注如何处理收到的推送通知消息。
远程调用:支持从终端到云端MobileServiceBean的同步远程调用。
网络连接:管理云端服务器建立的网络连接,管理接收来自服务器通知的通信频道。
Inter-App总线:提供了安装在设备上的Apps/Moblets底层通信协调。
(3)云端软件堆栈结构
云端软件堆栈结构主要包含以下模块:
①同步模块:同步设备侧数据状态变化到后端服务,这里使用了数据频道的概念。
②推送模块:监视数据频道的更新,一旦发现数据有更新,将发送基于Comet的通知到终端。
③安全模块:提供了身份验证和鉴权,以确保连接至服务器的终端得到许可。
④Secure Socket-Based Data Service:这是一个高性能的基于Java NIO的Socket服务器。
⑤Mobile RPC:服务器端的RPC框架。
⑥Management Console:管理控制台。
2 系统总体设计
系统的总体设计思路是将Openmobster的Jboss服务器部署在一台PC上,负责提供底层服务并与用户的Android 手机进行通信。将Openmobster平台的客户端CloudManager安装在手机上,提供管理界面,如用户登录、设备激活、推送通知、数据同步、查看网络连接状态等。可见这是一个C/S架构的系统,其中PC作为服务器,Android 手机作为客户端。
在该系统中,PC首先连接到网络并获取IP地址,然后将Openmobster的服务器根据此IP地址部署在PC上。Android手机通过打开WiFi连接到此网络,根据部署服务器的IP地址登录并激活手机客户端。用户便可以通过自己设计的网页界面下发控制命令到手机终端,JSP模块获取并封装这些命令字段后下发给云服务器端。CloudServer模块根据 Openmobster平台提供的一系列接口和通道,将这些命令最终下发给手机终端并执行相应的操作。系统的总体结构如图3 所示。
图3所示结构图主要涉及以下功能模块:
(1)Jboss服务器:Openmobster的服务器均采用Jboss来搭建服务器。
(2)JSP代码:网页界面下发的命令字段通过JSP代码封装并下发至云服务器端的工程。
(3)网页:由于Openmobster只有控制台没有自己的网站,操作起来极其不便。因此在本文中设计了一个网页界面,实现与用户的交互。
(4)HSQLDB数据库:建立一个数据库,方便用户数据的存储和读取。
(5)Hibernate:建立与数据库的映射关系,方便用户查看所需要的数据。
(6)Openmobster:为手机云应用的开发提供基本的支持。
(7)Android:手机终端应用开发。
(8)CloudManager:安装在手机上的客户端。
3 系统的具体实现
3.1搭建开发环境
(1)云服务器端
由于Openmobster平台运行于Jboss服务器上,所以先搭建Jboss服务器,下载Jboss软件并进行相关配置使得Jboss主页能够访问。然后对所使用的数据库预先进行配置,并将数据库中的Openmobster目录拷入server下。具体步骤如下:
首先打开Windows控制台,进入到$JBOSS\bin目录下,运行:
Run -c openmobster -b “IP address”以启动JBoss服务器。
然后在浏览器中运行http://{IP address }:{port}/o确认服务器已正常启动。
使用管理控制台,进入$Openmobster \cloudConsole\bin目录下,运行以下脚本:openmobster.sh或openmobster.bat启动控制台。
如果是第一次运行,使用如下命令配置root账号:
configure -a {cloudServer IP Address} -po 1502 -u root -p { password }
然后以root账户登录:
startadmin -u root -p { password }
最后配置其他普通用户账号:
register -u {email of the user being registered} -p { password }
(2)手机终端:
手机终端也需要安装相应的Openmobster的服务模块,该服务模块需要开机自启动。
将CloudManager app模块安装到手机,然后启动该应用,选择“Activate”菜单,按提示逐步输入云端服务器IP地址,用户注册帐号及密码等实现登录。
3.2 云服务器端的开发
(1)实现一个MobileBean类型,并添加getXXX()、setXXX()方法。MobileBean封装了用于和服务器端同步的域级信息。通过服务器上的频道传播到手机终端。
(2)实现一个Channel类型,需要首先实现CRUD(Create, Read, Update, Delete)接口来暴露后端数据。Create用于创建一个MobileBean的新实例,当设备侧检查到一个新的实例并同步回云端,返回单独的id值。Read用于返回对应id完整加载的MobileBean。另外还有一个readAll()方法用于返回所有相关的MobileBean。
(3)实现bootup()方法,该方法用于返回使程序正常启动所需的足够信息 (beans),一般在频道第一次启动时调用。
public List<? extends MobileBean> bootup()
{
List<DemoBean>bootupBeans=new ArrayList<DemoBean>();
DemoBean Bean = new DemoBean ();
bootupBeans.add(syncBean);
return bootupBeans;
}
实现scanForNew方法,该方法用于检查频道所连接的后端是否已经创建了一个新的MobileBean,基于此,将返回新的bean的id或null。如果这些新的bean可用,信息将被自动同步并通知给用户。
public String[ ] scanForNew(Device device, Date lastScanTimestamp)
{
return new String[]{"push:1", "push:2"};
}
(4)声明相关的MobileServiceBean,实现其invoke方法:
List<EmailBean> mockBeans = EmailBean.generateMockBeans();
List<String> subjects = new ArrayList<String>();
for(EmailBean local:mockBeans)
{
subjects.add("id="+local.getOid()+":subject="+local.getSubject());
} response.setListAttribute("subjects", subjects);
(5)在openmobster-config.xml 中注册该频道。
<bean name="demobean" class="com.demo.sync.DemoBeanChannel">
3.3 Android手机终端的开发
(1)编写HomeScreen。HomeScreen组件代表了Android
app启动时的屏幕主界面。其postRender()方法的实现如下:。
if(MobileBean.isBooted("demobean"))
{
MobileBean[]demobeans=MobileBean.readAll("demobean");
String[] ui = new String[demobeans.length];
for(int i=0,size=ui.length;i<size;i++)
{
ui[i] = demobeans [i].getValue("message");
}
listApp.setListAdapter(new ArrayAdapter(listApp,
android.R.layout.simple_list_item_1, ui));
}
(2)在moblet-app.xml 进行配置。
<screen>com.demo.app.HomeScreen</screen>
3.4 系统的总体设计流程
整个系统的总体设计流程如图4所示。具体设计步骤如下:
(1)用户通过浏览器打开自己设计的网页,选取需要下发的控制命令,然后输入已经在服务器上配置好的账号和密码,点击“确定”后调用JSP代码:
<form action="action.jsp" method="post" name="form1" id="form1">
(2)JSP执行过程为将网页请求request封装的各功能选项字段取出并封装。
(3)CloudServer中定义的DemoChannel会定期调用scanForNew并对上面的字段进行检查,一旦发现有新数据,即通过read()接口取出该数据,将其封装到DemoBean对象中,并通过OpenMobster下发推送通知到终端。
(4)终端的后台服务Service同样建立了对应云端
DemoChannel的接口,一旦收到频道的下发通知,即通过发送Intent的方式启动一个Activity,在启动过程中可以通过MobileBean.read(channelUri,userName)接口读出对应账号名和通道下发MobileBean,通过MobileBean.getValue接口获得下发通知中的各功能命令字段。
(5)通过对上述各命令字段的含义解析,获取字段的值,并进入等待队列。如果手机上的客户端已经被用户登录并激活,将调用Android平台提供的各个功能接口,完成下发的控制命令操作[3]。
(6)如果下发的命令字段中要求将手机中的数据上传到服务器时,通过类似下发的逆过程,相应地建立上传的通道,将数据上传到服务器侧。如果用户有需要,还可以将这些数据展示在网页界面上。
4 实现结果
系统采用了C/S模式的架构进行实现,服务器与客户端通过Socket 进行网络通信。在PC 端Openmobster的实现中,采用了基于HTTP长连接的“服务器推送”技术,通过长连接,服务器随时发送Push通知;服务器采用移动App框架结构,手机的客户端做成一个可开机自启动的apk,该手机只要接入网络而且被激活,会在后台一直运行等待用户发送命令。该系统可实现远程追踪、远程擦除、远程锁定、远程同步、远程推送、远程过程调用等功能[4],实现环境为Eclipse。Android 手机端的激活与远程下发和锁定过程如图5所示。
经过在Android高通平台手机上反复测试,手机连接Server 的时间小于3 s,远端Server对手机控制命令的响应时间小于5 s,基本完成了云服务器对智能手机终端的访问和控制功能。但是在测试过程中发现Openmobster平台设计的数据同步算法还不完善,如在本地进行的新增、修改、删除记录的操作时,如果没来得及同步到服务器侧,会因为重新同步数据操作而丢失,造成用户使用不便,有待于今后深入研究和探讨。
参考文献
[1] 王鹏,董静宜.一种云计算架构的实现方法研究[J].计算机工程与科学,2009,31(1):11-13.
[2] ABI Research. Mobile cloud applications[EB/OL].(2010-03-09)[2011-02-20].http://www.abiresearch.com/research/1003385-Mobile+Cloud+Applications.
[3] 杨文志.Google Android程序设计指南[M].北京:电子工业出版社,2009.
[4] 韩超,梁泉.Android系统原理及开发要点详解[M].北京:电子工业出版社,2010.