在XMPP的JAVA开源实现Openfire中,增加LBS 附近的人功能

1. XMPP协议 与 Openfire

XMPP协议是IM领域的标准协议了,具体可参考  http://xmpp.org   及RFC6120,RFC6121,RFC6122等相关文档。 http://xmpp.org/xmpp-protocols/

XMPP协议实现,开源的也很多,server端可参考 http://xmpp.org/xmpp-software/servers/    client可以参考 http://xmpp.org/xmpp-software/clients/    library等可参考 http://xmpp.org/xmpp-software/libraries/

其中XMPP协议的JAVA实现 Openfire 热门程度很高,也许取决于其安装使用门槛低以及底层基于MINA框架的经典实现等优势。

http://igniterealtime.org/projects/openfire

2. LBS之附近的人 

在移动设备上,几乎大多数的IM类应用都有“附近的人”功能,其原理也非常简单,每一个用户若要查看自己附近的其他用户,则须上传自己的地理位置(GPS,基站定位)以共享;

server端则通过计算地球上两点距离来推送一定半径内的其他用户信息给使用者。

具体算法实现,我们参考大家通用的做法,比如来自zhihu上同行的分享:

用经纬度做索引,

  1. 先粗算,比如把经纬度差一以上的全去掉,where latitude>y-1 and latitude<y+1 and longitude>x-1 and longitude <x+1 and ... ; x,y为当前用户的经纬度。
  2. 再小范围概算,使用类似这样的公式 order by abs(longitude -x)+abs(latitude -y) limit 100;
  3. 最后显示时再精确计算 使用类似这样的公式:(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(y-lat)/360),2)+COS(PI()*x/180)* COS(lat * PI()/180)*POW(SIN(PI()*(x-lng)/360),2))))。

前两项在数据库端计算,后一项在应用服务器端计算即可。

3. XMPP协议扩展

如果要在XMPP协议上增加LBS功能,那么需要我们扩展XMPP,增加新的请求和响应报文。

目前有两种思路来扩展 XMPP,一种是官方的扩展,见XEP0080   http://xmpp.org/extensions/xep-0080.html ,就是在message中增加LBS信息;

Example 1. Entity publishes location

<iq type=‘set‘ from=‘[email protected]/pda‘ id=‘publish1‘>  <pubsub xmlns=‘http://jabber.org/protocol/pubsub‘>    <publish node=‘http://jabber.org/protocol/geoloc‘>      <item>        <geoloc xmlns=‘http://jabber.org/protocol/geoloc‘ xml:lang=‘en‘>          <accuracy>20</accuracy>          <country>Italy</country>          <lat>45.44</lat>          <locality>Venice</locality>          <lon>12.33</lon>        </geoloc>      </item>    </publish>  </pubsub></iq>    

Example 2. Subscriber receives event with payload

<message from=‘[email protected]‘          to=‘[email protected]‘>  <event xmlns=‘http://jabber.org/protocol/pubsub#event‘>    <items node=‘http://jabber.org/protocol/geoloc‘>      <item id=‘d81a52b8-0f9c-11dc-9bc8-001143d5d5db‘>        <geoloc xmlns=‘http://jabber.org/protocol/geoloc‘ xml:lang=‘en‘>          <accuracy>20</accuracy>          <country>Italy</country>          <lat>45.44</lat>          <locality>Venice</locality>          <lon>12.33</lon>        </geoloc>      </item>    </items>  </event></message>    

另一种思路是通过添加自定义的IQ指令来实现,比如我们设计如下:

REQUEST

<iq id="c919" type="get" from="[email protected]/TCL-S960">
<query xmlns="com.nodexy.im.openfire.location">
    <item user="chris" lon="22.323009" lat="29.098763"/>
</query>

注意:

默认iq不设置to属性,则表示发送给 openfire server ,即to=im.nodexy.com ;

如果user a希望将自己的地理位置信息共享发送给好友user b,则需要显式设置[email protected]  ;此时server只会转发此IQ消息不会做其他处理。

RESPONSE

<iq id="c919" type="result" from="[email protected]/TCL-S960">
<query xmlns="com.nodexy.im.openfire.location">
    <item user="chris1" lon="22.323009" lat="29.098763" sex="0" online="30min"/>
    <item user="chris2" lon="22.323009" lat="29.098763" sex="0" online="30min"/>
    <item user="chris3" lon="22.323009" lat="29.098763" sex="0" online="30min"/>
    ... ...
</query>

