ejabberd的组件开发其实是非常简单的,只要遵循其gen_mod规范,添加iq处理函数就可以了。下面一步步教大家如何开发ejabberd组件。

首先,最好是自己编译ejabberd源码,这样的话把自己写的组件直接放到ejabberd源码目录src中进行编译即可,在我的博客http://blog.csdn.net/yangchen521/article/details/41970069中简单介绍了如何在ubuntu中安装ejabberd,主要是解决好依赖问题,使用apt-getinstall libssl-dev expat libexpat1-dev libyaml-0-2libyaml-dev git rebar安装好ejabberd所需的依赖库,剩下的才是./configuremake make install。如果依赖问题处理不好,编译ejabberd还是比较痛苦的。

编译安装完以后可以使用命令sudoejabberdctl live启动ejabberd看是否会报错。ubuntu下的用户需要注意了,即便你在shell中suroot里,启动的时候也要带上sudo,否则可能会报找不到配置文件的错误。ejabberd默认的beam安装路径是/lib/ejabberd/ebin,配置文件的目录是/etc/ejabberd,一定要记住这两个目录,我们做插件开发的时候会用频繁到这两个目录的。

现在开始写我们的IQ处理插件吧。ejabberd规定所有的插件必须遵循gen_mod模式,gen_mod非常简单,只需导出两个函数start/2,stop/1即可,分别用于启动和停止插件,函数形式如下:

其中Host是运行插件的虚拟主机名,Opts是我们在配置文件中为插件设置的一些参数,这些参数可以通过ejabberd提供的API函数gen_mod:get_opt/3进行读取。

写完start和stop函数,我们的插件就具备了基本的骨架,剩下的就是给他添砖加瓦,丰富功能了。在这里,我们开发一个插件,用于解惑客户端发向服务端的IQ。

首先,我们写一个处理IQ的函数,函数形式必须为Function/3,三个参数依次是From,To,IQ,看名字就知道每个变量的含义了,不需多言。简单的函数如下:

这个函数实现的功能非常简单,就是受到IQ后,修改type为result,然后添加<yangxiaodongxmlns=”im.test” age=”18” school=”nwpu”/>这样一个节点到iq节点下。

处理IQ的函数写好了,如何使他能够解惑IQ呢,这时就需要调用ejabberdAPI向系统注册这样一个处理函数,调用方法如下:

参数Scope的取值有两种,分别为ejabberd_local和ejabberd_sm,他们有什么区别呢,当取值ejabberd_local时,将只处理以服务端为目标的IQ,即IQ里的to填的是服务器的域名;当取值ejabberd_sm时,将处理客户端之间交互的IQ。Host是服务端的域名,Namespace就是要处理的IQ的命名空间,Module,Function用于确定回掉函数的地址,IQDisc用于制定回掉函数的运行方式:no_queue,在当前线程里处理,处理完返回;one_queue,开启一个单独线程去处理;{queues,N},开启N个线程处理接受到的IQ,parallel,没接收到一个IQ就开启一个线程。一般用one_queue就可以了。

好了,IQ处理的函数已经写好,也注册进去了,接下来就是编译和配置了。在ejabberd源码目录中(在14.07版本中,直接进入解压目录即可,不需进入src目录)使用rebarcompile编译,将生成的beam文件拷贝到/lib/ejabberd/ebin中,并且修改/etc/ejabberd/ejabberd.yml文件,添加我们开发的模块,如下:

重启ejabberd,我们使用PSI向服务端发IQ进行测试,OK,大功告成。

最后,附上完整源码,供大家参考指正。

 

Ejabberd 插件开发 --- IQ截获与处理的更多相关文章

  1. Ejabberd外部组件开发

    Ejabberd的基本介绍就不多言了,使用erlang开发的高并发高稳定性XMPP服务器,在whatsapp中得到了应用,算是erlang领域一个杀手级应用.前面的文章中我已经总结了Ejabberd插 ...

  2. ejabberd服务端开发笔记

    网上一搜一大陀ejabberd安装配置的,扩展开发的资料少之又少,写个笔记记录一下. xmpp protocal: http://xmpp.org/xmpp-protocols/xmpp-extens ...

  3. PhoneGap 在 Android 上的插件开发方法介绍

    移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...

  4. ejabberd源码流程梳理

    ejabberd的工程主要通过ejabberd.app 组织起来 ejabberd.erl : application:start(ejabberd). ejabberd_app.erl: Mod:s ...

  5. ejabberd模块开发

    参考: http://anders.conbere.org/journal/ http://www.process-one.net/en/wiki/ejabberd_module_developmen ...

  6. 基于XMPP的即时通信系统的建立 — XMPP IQ详解

    XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...

  7. Moodle插件开发——Blocks(版块)

    前提: 1)     基于Moodle3.0,要求Moodle版本高于2.0 2)     PHP编程基础:语言的了解和开发工具使用 有经验的开发人员和那些只是想程序员的参考文本应参阅附录A. 1.  ...

  8. ejabberd日志分析客户端登录流程

    通过ejabberd的日志,整理了下客户端登录流程. 1. 通过TCP连接5222端口的流程: (1) 客户端向服务器发送stream流 <stream:stream to="nba. ...

  9. (转)OpenFire源码学习之十五:插件开发

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43418493 Plugin接口规范 插件是openfire功能的增强表现,它的主要任务: ...

随机推荐

  1. JavaScript 获取数组中最大值、最小值

    笨方法 Array.prototype.max = function() { var max = this[0]; var len = this.length; for (var i = 1; i & ...

  2. java虚拟机判断对象是否存活的方式

    引用计数算法:   给对象添加一个引用计数器,每当有地方应用时,计数器值就加一,当引用失效时,程序计数器就减一,只要引用计数器的值为零时,就表示对象不可能再被引用,例如微软的 component ob ...

  3. dede currentstyle属性完美解决方案

    问题一.dede让channelartlist标签支持currentstyle属性 完美解决 打开include\taglib\channelartlist.lib.php找到$pv->Fiel ...

  4. 413 Request Entity Too Large

    做小视频上传,结果接口总是返回500,服务器端跟踪,根本就进不来,再次翻查,发下服务器返回的其实是413,只不过APP底层接口将所有不是200的回包都转成500了,问题定位. 有了错误码,有了描述,字 ...

  5. study java language

    2016.11.30 1).About the Java Technology 2).The Java Language Environment: Contents

  6. jquery+ajax跨域请求webservice

    最近几天在学习webservice...在学习的时候便想到用ajax的方式去请求webservice.. 一直在测试..如果这个被请求的webservice和自己使用的是同一个端口号.则不用考虑那aj ...

  7. JDBC查询数据库中的数据

    只用JDBC技术查询表中的全部内容时,需要使用查询全部的SQL语句,把查询结果放到List集合中. package qddx.JDBC; import java.util.*; import java ...

  8. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  9. linux性能指令分析进阶篇

    作为刚刚走入测试领域的我来说,对性能测试了解的也不是很深,只不过自己平常一直在收集资料,性能测试也没有那么神秘,也请广大测试小白不要陷入误区,其实性能测试跟功能测试关系并不大,即使你做10年功能测试, ...

  10. install google chrome

    32bit: wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb sudo dpkg -i go ...