`

几种XMPP客户端实现Jingle语音聊天的总结

    博客分类:
  • XMPP
阅读更多
XMPP客户端除了最基本的发送/接收消息,显示好友列表等功能外,语音/视频聊天,文件传输等功能也很有必要. 而XMPP Jingle是实现媒体流的协议. 既然一些客户端和服务器都支持XMPP Jingle, 所以就想测试一下语音聊天的功能.

这里要测试的XMPP客户端有Psi和Spark, 要测试XMPP服务器有Openfire和Google GTalk Server (talk.google.com:5222).
我的网络环境是, 家里有2台笔记本,都通过Wifi连接到无线路由器,而无线路由器通过ADSL连接到外网. 每台笔记本都安装一个客户端, 然后想通过两个客户端来语音聊天. 其中在一个笔记本上同时安装了Openfire服务器.

下面就是我整个测试过程,步骤挺曲折的,无数次失败,好在总算摸清了规律,并且成功了一个case.

Case 1: LaptopA安装了Spark和Openfire, LaptopB安装了Spark.
接收方可以收到语音聊天邀请,但Accept后,发送方或者接收方最后会提示"Session closed due to Closed Remotely"或者"Voice chat ended: No Media Received. This may be caused by firewall configuration problems."



在网上发现很多人也遇到过这样的问题, 但至今没有答案, 而且我将firewall关闭后还是不行. 分析XMPP packets, 一切都是正常的.
<iq id="fSjYO-68" to="zhangsan@hj.com/spark" from="lisi@hj.com/spark" type="set">
  <jingle xmlns="http://jabber.org/protocol/jingle" initiator="lisi@hj.com/spark" responder="zhangsan@hj.com/spark" action="transport-info" sid="5856340275725448398">
    <content name="Audio-Content">
      <transport xmlns="http://jabber.org/protocol/jingle/transport/ice">
        <candidate generation="1" ip="hj.com" port="16552" network="1" username="1" password="2011457701536237394" preference="0" type="relay"/>
      </transport>
    </content>
  </jingle>
</iq>

<iq id="XUxSY-71" to="lisi@hj.com/spark" from="zhangsan@hj.com/spark" type="set">
  <jingle xmlns="http://jabber.org/protocol/jingle" initiator="lisi@hj.com/spark" responder="zhangsan@hj.com/spark" action="transport-info" sid="5856340275725448398">
    <content name="Audio-Content">
      <transport xmlns="http://jabber.org/protocol/jingle/transport/ice">
        <candidate generation="1" ip="192.168.1.102" port="11294" network="0" username="1" password="5230389440376589888" preference="2195" type="prflx"/>
      </transport>
    </content>
  </jingle>
</iq>



Case 2: LaptopA安装了Psi和Openfire, LaptopB安装了Psi.
接收方可以收到语音聊天邀请,但Accept后, 最后发送方会提示"Call was rejected or terminated". 通过分析XMPP packets,发现原来LaptopA的Psi获得的candidates地址是"127.0.0.1", LaptopA当然不能通过这个地址来和LaptopB进行语音聊天了, 原因估计是Openfire也安装在LaptopA. 如果有第三台电脑安装Openfire,估计能成功, 可惜实在不想启动家里那台过时速度极慢的台式机了.

<iq type="set" to="zhangsan@hj.com/A23" id="aac0a" >
<jingle xmlns="urn:xmpp:jingle:1" initiator="lisi@hj.com/laptop-hj" action="session-initiate" sid="uIHg21D8Q8UJkWsf" >
<content creator="initiator" name="A" senders="both" >
<description xmlns="urn:xmpp:jingle:apps:rtp:1" media="audio" >
<payload-type id="110" name="SPEEX" clockrate="16000" />
</description>
<transport xmlns="urn:xmpp:jingle:transports:ice-udp:1" pwd="dODoWCJnXPqeIneJwCrA28" ufrag="2PAp" />
</content>
</jingle>
</iq>


<iq from="zhangsan@hj.com/A23" type="result" to="lisi@hj.com/laptop-hj" id="aac0a" />


<iq type="set" to="zhangsan@hj.com/A23" id="aac1a" >
<jingle xmlns="urn:xmpp:jingle:1" action="transport-info" sid="uIHg21D8Q8UJkWsf" >
<content creator="initiator" name="A" >
<transport xmlns="urn:xmpp:jingle:transports:ice-udp:1" pwd="dODoWCJnXPqeIneJwCrA28" ufrag="2PAp" >
<candidate generation="0" network="0" port="8010" protocol="udp" component="1" foundation="0" ip="127.0.0.1" priority="2130706431" type="host" id="my51NYF8wP" />
<candidate generation="0" network="0" port="8011" protocol="udp" component="2" foundation="0" ip="127.0.0.1" priority="2130706430" type="host" id="LS4DE8k7vO" />
</transport>
</content>
</jingle>
</iq>


<iq from="zhangsan@hj.com/A23" type="set" to="lisi@hj.com/laptop-hj" id="aac1a" >
<jingle xmlns="urn:xmpp:jingle:1" action="transport-info" sid="uIHg21D8Q8UJkWsf" >
<content creator="initiator" name="A" >
<transport xmlns="urn:xmpp:jingle:transports:ice-udp:1" pwd="eLRa7cHeUu54G0DsHCss1C" ufrag="Tfvb" >
<candidate generation="0" network="0" port="8010" protocol="udp" component="1" foundation="0" ip="192.168.1.102" priority="2130706431" type="host" id="tOKbYm1G9C" />
<candidate generation="0" network="0" port="8011" protocol="udp" component="2" foundation="0" ip="192.168.1.102" priority="2130706430" type="host" id="LYcHQKgbQy" />
</transport>
</content>
</jingle>
</iq>


<iq type="result" to="zhangsan@hj.com/A23" id="aac1a" />


<iq from="zhangsan@hj.com/A23" type="result" to="lisi@hj.com/laptop-hj" id="aac1a" />


<iq from="zhangsan@hj.com/A23" type="set" to="lisi@hj.com/laptop-hj" id="aac2a" >
<jingle xmlns="urn:xmpp:jingle:1" action="session-terminate" sid="uIHg21D8Q8UJkWsf" >
<reason>
<gone/>
</reason>
</jingle>
</iq>


<iq type="result" to="zhangsan@hj.com/A23" id="aac2a" />



Case 3: Psi和Spark互联
失败. 原来这两者目前支持的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来实现的, 可以参照一篇介绍: http://supermmx.org/blog/20061019_gtalk

放弃了!!!
突然, 想起来了, Jingle的实现其实不需要服务器有什么改动的, 主要是要求客户端的支持. Jingle是利用当前的XMPP协议来作为信令协议(signaling protocol)来建立和协商会话的, 对于这一点, 服务器不需要改动的,因为这个信令协议只不过是扩展IQ packet加个<jingle>. Jingle的关键是如何两个客户端之间建立流通道, 如果有客户端在NAT之后还需要利用ICE协议实现NAT穿越. 既然Jingle基本上不需要服务器的改动, 那么Google GTalk服务器是可以使用的, 于是就有这个成功的case.


Case 4:  LaptopA安装了Psi, LaptopB安装了Psi, 都连接到Google GTalk服务器
成功!!!!!万岁!!!!!效果还很不错!!!

Case 5:  LaptopA安装了Spark, LaptopB安装了Spark, 都连接到Google GTalk服务器

还是失败. 后面测试打算主要用Psi了, Spark不给力啊, 论坛上那么多问题都没人解答.


  • 大小: 18.4 KB
分享到:
评论
4 楼 JasonOldWoo 2014-07-02  
原因在于没有一台公网的服务器,或者服务器和客户端都在一个局域网下也行。你可以在笔记本上装个虚机用作服务器。
3 楼 xiao2shiqi 2013-04-05  
你好LZ,很钦佩您的领悟能力。
小弟最近也在研究Jingle的语音通信,
客户端是自己开发的,目前在Jingle建立连接上也遇到了很头痛的问题。
不知能否讨论交流一下。
不知能否方面共享下建立连接的代码一看呢?
2 楼 xiangziwade 2012-01-03  
看这个聊天界面截图,感觉你使用的是win7系统。如果是的话,问题应该就在这儿了。好像是因为Jingle的语音是使用jmf(java media framework)开发的,而这个jmf已经很久没更新了,简言之就是不支持win7。之前在网上google到一些解决方案,不过虽然是把jmf本身调通了,但是客户端间的语音通信还是连不上,提示内容也没变。
1 楼 laiyangdeli 2011-02-06  
XMPP协议可扩展协议有利有弊啊,除了核心所有客户端都支持外,其他扩展协议很多都是不同的客户端都不能互联,只能同一种客户端互联.

相关推荐

Global site tag (gtag.js) - Google Analytics