引言
基于Android平台的智能终端走进了越来越多人的生活,基于位置服务(LocationBased Service, LBS)无疑是移动业务领域的一个重要组成部分[1]。伴随着各大厂商,尤其是ARM在移动芯片领域的强劲表现,移动终端设备在最近几年有了长足的发展。与此同时,LBS在移动终端设备上越来越成熟,尤其是谷歌地图、百度地图等移动地图服务得到了用户的广泛肯定与大力支持,基于位置服务的应用前景十分良好[1]。因此,研究基于Android系统移动终端的导航定位技术有着广泛的应用前景。
由于目前基于位置信息服务的应用功能大同小异,大部分只局限于地图的浏览以及单方位置的呈现,在呈现一方位置后并没有实现位置的交互,即没有真正意义上将位置服务与社交网络结合[2]。本文以用户对移动导航定位应用的需求进行了重新提炼,从用户的角度考虑,设计并实现了移动导航定位应用系统。这样不仅革新了和好友们用手机联系的传统方式,而且通过高精度的位置定位,实现与联系人实时通信、地图基本操作、移动导航定位、生活服务信息等功能。相信通过本课题成果的拓展,能够扩展LBS的相关应用空间,增强用户的认可,基于位置的移动导航定位服务将受到越来越多的关注。
1 系统设计方案
本文采用典型的C/S设计模式,即客户端和服务器结构,提出了一种轻巧、简便的系统设计方案,如图1所示。客户端安装相应的应用软件,XMPP服务器存储数据,客户端向服务器请求服务,服务器向客户端提供服务。以电子地图为基础,集成用户位置需求,综合利用无线通信网络(TDSCDMA/LTE)、有线网络的优势,实现多方用户移动导航定位。
图1 系统设计方案
本系统中客户端与服务器端通信遵循 XMPP协议。在系统服务器端,主要采用基于开源XMPP协议的服务器架构和基于Java编程语言的开源关系型数据库MySQL的模式;在基于Android平台的客户端使用asmack.jar、baidumapapi.jar等开发包。安装了该系统客户端后,用户发送的用户注册信息以及用户身份核实请求、实时数据流连接请求、实时信息交换请求和通信协议安全性确认请求等,都是由开源应用系统服务器端来处理的。由此,系统在基于关系型数据库MySQL提供用户信息数据的信息服务与支撑下,实现了支持XMPP即时通信协议的Android客户端之间移动导航定位应用的功能。
2 关键技术研究
2.1 Android的平台及应用开发
Android是一个由Linux+Java构成的移动设备软件框架,它包括一个操作系统、中间件和一些关键应用。Android平台采用了分层架构,分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层,具有平台标准化、用户可定制以及服务免费等特色[3]。
Android程序的载体是各个应用程序包,而程序运行的主体是各种“组件”。从应用程序的角度看,各个组件对外的联系是程序处理的一个关键问题,组件接口包括对用户的接口和对其他包的接口两部分内容。从组件的角度看,其接口分为对包内的其他组件的接口和对其他应用程序包的接口,它们的实现结构基本相同,组件接口关系如图2所示。Android的应用程序是用 Java语言开发的[4],其编程语言完全开源免费,基于此平台对此系统进行开发设计。
图2 Android应用程序包的组件接口关系
2.2 XMPP即时通信协议
XMPP(Extensible Messaging and Presence Protocol)可扩展消息与出席协议是一个开放源码的,以XML为基础的,可扩展的即时通信协议,它是一个发送接收处理消息的协议,继承了XML的灵活的可扩展性,以XML数据流为载体进行数据传输[5]。XMPP协议中有三种实体(不包括外部即时消息服务器),它们分别为XMPP客户端、XMPP服务器、XMPP协议网关。实现这种抽象架构的示意图如图3所示。
图3 XMPP系统架构
2.3 百度地图API
百度地图API针对移动终端特别开发出百度地图移动版API,百度移动地图API是基于移动互联网设备的应用程序接口,支持Android平台。与此同时,移动地图免费对外开放地图SDK和定位SDKAPI,若需要在同一个工程中同时使用地图SDK和定位SDK,需先申请同一个key,接口使用无次数限制。
在Android应用中,使用百度地图会采用Baidu Maps外部扩展库baidumapapi.jar,这个库包含在标准的Android SDK中。开发人员可以下载这个类库,这样就可以为Android应用程序加入地图功能。在需要引入Baidu Map的应用程序AndroidManifest.xml文件中添加所需权限:
</usespermission>
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE"> </permission>
<usespermission android:name="android.permission.BAIDU_LOCATION_SERVICE">
</usespermission>
其次在显示MapView的布局文件xml中,添加如下内容:
<com.baidu.mapapi.map.MapView android:id="@+id/bmapsView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
然后再用setContentView前初始化BMapManager对象增加以下代码,并将申请的Key替换“Key”
mBMapMan=new BMapManager(getApplication());
mBMapMan.init("Key", null);
至此,就可以在Android应用程序里使用Baidu Map服务了。
3 系统的功能实现
本文的研究目的是实现移动导航定位应用系统,通过后台的推送服务更新信息并发送给其好友,同时在客户端上通过百度Map上显示出来。只要用一个账号和密码登陆,使用者匹配数据库相关数据后就可以加载好友列表,可以添加注册用户为联系人,并可以与联系人即时通信和实时位置定位,进而实现移动导航定位应用的功能。
3.1 客户端功能实现
Smack是基于Java语言编写的XMPP的一个实现。在Smack库中,存在连接之前的配置类ConnectionConfiguration和连接服务器XMPPConnection。在连接服务器之前需通过服务器IP、端口、服务器名字封装构造函数ConnectionConfiguration(Host, Port, XmppServiceName),用于在开展数据连接时配置参数,然后通过构造函数XMPPConnection(ConnectionConfiguration config)加载需要连接的XMPP服务器,进而再进入数据调用程序,调用该类函数,以设定实时的connect()连接方法。代码如下:
//与服务器建立连接
xmpp_manager = XmppConnectionManager.getInstance();
connection = xmpp_manager.init(login_config);
connection.connect();
//用户注册
String account_name = account.getText().toString();
String account_password = password.getText().toString();
regist(account_name, account_password);
//用户登录
String username = loginConfig.getUsername();
String password = loginConfig.getPassword();
connection.login(username, password);
//添加好友
String userName = user_add.getText().toString();
String nickname_in = nick_add.getText().toString();
XmppConnectionManager.getInstance().getConnection().getRoster().createEntry(userJid, nickname, groups);
//主动发起会话
IMMessage newMessage = new IMMessage();
newMessage.setMsgType(1);
newMessage.setFromSubJid(chat.getParticipant());
newMessage.setContent(messageContent);
newMessage.setTime(time);
message_pool.add(newMessage);
MessageManager.getInstance(context).saveIMMessage(newMessage);
MChatManager.message_pool.add(newMessage);
refreshMessage(message_pool);
//接收会话
IMMessage message = intent.getParcelableExtra(IMMessage.IMMESSAGE_KEY);
message_pool.add(message);
receiveNewMessage(message);
refreshMessage(message_pool);
//我的位置
locationClient.start();
if(locationClient!=null&&locationClient.isStarted())
locationClient.requestLocation();
//好友位置
FriendPoint fp = new FriendPoint();
fp.setJid(cursor.getString(cursor.getColumnIndex("_id")));
int la=cursor.getInt(cursor.getColumnIndex("la"));
int lo=cursor.getInt(cursor.getColumnIndex("lo"));
fp.setTime(cursor.getString(cursor.getColumnIndex("local_time")));
fp.setPoint(new GeoPoint(la, lo));
3.2 服务器功能实现
本系统采用开源的Openfire作为服务器。Openfire是一个跨平台,采用Java程序语言开发,基于XMPP协议实时协作(RTC)的开源服务器,可以供客户端进行会话连接、呈现信息获取、消息存储及认证等[5]。Openfire服务器的内核主要由连接管理组件、服务器连接管理组件、会话管理组件、注册登录管理组件、管理更新组件、文件传输管理组件、外部管理组件、数据存储组件和传输器组件等组成。其通信处理是基于Apache MINA框架实现的,提供TCP/IP、UDP/IP上的通信,许可不同的端口,定义了不同的通信功能。比如,5222端口是一个标准的客户端到服务器端的端口,而5223端口则是SSL连接的端;7777端口专门用于文件传输,7070端口则是被HTTP绑定。同时,Openfire支持插件扩展件扩展的方式来增加新的功能。服务器登录界面略——编者注。
4 功能性测试
服务器端以Openfire作为主服务器,客户端则以Android平台为开发平台,由Asmack实现XMPP协议,使用MVC开发模式开发,最终将UI操作界面、多线程通信、XML消息处理和数据库操作等后台处理过程相结合。在无线通信网络或WiFi环境下,利用Android平台的智能终端GPS模块获取地理位置信息,在三星 S7562 Android 4.0和摩托罗拉525+ Android 2.3中完成主要功能的功能性测试。功能性测试验证分析,用户登录验证、添加联系人、即时通信、定位功能、好友位置定位等移动导航定位功能均满足预期设计。
结语
随着4G时代的到来,人们的日常生活已经离不开移动终端,同时,由于移动终端的普及,人们对于基于位置的服务需求也与日俱增。单纯的签到服务已经满足不了人们的需求,位置服务应用应该走向平台化、专业化、生活化。本文在对Android平台应用系统特点、XMPP即时通信协议、百度Map API等关键技术研究的基础上,设计了基于XMPP协议的Android移动导航定位应用系统。