ejabberd服务端开发笔记
网上一搜一大陀ejabberd安装配置的,扩展开发的资料少之又少,写个笔记记录一下。
xmpp protocal: http://xmpp.org/xmpp-protocols/xmpp-extensions/
安装与配置:
http://www.process-one.net/docs/ejabberd/guide_en.html
默认配置文件在 /etc/ejabberd/ejabberd.cfg
1
git clone git://github.com/processone/ejabberd.git ejabberd
cd ejabberd
git checkout -b 2.1.x origin/2.1.x
2
sudo apt-cache search libyaml
sudo apt-get install libyaml-dev
3. cd ejabberd/src
./configure
make
报错:erl_driver.h: No such file or directoryERLANG_CFLAGS=
vi Makefile发现ERLANG_CFLAGS和ERLANG_LIBS所指目录不对,居然使用了我编译erlang时的源文件而没有使用/usr/local/...
解决方法也很简单,把编译erlang用的源文件(otp-src-R16B01)删除,再次./configure即可。因为这样configure的时候就不会找到
4.
sudo make install
5.
The files and directories created are, by default:
- /etc/ejabberd/
- Configuration directory:
- ejabberd.yml
- ejabberd configuration file
- ejabberdctl.cfg
- Configuration file of the administration script
- inetrc
- Network DNS configuration file
- /lib/ejabberd/
-
- ebin/
- Erlang binary files (*.beam)
- include/
- Erlang header files (*.hrl)
- priv/
- Additional files required at runtime
- bin/
- Executable programs
- lib/
- Binary system libraries (*.so)
- msgs/
- Translation files (*.msgs)
- /sbin/ejabberdctl
- Administration script (see section 4.1)
- /share/doc/ejabberd/
- Documentation of ejabberd
- /var/lib/ejabberd/
- Spool directory:
- .erlang.cookie
- Erlang cookie file (see section 5.3)
- acl.DCD, ...
- Mnesia database spool files (*.DCD, *.DCL, *.DAT)
- /var/log/ejabberd/
- Log directory (see section 7.1):
- ejabberd.log
- ejabberd service log
- erlang.log
- Erlang/OTP system log
6.
ejabberdctl start ejabberdctl status
The node ejabberd@localhost is started with status: started
ejabberd is running in that node ejabberdctl stop
接下来需要使用客户端进行简单的测试,网上搜了一下,选择了smack。
首先写一个注册功能:
- public boolean register(String username, String password) {
- try {
- ConnectionConfiguration config = new ConnectionConfiguration(
- "192.168.17.102", 5222);
- connection = new XMPPConnection(config);
- connection.connect();
- System.out.println("connect ok, user,pass:" + username + " "
- + password);
- AccountManager am = connection.getAccountManager();
- am.createAccount(username, password);
- connection.disconnect();
- } catch (Exception ex) {
- ex.printStackTrace();
- return false;
- }
发现connection ok但是无法注册。检查配置文件,vi /etc/ejabberd/ejabberd.cfg
- {mod_register, [
- %%
- %% Protect In-Band account registrations with CAPTCHA.
- %%
- {captcha_protected, true},
- %%
- %% Set the minimum informational entropy for passwords.
- %%
- %%{password_strength, 32},
- %%
- %% After successful registration, the user receives
- %% a message with this subject and body.
- %%
- {welcome_message, {"Welcome!",
- "Hi.\nWelcome to this XMPP server."}},
- %%
- %% When a user registers, send a notification to
- %% these XMPP accounts.
- %%
- %%{registration_watchers, ["admin1@example.org"]},
- %%
- %% Only clients in the server machine can register accounts
- %%
- {ip_access, [{allow, "127.0.0.0/8"},
- {deny, "0.0.0.0/0"}]},
- %%
- %% Local c2s or remote s2s users cannot register accounts
- %%
- %%{access_from, deny},
- {access, register}
- ]},
将{ip_access, [..., {deny, "0.0.0.0/0"}]}改为allow,再次运行注册代码,发现依然失败。然后改为使用如下代码,注册成功:
- public void register2(String username, String password, String email,
- String fullName) {
- try {
- ConnectionConfiguration config = new ConnectionConfiguration(
- "192.168.17.102", 5222);
- connection = new XMPPConnection(config);
- connection.connect();
- Registration reg = new Registration();
- reg.setType(IQ.Type.SET);
- reg.setTo(connection.getServiceName());
- // attributes.put("username", username);
- // attributes.put("password", password);
- // reg.setAttributes(attributes);
- Map<String, String> attr = new HashMap<String, String>();
- attr.put("username", username);
- attr.put("password", password);
- attr.put("email", email);
- attr.put("name", fullName);
- reg.setAttributes(attr);
- PacketFilter filter = new AndFilter(new PacketIDFilter(
- reg.getPacketID()), new PacketTypeFilter(IQ.class));
- PacketCollector collector = connection
- .createPacketCollector(filter);
- connection.sendPacket(reg);
- IQ result = (IQ) collector.nextResult(SmackConfiguration
- .getPacketReplyTimeout());
- // Stop queuing results
- collector.cancel();// 停止请求results(是否成功的结果)
- if (result == null) {
- System.out
- .println("xmppMainRegiter”, “No response from server.");
- } else if (result.getType() == IQ.Type.ERROR) {
- if (result.getError().toString()
- .equalsIgnoreCase("conflict(409)")) {
- System.out.println("xmppMainRegiter" + " IQ.Type.ERROR: "
- + result.getError().toString());
- System.out.println("conflict");
- } else {
- System.out.println("xmppMainRegiter" + " IQ.Type.ERROR: "
- + result.getError().toString());
- System.out.println("注册失败");
- }
- } else if (result.getType() == IQ.Type.RESULT) {
- System.out.println("注册成功");
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
关于ejabberd各模块的测试,因为mod_*均为gen_*, 可以使用rpc:call/4进行测试某些功能。但是erlang节点的互通需要-setcookie,
vi /var/lib/ejabberd/.erlang.cookie
可以查看ejabberd节点的cookie值,这里查到为FBSFDTMHVUJTXLNXFUE
启动erlang shell, erl -sname test -setcookie FBSFDTMHVUJTXLNXFUE
> rpc:call(ejabberd@localhost, ejabberd_captcha, is_feature_available, [], 10).
> true
成功。
ejabberd的参考资料少之又少,刚才研究了下如何获取验证码。
首先要在/etc/ejabberd/ejabberd.cfg中开启验证。
mod_register:
- {captcha_protected, true}
- %%%. =======
- %%%' CAPTCHA
- %%
- %% Full path to a script that generates the image.
- %%
- {captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
- %%
- %% Host for the URL and port where ejabberd listens for CAPTCHA requests.
- %%
- {captcha_host, "192.168.17.102:5280"}.
- %%
- %% Limit CAPTCHA calls per minute for JID/IP to avoid DoS.
- %%
- {captcha_limit, 5}.
然后看了下mod_register和ejabberd_captcha的代码,把注册请求的IQ.Type.SET改为IQ.Type.GET即可获取验证码信息,得到xml响应如下:
- <iq id="hLfY6-0" from="192.168.17.102" type="result">
- <query xmlns="jabber:iq:register">
- <instructions>You need a client that supports x:data and CAPTCHA to register</instructions>
- <x xmlns="jabber:x:data" type="form">
- <instructions>Choose a username and password to register with this server</instructions>
- <field var="FORM_TYPE" type="hidden">
- <value>urn:xmpp:captcha</value>
- </field>
- <field label="User" var="username" type="text-single">
- <required/>
- </field>
- <field label="Password" var="password" type="text-private">
- <required/>
- </field>
- <field type="fixed">
- <value>If you don't see the CAPTCHA image here, visit the web page.</value>
- </field>
- <field var="captchahidden" type="hidden">
- <value>workaround-for-psi</value>
- </field>
- <field label="CAPTCHA web page" var="url" type="text-single">
- <value>http://192.168.17.102:5280/captcha/2824232941/image</value>
- </field>
- <field var="from" type="hidden">
- <value>192.168.17.102</value>
- </field>
- <field var="challenge" type="hidden">
- <value>2824232941</value>
- </field>
- <field var="sid" type="hidden">
- <value>hLfY6-0</value>
- </field>
- <field label="Enter the text you see" var="ocr">
- <required/>
- </field>
- </x>
- <data xmlns="urn:xmpp:bob"/>
- </query>
- </iq>
验证码图片为
- http://192.168.17.102:5280/captcha/2824232941/image
Over!
控制台输出:
vi /sbin/ejabberdctl
- start ()
- {
- checknodenameusage
- [ "$?" -eq 0 ] && echo "\nERROR: The node '$ERLANG_NODE' is already running." && return 1
- $EXEC_CMD "$ERL \
- $NAME $ERLANG_NODE \
- -noinput -detached \
- -pa $EJABBERD_EBIN_PATH \
- -mnesia dir \"\\\"$SPOOLDIR\\\"\" \
- $KERNEL_OPTS \
- -s ejabberd \
- -sasl sasl_error_logger \\{file,\\\"$SASL_LOG_PATH\\\"\\} \
- $ERLANG_OPTS $ARGS \"$@\""
- }
去掉-noinput -detached
ejabberd服务端开发笔记的更多相关文章
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...
- 在线教学、视频会议 Webus Fox(2) 服务端开发手册
上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...
- Android 服务端开发之开发环境配置
Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...
- Swift3.0服务端开发(三) Mustache页面模板与日志记录
本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统.Mustache页面模板类似于PHP中的smarty模板引擎或者Java中的JSTL标签.当然Mustach ...
- 如何有效快速提高Java服务端开发人员的技术水平?
我相信很多工作了3-5年的开发人员都会经常问自己几个问题: 1.为什么总是感觉技术没有质的提高? 2.如何能够有效和快速的提高自身的技术水平? 3.如何进入到一个牛逼的大公司,认识牛逼的人? 这篇文章 ...
- WCF服务端开发和客户端引用小结
1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...
- socket服务端开发之测试使用threading和gevent框架
socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...
- 个人公众号服务端开发Demo
公众号出来很久了,也可以个人申请.知道公众号的服务端开发其实很简单,接口调用封装,数据存取,不外如是. 人一旦懒了,真的是 “无可救药” 了...现简单描述晚到的公众号HelloWorld 思路 公众 ...
随机推荐
- ROS 使用自带和usb摄像头获取图像
笔记本自带的摄像头的设备号一般为/dev/video0 第一步:安装Webcam 驱动 $ sudo apt-get install git-core $ cd ~/catkin_ws/src $ g ...
- ajax 创建对象验证
function getValue(){ var str = $("#selectid option:selected").val(); //获得选中的值 var num = $( ...
- sqoop的export的说明
1.通用参数说明
- equals 与 ==
Object类中,方法equals():boolean equals(Object obj) { return this==obj;} == 比较两个变量的值是否相等,对于基本类型,==直接比较变 ...
- C#—打开文件
一.打开图片 ps:必须先在pictureBox中导入一张图片 private void button4_Click(object sender, EventArgs e)//选择.更换图片 { if ...
- 在线工具、setHtmlRem、px2rem
http://tool.lu/c/developer 开发类在线工具 https://github.com/leon776/setHtmlRem setHtmlRem https://githu ...
- D - 蜘蛛牌
Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Pract ...
- Sed是个好东西
今天遇到的源码使用了变态的宏,直接对参数进行宏处理,使得我的vim插件几乎全废,只能想办法将宏给替换进去. #!/bin/bash find . -type f -name '*.c' | xargs ...
- 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别
GET: 请求指定的页面信息,并返回实体主体.HEAD: 只请求页面的首部.POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体.PUT: 从客户端向服务器传送的数据取代指定的文档 ...
- Python字典实现三级菜单
################################################ # Task Name: 三级菜单 # # Description:打印省.市.县三级菜单 # # 可 ...