一、前言、提出问题
公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让A和B之间可以互相感知对方的位置信息。
于是整理了一下思绪,说白了分解开来就是两个方面的问题:一、实现信息的即时传递,二、实现基站/wifi、GPS的定位。
1. 实现消息的即时传递:说到这个问题大家应该能联想到QQ、MSN、Gtalk这些即时通信软件。
2. 定位:这个让人联想到时下非常火的LBS服务(Location Based Services)。有关LBS详细介绍请移步百度百科http://baike.baidu.com/view/152851.htm
二、应用场景
即时通信和LBS两个热门的技术引出了我们的主角:位置感知服务 (Location-aware service)。那么,有哪些与之有关的场景呢?下面列出了自己想到的几个例子(还有很多,大家可以充分发挥自己的想象力):
1. 手机制作商通过在设备中内置一个定位服务来跟踪手机的位置。比如,苹果官方推出的"Find My iPhone"手机定位服务,可通过Mobile Me帐号来定位iPhone手机目前的位置,可帮助失主找回自己的iPhone手机。
2. 你和朋友一起去郊区旅游,会不会碰到走散的时候?如果这个时候你有一款手机(Android、iPhone、Symbian或其他手机)并且安装了一个可以实现朋友之间位置实时共享并把大家的所在位置显示在地图上的应用,那问题就好办了。
类似的还有朋友之间自驾游、人员跟踪、突发事件、急救等领域都能派上用场。
三、寻找问题的解决方案
1. 关键的问题:即时通信。因为前面的项目积累了基于位置应用的相关经验,所以定位不算一个问题。需要花费比较多精力的地方是实现消息的即时传递。
2. 分析需求:根据提出的问题,A发出的信息需要实时的到达B,反过来就是B发出的信息也要实时到达A。对这种双工实时的通信目前还没有相关的项目经验。
3. 最简单的实现可能用轮询(Polling)了,在这个问题中,轮询意味着使用一种RESTful Web服务(目前我们手机项目普遍使用的服务器接口方式)来为A或B获得(GET)对方的更新。但这种方式有缺点:一则增大服务器的负担,想想如果每个客 户端每隔1分钟访问服务器,而大多数情况下服务器是没有更新数据的,对比起来服务器的负担就很浪费了,1分钟的时间又很难做到实时的更新;二则对于移动设 备,例如手机这种客户端,轮询浪费电源这个手机最宝贵的资源。
4. 解决的方式是长连接。PubSub(Publish/Subscribe,发布/订阅)是一种使用异步消息传递协议的架构性方法,其中发布者和任何订阅者 都是解耦的。在需要向大量客户端发送更新通知的场合下,这些特征使得PubSub成为一种合适的可伸缩性选择。
5. 经过搜索相关资料,决定尝试使用一种基于XMPP[Extensible Messaging and Presence Protocol,可扩展消息传递和现场协议]的PubSub服务