Android基于即时通信和LBS技术的位置感知服务(一):提出XMPP解决方案

一、前言、提出问题

公司最近举行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服务

下面将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不再本文的讨论范围。一、什么是XMPP?

介 绍XMPP之前,我们先来聊聊GTalk。GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN。从技术角度来说,GTalk与QQ和MSN的差异是使用了不同的通讯协议,QQ使用了自己的私 有协议(未公开),MSN也使用了自己的私有协议。而GTalk使用了XMPP(Extensible Messageing and Presence Protocol,可扩展消息与存在协议),这种通讯协议是一种公开的协议,有很多IM都使用了XMPP。

XMPP是目前主流的四种 IM协议之一,其他三种协议分别为:IMPP(Instant Messaging And Presence Protocol)、PRIM(Presence and Instant Messaging Protocol)和SIMPLE(SIP for Instant Messaging and Presence Leveraging Extensions)。
在这四种协议中,XMPP是最 灵活的。XMPP是一种基于XML的协议,它继承了XML的灵活性和可扩展性。因此,基于XMPP的应用也同样具有超强的灵活性和可扩展性。经过扩展后的 XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器 端的软件协议,使之能与另一端进行通话,这使得开发者更容易建立客户应用程序或给一个系统添加功能。

二、XMPP协议网络架构

XMPP 的特点是将复杂性从客户端转移到服务器端。这使得客户端编写变得非常容易,更新系统功能也同样变得容易。XMPP中定义了三个角色:XMPP客户端、XMPP服务器、网关。

客户端:通过 TCP 套接字与XMPP 服务器进行通信

服务器:同时承担了客户端信息记录、连接管理和信息的路由功能

网关:承担着与异构即时通信系统的互联互通

三、XMPP协议的地址格式(标志)

每个客户端需要拥有一个地址标识用于定位,XMPP 中称之为 JID (Jabber ID)。地址标识的格式如下

[ node "@" ] domain [ "/" resource ]

例如:

charley@gmail.com/spark

格 式与 Email 地址格式类似,但增添了 resource 项(非必需的)。上述例子可以解释为:在 gmail.com 服务器注册的 charley用户,且使用 spark客户端软件登录。资源(resource )只用来识别属于用户的位置或设备等,一个用户可以同时以多种资源与同一个XMPP服务器连接(说白了就是用于支持同一账号的多客户端登录)。

用 户地址标识的认证由提供 XMPP 服务的服务器执行。例如,注册于 gmail 服务器的账号由 gmail 服务器进行验证。其他服务器发往 gmail.com 域名的数据包均通过域名查询与服务间验证后发往 gmail 服务器,而不用考虑 gmail 服务器与下属账号间的通信。

四、为什么要采用XMPP的解决方案(主要列出优点,缺点就不列了,实际上我们关系也不大)

1. 开放—XMPP协议是自由、开放、公开的,并且易于了解。而且在客户端、服务器、组件、源码库等方面,都已经各自有多种实现。

2. 标准—互联网工程工作小组(IETF)已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。而XMPP 的技术规格已被定义在RFC 3920及RFC 3921。任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。

3. 证实可用—第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努力。今日的互联网上有数以万计的XMPP服务器运作著,并有数以百万计的人们使用XMPP实时传讯软件。

4. 分布式—XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。

5. 安全—任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已内置于核心XMPP技术规格中。

6. 可扩展—XML命名空间的威力可使任何人在核心协议的基础上建造客制化的功能;为了维持通透性,常见的扩展由XMPP Standards Foundation。

下面几点更加实际

7. 跨平台—客户端只要基于XMPP协议,不管是什么平台(包括不同的移动终端)都可以互联互通。

8. 弹性佳—XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。

9. 多样性—用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境。

五、XMPP协议的Java开源解决方案

Openfire+Smack+Spark 是由jivesoftware(http://www.jivesoftware.com/)贡献的一个Java 开源的解决方案,方便用户搭建自己的服务以及编写基于Smack API的通讯实现。

下载地址如下:

http://www.igniterealtime.org/downloads/index.jsp

1. Openfire服务器

Openfire 是基于XMPP 协议的服务器端的一个Java实现,虽然当两个用户连接后,可以通过点对点的方式来发送消息,但是用户还是需要连接到服务器来获取一些连接信息和通信信息的,所以服务器端是必须要实现的。Openfire 支持插件开发。

2. Smack

Smack 是一个XMPP 协议的Java 实现,提供一套可扩展的客户端调用API。我们后面的实现依赖与这套API。

3. Spark和SparkWeb

Spark 提供了客户端一个基本的现,并提出了一个很好的插件架构,用户可以进行插件开发。SparkWeb是基于Web的客户端。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值