以上两种思路的优缺点:

  1. XEP 0080 : 官方扩展协议,比较通用,也更加符合LBS是一种特殊的message的理念; 但是可定制性不强,不能增加自己的很多业务逻辑,尤其是“附近的人”功能并不包含;
  2. 增加IQ指令: 更加灵活,按需使用,支持“附近的人”甚至“附近的商家”等;当然缺点就是不通用,属于私有协议,以私有插件形式实现。

本文我们主要采用第二种。

4. Openfire插件实现 

在Openfire中实现LBS功能,可以采用开发新插件的方式来实现上面的扩展协议。

关于openfire插件开发可参考  http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/plugin-dev-guide.html

5. 代码分享

笔者这里分享一个基础版本的OpenfireLBS插件   https://github.com/node/openfireLBS

时间: 2024-11-09 22:21:06

在XMPP的JAVA开源实现Openfire中,增加LBS 附近的人功能的相关文章

java开源内容管理系统 J4CMS增加新样式

java开源j4cms内容管理系统 cms 有新样式了,现在一共有3个样式了,继续增加中,页面直接可添加菜单,内容直接编辑,完全和其他cms不一样,并且是java语言 静态宣传站 http://www.j4cms.com 演示站 http://java4cms.jd-app.com/index.html 测试站 http://bamboocms.jd-app.com/index.html 账户 admin 密码 123 哇哈哈,终于自己可以搞定样式了 一个是oschina风格的,很简单 一个是m

PC-博客首页中增加必应或GOOGLE搜索功能

1 <script type="text/javascript" language="javascript"> 2 function SearchGoogle(parm,path){ 3 form1.action='http://cn.bing.com/search?q='+parm+'+site:'+path; 4 form1.submit(); 5 } 6 </script> 7 <form name="form1&quo

开源中国GIT中Java分类下TOP10项目的活动情况分析

TOP 10 ThinkGem / JeeSite  项目GIT情况统计 145546_JjhV_1245989.jpg (198.18 KB, 下载次数: 0) 下载附件 2 分钟前 上传 从上面看到,总共参与的贡献者有15个人,10个以上提交者有3个,最近1个月一个提交也没有.默认分支文件总数有5490. 从这里可以看出,项目规模比较大.总共的提交数是243个,说明整体活动情况还不错,但是现在的活动性在下降. Issues总数:18个,打开数:10个,已关闭8个. 项目最近提交情况 1509

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载)

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载) 说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案: 问题由来     假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A.B在不同的售票窗口均同时查询到了某车厢卧铺中.下铺位有空位.用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺.当用户A决定订下铺时,系统提示下铺已经被预订,请重新选择铺位.在这个系统场景中,我们来探讨一下,火车票

(转)Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous

转:http://blog.csdn.net/coding_me/article/details/39524137 SASL  的认证方式包括: 1. PLAIN:plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施.因此,使用plain机制时,你可能会想要结合tls. 2.DIGEST-MD5:使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输.验证过程是从服务器先提出cha

Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous

SASL  的认证方式包括: 1. PLAIN:plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施.因此,使用plain机制时,你可能会想要结合tls. 2.DIGEST-MD5:使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输.验证过程是从服务器先提出challenge(质询)开始, 客户端使用此challenge与隐性密码计算出一个response(应答).不同的cha

一个强大的Java开源遥感处理软件(库)---Beam

1.Beam简介 为了在Hadoop中可以序列化HDF文件,在各种搜索之后,无意中发现了一个强大的Java开源软件,它就是Beam. 对于从事遥感的研究者来说,可以通过安装Beam,将它当成一个强大开源的遥感处理软件使用.虽然没有envi那么好用,还马马虎虎过得去.至少安装Beam,不用授权文件去破解~ 对于遥感软件开发人员来说,Beam的库简直一大利器!!! 用Java实现什么重投影.波段运算.主成分分析.图像裁剪.图像镶嵌,创建直方图,五花八门.各式各样.繁简不一的遥感操作,对它来说都是一碟

11大Java开源中文分词器的使用方法和分词效果对比

本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断. 11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: /** * 获取文本的所有分词结果, 对比不同分词器结果 * @author 杨尚川 */ public interface WordSegmenter {

java开源资源

开到一遍不错的java开源整理,摘录一下,后续遇到好的继续更新. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Gradle采用增量构建.Gradle通过Groovy编程而不是传统的XML声明进行配置.Gradle可以很好地配合Maven进行依赖管理,并且把Ant脚本当作头等公民. 字节码操