XMPP客户端除了最基本的发送/接收消息,显示好友列表等功能外,语音/视频聊天,文件传输等功能也很有必要. 而XMPP Jingle是实现媒体流的协议. 既然一些客户端和服务器都支持XMPP Jingle, 所以就想测试一下语音聊天的功能.
这里要测试的XMPP客户端有Psi和Spark, 要测试XMPP服务器有Openfire和Google GTalk Server (talk.google.com:5222).
我的网络环境是, 家里有2台笔记本,都通过Wifi连接到无线路由器,而无线路由器通过ADSL连接到外网. 每台笔记本都安装一个客户端, 然后想通过两个客户端来语音聊天. 其中在一个笔记本上同时安装了Openfire服务器.
下面就是我整个测试过程,步骤挺曲折的,无数次失败,好在总算摸清了规律,并且成功了一个case.
[b]Case 1: LaptopA安装了Spark和Openfire, LaptopB安装了Spark.[/b]
接收方可以收到语音聊天邀请,但Accept后,发送方或者接收方最后会提示"Session closed due to Closed Remotely"或者"Voice chat ended: No Media Received. This may be caused by firewall configuration problems."
[img]http://dl.iteye.com/upload/attachment/408009/4daafabc-d6d8-372b-9fcf-3a29de1f5228.jpg[/img]
在网上发现很多人也遇到过这样的问题, 但至今没有答案, 而且我将firewall关闭后还是不行. 分析XMPP packets, 一切都是正常的.
[b]Case 2: LaptopA安装了Psi和Openfire, LaptopB安装了Psi.[/b]
接收方可以收到语音聊天邀请,但Accept后, 最后发送方会提示"Call was rejected or terminated". 通过分析XMPP packets,发现原来LaptopA的Psi获得的candidates地址是"127.0.0.1", LaptopA当然不能通过这个地址来和LaptopB进行语音聊天了, 原因估计是Openfire也安装在LaptopA. 如果有第三台电脑安装Openfire,估计能成功, 可惜实在不想启动家里那台过时速度极慢的台式机了.
[b]Case 3: Psi和Spark互联[/b]
失败. 原来这两者目前支持的transport method不一样,从Case 1和2的XMPP packets可以发现, Spark支持"http://jabber.org/protocol/jingle/transport/ice",而Psi支持"urn:xmpp:jingle:transports:ice-udp:1",搞不懂两者有什么区别. 看来两个不同的IM完全互联也不是那么容易的.
到这里我已经有些灰心了,各种组合都试过了,都不行, Psi和Psi是有希望的,但需要第三台电脑运行Openfire服务器, 有没有其他的服务器,除了Google GTalk服务器, 但Gooelg GTalk目前不是完全按照Jingle来实现, 虽然Jingle是Google提出来的. 按照他们的说法, 等Jingle标准稳定下来后他们会按照Jingle来实现的, 可以参照一篇介绍: [url]http://supermmx.org/blog/20061019_gtalk[/url]
[b]放弃了!!!
突然, 想起来了, Jingle的实现其实不需要服务器有什么改动的, 主要是要求客户端的支持. Jingle是利用当前的XMPP协议来作为信令协议(signaling protocol)来建立和协商会话的, 对于这一点, 服务器不需要改动的,因为这个信令协议只不过是扩展IQ packet加个
. Jingle的关键是如何两个客户端之间建立流通道, 如果有客户端在NAT之后还需要利用ICE协议实现NAT穿越. 既然Jingle基本上不需要服务器的改动, 那么Google GTalk服务器是可以使用的, 于是就有这个成功的case.[/b]
[b]Case 4: LaptopA安装了Psi, LaptopB安装了Psi, 都连接到Google GTalk服务器[/b]
成功!!!!!万岁!!!!!效果还很不错!!!
[b]Case 5: LaptopA安装了Spark, LaptopB安装了Spark, 都连接到Google GTalk服务器
[/b]
还是失败. 后面测试打算主要用Psi了, Spark不给力啊, 论坛上那么多问题都没人解答.