- 浏览: 1478031 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (419)
- XMPP (19)
- Android (180)
- Java (59)
- Network (4)
- HTML5 (13)
- Eclipse (9)
- SCM (23)
- C/C++ (4)
- UML (4)
- Libjingle (15)
- Tools&Softwares (29)
- Linphone (5)
- Linux&UNIX (6)
- Windows (18)
- Google (10)
- MISC (3)
- SIP (6)
- SQLite (5)
- Security (4)
- Opensource (29)
- Online (2)
- 文章 (3)
- MemoryLeak (10)
- Decompile (5)
- Ruby (1)
- Image (1)
- Bat (4)
- TTS&ASR (28)
- Multimedia (1)
- iOS (20)
- Asciiflow - ASCII Flow Diagram Tool.htm (1)
- Networking (1)
- DLNA&UPnP (2)
- Chrome (2)
- CI (1)
- SmartHome (0)
- CloudComputing (1)
- NodeJS (3)
- MachineLearning (2)
最新评论
-
bzhao:
点赞123!
Windows的adb shell中使用vi不乱码方法及AdbPutty -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket 技术介绍 -
obehavior:
view.setOnTouchListenerview是什么
[转]android 一直在最前面的浮动窗口效果 -
wutenghua:
[转]android 一直在最前面的浮动窗口效果 -
zee3.lin:
Sorry~~
When I build "call ...
Step by Step about How to Build libjingle 0.4
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, 一切都是正常的.
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,估计能成功, 可惜实在不想启动家里那台过时速度极慢的台式机了.
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不给力啊, 论坛上那么多问题都没人解答.
这里要测试的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不给力啊, 论坛上那么多问题都没人解答.
评论
4 楼
JasonOldWoo
2014-07-02
原因在于没有一台公网的服务器,或者服务器和客户端都在一个局域网下也行。你可以在笔记本上装个虚机用作服务器。
3 楼
xiao2shiqi
2013-04-05
你好LZ,很钦佩您的领悟能力。
小弟最近也在研究Jingle的语音通信,
客户端是自己开发的,目前在Jingle建立连接上也遇到了很头痛的问题。
不知能否讨论交流一下。
不知能否方面共享下建立连接的代码一看呢?
小弟最近也在研究Jingle的语音通信,
客户端是自己开发的,目前在Jingle建立连接上也遇到了很头痛的问题。
不知能否讨论交流一下。
不知能否方面共享下建立连接的代码一看呢?
2 楼
xiangziwade
2012-01-03
看这个聊天界面截图,感觉你使用的是win7系统。如果是的话,问题应该就在这儿了。好像是因为Jingle的语音是使用jmf(java media framework)开发的,而这个jmf已经很久没更新了,简言之就是不支持win7。之前在网上google到一些解决方案,不过虽然是把jmf本身调通了,但是客户端间的语音通信还是连不上,提示内容也没变。
1 楼
laiyangdeli
2011-02-06
XMPP协议可扩展协议有利有弊啊,除了核心所有客户端都支持外,其他扩展协议很多都是不同的客户端都不能互联,只能同一种客户端互联.
发表评论
-
Android Push Notification
2012-03-22 16:09 1222http://sourceforge.net/projects ... -
使用 XMPP 构建一个基于 web 的通知工具
2011-03-01 10:32 1526http://www.ibm.com/developerwor ... -
Smack 3.2.0 Beta has been released
2011-02-27 20:10 1311大约2个星期前, Smack发布3.2.0 Beta版. 距离 ... -
Jingle XMPP stanza对应的XML schema
2011-02-25 20:22 2868一个典型的Jingle XMPP stanza: <i ... -
GMail add 'voice and video chat' support
2011-02-18 13:32 1915GMail增加对视频聊天的 ... -
Ident协议
2011-02-08 18:06 3198为何要安装 identd ? 曾听过有人形容 id ... -
[原创]使用Smack库实现Google Talk XMPP Extensions - Gmail Notifications (含完整的实现代码以及例子)
2011-02-07 21:39 2602注意: 这里有本人所写的完整的代码, 所以如果要转载, 请征得 ... -
贴个XMPP logs看看Pidgin是如何传输文件的
2011-02-07 20:40 2557zhangsan给lisi发送01.jpg文件. (20:2 ... -
晕, Pidgin在Windows上不支持Voice&Viedo
2011-02-07 20:03 1543从http://pidgin.im/上下载了最新版本2.7.9 ... -
[转]XMPP协议之Socket5 Bytestream文件传输
2011-02-06 21:55 5747From: http://bbs.7boo.com.cn/th ... -
GTALK的运行参数
2011-02-06 21:51 1799/nomutex 同时打开多个Talk。 /forcestar ... -
Smack Jingle库所用的JSTUN库存在的bug
2011-02-06 19:52 4444运行Smack Jingle demo时(http://fis ... -
Google Talk Call Signaling
2011-02-05 22:53 1365http://code.google.com/intl/zh- ... -
关于ejabberd在Windows 7无法启动
2011-02-04 22:13 2226用了Openfire作为XMPP Server后,突然想试试e ... -
XMPP Client
2011-02-04 20:58 1481Spark http://www.igniterealtime ... -
XMPP Server
2011-02-04 20:50 1679Openfire http://www.igniterealt ... -
XEP-0065: SOCKS5 Bytestreams
2011-02-04 15:24 2929SOCKS5 Bytestreams ("S ... -
XEP-0047: In-Band Bytestreams
2011-02-04 14:34 2138In-Band Bytestreams (IBB) http: ...
相关推荐
android的XMPP客户端
xmpp客户端协议实现源代码
黑莓XMPP客户端实现参例 包含源代码 请多多关照
类似于xmpp协议的服务器与客户端代码。具体自己看
c#简单实现xmpp客户端,服务器openfire,可以登录及调试xmpp协议
XMPP JINGLE Jar包 可以实现语音聊天功能
JAVA实现XMPP客户端和服务器 成型的软件
Psi是为经验丰富的用户设计的跨平台功能强大的XMPP客户端。它使用经典的开发模型,其发行版很少见。 Psi +是Psi XMPP客户端的开发分支。借助滚动发布开发模型,用户可以很快地获得新功能和错误修复。
pandion是支持XMPP的客户端软件,是非常好用的软件资源
Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码
xmpp客户端:psi-0.14-win-setup.exe
xmpp客户端源代码
xmpp客户端开发的开源库,很稳定。
基于XMPP实现android客户端与服务器的交互(源码)
Smack是一个开源的、易于使用的XMPP客户端Java类库,提供了一套可扩展的API。
android xmpp asmcak 仿微信 语音 聊天。可直接运行。代码结构优化。 基于openfire 需要安装
集成超精简版XMPP客户端和STUN协议,可实现P2P,具体所实现的功能可查看源码README.txt,希望能帮到有需要的人,随便也可以提点意见和建议哈! 至于P2P的实现,在我的测试环境下,是使用移动的3G网络,只要一台设备...
关于Jabber的XMPP聊天程序客户端,详细见http://blog.csdn.net/kangkangz4/article/details/7750765
基于XMPP协议的Openfire框架实现 的安卓版实时聊天工具
Habber - IOS XMPP 客户端教程 源码 教程在blog.csdn.net/zesicus