XMPP 开发相关 - mindpin/knowledge-space-net-lib GitHub Wiki
服务器端
ejabberd how-to
ejabberd 安装
- Mac 下直接使用 brew install ejabberd,默认安装到 usr/local/Cellar/ejabberd/ 目录
- linux/windows 还未具体实践
- ubuntu 下的安装,可以参考
ejabberd 数据库
ejabberd 相关命令
- 到安装目录下进入 sbin 目录,mac 下的路径是 /usr/local/Cellar/ejabberd/2.1.13/sbin
- ejabberdctl start 启动该服务
- ejabberdctl stop 停止服务
- ejabberdctl register root localhost password 注册一个新用户, root 替换注册的用户名, password 替换成相应的密码
- ejabberd.cfg (mac 下的目录 /usr/local/etc/ejabberd/ejabberd.cfg) 需要到该文件下设置一个超级用户, 找到有 acl, admin 字眼的地方,加入相关的用户名
- 启动成功后访问 ejabbered 管理界面
支持查看在线用户
- ejabbered 管理界面 找到 Shared Roster Groups 添加一个组, etc: 组名为 friends
- 参考 设置界面
- openfire 设置类似,参考下文
openfire how-to
openfire 安装, 服务器设置
- 下载 openfire 安装包, 目前用的版本是 3.9.1
- 安装过程中会有一些步骤包括 数据库连接信息,服务器设置 等
- 安装完后访问 openfire WEB管理界面
- Mac 下需要在 系统偏好设置下面可以找到 openfire 的设置
支持保存聊天记录到数据库
- plugins 下载界面 下载 Monitoring Service
- 把该 jar 包复制到 openfire 安装目录, 在 mac 下的目录是 /usr/local/openfire/plugins
- 或者在 openfire WEB管理界面 的 插件页面找到 Monitoring Service 下载安装
- 在 openfire WEB管理界面 找到 服务器 -> 档案管理界面 -> 设置档案 启用保存聊天记录选项, 参考设置界面
- 收发信息主要存到 ofMessageArchive 表
- 可能的其它方案: 自己在android客户端截取收发信息存到数据库
支持查看在线用户
- 在 openfire WEB管理界面 找到 用户/组 -> 组 -> 新建组 , 参考设置界面
- 把需要显示在线状态的用户都放到 friends 组
- 暂时的结论: 使用 asmack API 包查询在线用户只能是同一组才能被查看到
openfire web 用户整合方案
方案一: 这是个折中方案,只能将 web 用户表同时复制一份到 openfire 数据库
-
安装 User Service 插件,查看该插件介绍 , 安装的目的是通过 rails web 可以发送 http 请求到 openfire server 进行用户注册,登录,密码修改等, 以此来跟 openfire 数据库用户表保持同步.
-
下载 web rails 客户端 , 这算是一个 demo 用例,主要提供的功能有向 openfire 服务器添加新用户,删除用户,修改密码
方案二: 可以只使用 web 数据库做为唯一验证接口 (尚未完成)
-
下载 openfire 源码 , Eclipse 开发环境的配置需要一些步骤.
-
为了在配置工程路径时可以更为简单一点,将解压后的源码目录重命名为 openfire
-
运行环境配置 Eclipse -> Run -> Run Configurations , main 配置 , classpath 配置 , arguments 配置, Main class:org.jivesoftware.openfire.starter.ServerStarter , VM arguments: -DopenfireHome="${workspace_loc:openfire}/target/openfire"
-
hazelcast 插件会导致一些错误,可以在工程目录 src -> plugins 下将其删除, 同时在 eclipse -> Project -> properties -> Libraries 的引用去掉
-
在运行前,先在工程目录下 build 下面运行 ant, 运行后,如果能正常进行,会生成 target, work 两个目录, 在工程目录 target -> openfire -> conf 下,找到 openfire.xml 文件,可以设置指定的数据库,表等,具体参考 Custom Database Integration Guide , 工程目录 src -> conf 目录下也有个 openfire.xml 目录,但是测试后,不管怎么修改均没有什么效果
-
找到工程目录 src -> java -> org.jivesoftware.openfire.auth -> DefaultAuthProvider.java 文件, authenticate(String username, String password) 方法是该系统提供的一个修改用户名,密码的接口, MyAuthProvider 示例下载
-
openfire web 管理界面找到 Server -> Server Manager -> System Properties 找到 provider.auth.className 属性修改成 MyAuthProvider, 或者在表 ofProperty 将该属性改成相应的值
-
根据 Eclipse 打包 将 MyAuthProvider 生成jar (MyAuthProvider.jar)包,放到 /usr/local/openfire/lib (mac 下的 openfire 安装包路径) , 目录 MyAuthProvider 的功能主要是向 web 服务器发送username, password 相关http 验证请求
-
可以使用 sudo killall java 删除掉用 eclipse 运行生成的进程,重新启动 openfire 安装包相关的服务,可以测试到 MyAuthProvider.jar 有生效
-
authenticate 后面执行到的相关流程, 找到 org.jivesoftware.openfire.auth -> AuthFactory 176 行, org.jivesoftware.openfire.net -> SASLAuthentication 288行
-
暂时的结论跟问题: authenticate(String username, String password) 方法只是校验用户名和密码是否正确的,通过校验后,openfire 还是回去自己的用户数据库或者其它地方,可能是某种cache来查找 username 的数据条目,所以单纯改这个方法是行不通的,理论上还需要从 openfire 的源码中找到查询用户数据库的相关代码进行修改, 这个需要时间进一步尝试
插件开发相关
Android 客户端
- 具体代码 gitcafe 下载地址
- 采用 asmack 来进行相关的 XMPP 管理操作
- 下载 asmack , 引入其中的 jar 包
- asmack API 文档
Android 客户端测试
- 使用 openfire/ejabberd WEB管理界面 或者 ejabberd 命令行 注册几个账号,目的是用于互发信息
- 访问 ejabbered 管理界面 , 如果是用IP形式来访问,用户名要用 username@localhost 形式
- 目前个人使用 root@localhost, arch@localhost, arly@localhost 三个用户名进行测试
- 使用 mac 下 adium 登录测试是否能连接上本地配置好的服务器
- 下载 android 代码,修改 host 信息
Web 客户端
- 采用 Ruby 方案
- Strophe.js, Demo: Candy-Chat
-
尝试部署一下openfire,看看服务端替换之后,android客户端是否不用改动
-
在android客户端上用一个列表列出在线用户(除了当前用户自己),点哪个用户就和哪个用户聊天
-
聊天改为可以互相聊天,也就是说android可以收消息也可以发消息
-
看看除了文字消息之外,还能发哪些类型的内容(图片?附件文件?音频?)
-
研究和已有web服务如何整合的问题,也就是说是否可以用已有的web服务的用户直接作为聊天服务的用户, 是否可以用其他web服务已有的用户名密码来登录。可以尝试查找其他人已经有的好的实践。
-
看看服务端是否保存聊天记录。如果服务端不保存聊天记录,怎么自己记。
-
如果服务端保存聊天记录,该保存格式是否兼容,切换服务器(比如从 ejabberd 切换到 openfire,聊天记录怎么转移。)
-
尝试实现用户看聊天记录的功能。
-
看看有没有基础的用户分组机制,简单研究一下
Web 功能
- 注册,登录
- 查看用户在线
- 查看用户聊天记录功能
手机功能
- 登录
- 查看在线用户,可以相互聊天
- 查看聊天记录
部署
通过研究后,总结出了一套部署方法,参考在现有web服务下部署openfire并整合用户的方案