`

几种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协议可扩展协议有利有弊啊,除了核心所有客户端都支持外,其他扩展协议很多都是不同的客户端都不能互联,只能同一种客户端互联.

相关推荐

    android的XMPP客户端

    在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)客户端是一项常见的任务,因为XMPP是一种广泛使用的即时通讯协议,尤其适用于构建实时通信应用,如聊天、视频通话等。本篇文章将深入探讨...

    JAVA实现XMPP客户端和服务器

    总结,使用Java实现XMPP客户端和服务器,涉及到的知识点包括XMPP协议原理、Java编程、网络通信、XML处理、服务器部署以及客户端UI设计。通过该项目,开发者可以深入理解和实践即时通讯系统的构建,提升相关技能。

    黑莓XMPP客户端实现参例

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛应用于即时通讯、在线状态管理和多用户聊天室等场景。在黑莓平台上实现XMPP客户端可以帮助用户与使用相同协议的服务进行交互...

    xmpp客户端源代码

    XMPP客户端的核心组件包括以下几个部分: 1. **连接管理**:XMPP客户端需要建立和维护与XMPP服务器的连接。这通常通过使用`XMPPTCPConnection`类来实现,该类负责建立TCP连接,并处理心跳保持、重连策略等。 2. **...

    xmpp 客户端与服务器

    类似于xmpp协议的服务器与客户端代码。具体自己看

    xmpp客户端简单实现

    c#简单实现xmpp客户端,服务器openfire,可以登录及调试xmpp协议

    xmpp客户端协议实现源代码

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛应用于即时通讯、VoIP、协作软件等场景。本资源包含了一个名为"smack"的库的源代码,该库是实现XMPP客户端协议的一个流行选择...

    Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,广泛用于实时通讯应用,如聊天、文件传输和在线状态通知。 首先,让我们了解XMPP的核心概念。XMPP基于客户端-服务器架构,其中客户端...

    xmpp客户端开发库

    总结来说,XMPP客户端开发涉及了网络通信、XML处理、身份验证等多个技术领域,而C语言库如txmpp则为开发者提供了一种实现这些功能的底层工具。在实际项目中,结合合适的开发库和深入的XMPP协议理解,可以构建出高效...

    XMPP JINGLE Jar包

    XMPP JINGLE Jar包 可以实现语音聊天功能

    android版XMPP客户端

    在IT行业中,Android版XMPP客户端是一个专门针对Android平台开发的即时通讯应用,它利用了XMPP(Extensible Messaging and Presence Protocol)协议来实现实时的聊天功能。XMPP是一种基于XML的开放标准,广泛应用于...

    【最新版】Psi%2B-1.4.1105-macOS10.13-x86_64.dmg【亲测可用】最好的XMPP客户端

    Psi是为经验丰富的用户设计的跨平台功能强大的XMPP客户端。它使用经典的开发模型,其发行版很少见。 Psi +是Psi XMPP客户端的开发分支。借助滚动发布开发模型,用户可以很快地获得新功能和错误修复。

    XMPP客户端

    pandion是支持XMPP的客户端软件,是非常好用的软件资源

    XMPP客户端Java类库:Smack

    XML即时通讯协议(Extensible Messaging and Presence Protocol,简称XMPP)是一种基于XML的开放标准,用于实现实时通讯和在线状态管理。它被广泛应用于即时消息、VoIP、文件传输等领域,尤其在企业级通信解决方案中...

    xmpp聊天部分,语音思路

    XMPP(Extensible Messaging and Presence Protocol)是一种...总的来说,XMPP结合Speex提供了一种有效且灵活的实现移动设备间语音聊天的方式,同时考虑到各种处理器架构的兼容性,使其在iOS平台上具有广泛的应用前景。

    xmpp客户端:psi

    xmpp客户端:psi-0.14-win-setup.exe

    基于XMPP实现android客户端与服务器的交互(服务器、客户端源码)

    通过使用XEP(XMPP Extension Protocols),开发者可以实现更多的功能,如多用户聊天室、语音通话、位置共享等。 为了确保安全,XMPP支持TLS/SSL加密,可以保护通信数据不被窃取。同时,服务器端的身份验证机制也是...

    xmpp服务器和android客户端源码

    XMPP(Extensible Messaging and Presence Protocol)是一种实时通信协议,常用于实现即时消息、语音和视频通话等功能。在这个“xmpp服务器和android客户端源码”项目中,我们涉及到了XMPP服务器的搭建与Android...

    Habber - IOS XMPP 客户端教程 源码

    本教程将通过Habber项目,详细解析如何在iOS上创建一个XMPP客户端,实现聊天功能。 首先,我们需要理解XMPP的基本工作原理。XMPP基于TCP/IP连接,采用长连接模式,用户上线后保持与服务器的持续通信,以便实时接收...

    IOS XMPP 聊天程序客户端

    总结来说,iOS上的XMPP聊天程序客户端开发涉及到XML解析、网络编程、多线程以及特定的XMPP协议处理。开发者需要理解XMPP协议原理,熟练使用XMPPFramework,以及具备良好的iOS应用设计和优化能力。通过不断实践和学习...

Global site tag (gtag.js) - Google Analytics