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功能的增强表现,它的主要任务: ...
随机推荐
- JDBC删除表数据
delete 必须使用where 条件指定删除哪一行数据.通常用具有唯一性的主键进行标示. package qddx.JDBC; import java.sql.*; public class Del ...
- c语言数据结构之 堆排序
算法:先生成随机数,赋值到数组,将数组第一个元素a[0]设置为哨兵,函数调用数组和随机数个数n,再设定n/2的根结点与孩子结点进行比较操作,若右孩子存在,则选出三个数里最小的数赋值给根节点,如果右孩子 ...
- caching redirect views leads to memory leak (Spring 3.1)
在Spring 3.1以及以下版本使用org.springframework.web.servlet.view.UrlBasedViewResolver + cache(如下配置),在会出现任意种re ...
- 使用sublime遇到的问题汇总
问题一:用GBK编码的文件用Sublime打开出现中文乱码的解决办法: 通过ctrl+shift+p--package control install安装插件"ConvertToUTF8&q ...
- 用shebang编写一个ssh自动登陆脚本
单例模式是软件开发中非常普遍的一种模式.它的主要作用是确保系统中,始终只存在一个类的实例对象. 这样做的好处有两点: 1.对于需要频繁使用的对象,在每次使用时,如果都需要重新创建,并且这些对象的内容都 ...
- cocos2d-x 帧循环不严谨造成场景切换卡顿
最近在用cocos2d-x做引导界面,2dx版本是2.2.3,场景切换加上了效果,所有资源都已经使用texturepacker打包预加载,但是在实际运行调试中,场景切换相当卡顿. 各种纠结后,无意中将 ...
- Dubbo框架
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- Python线程通信
subprocess 作用 模块用于生产新的进程,连接到其输入.输出.错误管道,并获取其返回值 1. 如何使用subprocess模块 启动子进程的推荐方法是使用以下方便功能. 对于更高级的用例,当这 ...
- httpie工具介绍
github:https://github.com/jkbrzt/httpie 一:HTTPie用途 HTTPie (读aych-tee-tee-pie)是一个 HTTP 的命令行客户端.其目标是让 ...
- Zookeeper
Zookeeper有个客户端,可以上传文件数据.然后Zookeeper有一个数据结构.像一种树.Zookeeper的主要作用有:维护配置文件(实时更新),选举leader(选举机制),感知节点(数据结 ...