Ejabberd 插件开发 --- IQ截获与处理
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截获与处理的更多相关文章
- Ejabberd外部组件开发
Ejabberd的基本介绍就不多言了,使用erlang开发的高并发高稳定性XMPP服务器,在whatsapp中得到了应用,算是erlang领域一个杀手级应用.前面的文章中我已经总结了Ejabberd插 ...
- ejabberd服务端开发笔记
网上一搜一大陀ejabberd安装配置的,扩展开发的资料少之又少,写个笔记记录一下. xmpp protocal: http://xmpp.org/xmpp-protocols/xmpp-extens ...
- PhoneGap 在 Android 上的插件开发方法介绍
移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...
- ejabberd源码流程梳理
ejabberd的工程主要通过ejabberd.app 组织起来 ejabberd.erl : application:start(ejabberd). ejabberd_app.erl: Mod:s ...
- ejabberd模块开发
参考: http://anders.conbere.org/journal/ http://www.process-one.net/en/wiki/ejabberd_module_developmen ...
- 基于XMPP的即时通信系统的建立 — XMPP IQ详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- Moodle插件开发——Blocks(版块)
前提: 1) 基于Moodle3.0,要求Moodle版本高于2.0 2) PHP编程基础:语言的了解和开发工具使用 有经验的开发人员和那些只是想程序员的参考文本应参阅附录A. 1. ...
- ejabberd日志分析客户端登录流程
通过ejabberd的日志,整理了下客户端登录流程. 1. 通过TCP连接5222端口的流程: (1) 客户端向服务器发送stream流 <stream:stream to="nba. ...
- (转)OpenFire源码学习之十五:插件开发
转:http://blog.csdn.net/huwenfeng_2011/article/details/43418493 Plugin接口规范 插件是openfire功能的增强表现,它的主要任务: ...
随机推荐
- 医院管理者必须知道的医院客户关系管理(CRM)
客户关系管理(customer relationship management,CRM)是在二战之后首先由美国IBM.道氏.通用等大型企业提出并运用的一种以有效销售为目的的市场营销思想,其理论基础就是 ...
- SQL组合查询的存储过程写法
最进一个项目 里面有个查询的功能,它是进行组合查询的, 而且用的是存储过程写.写这样的存储过程,需要注意单引号的使用,请看本人下面的例子,假如你以后写的话 记得注意写就行: create proc s ...
- 使用java连接MySQL数据库
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import com.mys ...
- SDWebImageManager.m:244:22: Too many arguments to function call, expected 0,have 5
SDWebImageManager.m:244:22: Too many arguments to function call, expected 0,have 5选中项目 Build Setting ...
- html EVENT对象
Event 对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! onabort 图像的加 ...
- JS 获取地址栏三级域名
<script type="text/javascript"> function Char(str) { var uchars = {}; str.replace(/\ ...
- python操作
用python做OI题实在不是一个明智的选择 if __name__ == "__main__":相当于c艹的int main(),然而似乎没有也可以? 重定向标准输入输出流:sy ...
- Linux中MySQL的基本操作
1. 用root用户登录mysql mysql -u root -p 2. 查看database show databases; 3. 查看table use database名 show table ...
- Nginx-解读内置非默认模块 ngx_http_stub_status_module
1.Background ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的 ...
- 10天学会phpWeChat——第三天:从数据库读取数据到视图
在第二天,我们创建了我们的第一个phpWeChat功能模块,但是比较简单.实际生产环境中,我们不可能有如此简单的需求.更多的情况是数据存储在MySql数据库中,我们开发功能模块的作用就是将这些数据从M ...