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. iOS开发 适配iOS10以及Xcode8

    iOS10的适配以及Xcode8使用上的一些注意点 一.证书管理 用Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书.建议大家勾选这个Automaticall ...

  2. js或jquery如何获取父级、子级、兄弟元素(包括祖级、孙级等)

    原生javascript方法: var a = document.getElementById("dom"); del_space(a); //清理空格 var b = a.chi ...

  3. hiho一下21周 线段树的区间修改 离散化

    离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...

  4. LeetCode() Merge Intervals 还是有问题,留待,脑袋疼。

    感觉有一点进步了,但是思路还是不够犀利. /** * Definition for an interval. * struct Interval { * int start; * int end; * ...

  5. [Note] Build your SDL2 Environment in Visual Studio 2013 配置你的SDL2运行环境

    Right key your project in "solution manager(解决方案资源管理器)", choose the "Property(属性)&quo ...

  6. 关于SQL Cookbook里dept与emp表结构以及数据

    用MYSQL 写了一下,将number变成int, to_date去掉即可. DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` ) ...

  7. php的一些问题

    1.关于php <? php echo "hello world"; include "./index.html"; require "./in ...

  8. 文件操作 模式r+与w+

    r+与w+ r+是读写模式,在文件的末尾进行追加操作. >>> myfile=open('pwd.txt', ... 'r+') >>> myfile.read() ...

  9. 当窗体获得焦点时禁用max快捷键

    最近一段时间一直在MXS里用dotnet写界面...写的各种头晕眼花... 过程中遇到了 TextBox 控件输入时 与max快捷键冲突的问题. 解决办法是 用 MaxTextBox 控件替换,今天请 ...

  10. 关于VR边纹理材质的渲染

    前段时间经常渲染白模线框的图,写了这个脚本方便工作,后来又加了中英文适配,今天贴上来. fn YY_edgestex = ( vr = renderers.current case of ( (vr材 ...