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即可,分别用于启动和停止插件,函数形式如下:

Ejabberd 插件开发 --- IQ截获与处理-LMLPHP

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

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

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

Ejabberd 插件开发 --- IQ截获与处理-LMLPHP

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

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

Ejabberd 插件开发 --- IQ截获与处理-LMLPHP

参数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 插件开发 --- IQ截获与处理-LMLPHP

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

Ejabberd 插件开发 --- IQ截获与处理-LMLPHP

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

Ejabberd 插件开发 --- IQ截获与处理-LMLPHP

 
05-11 18:23