我正在开发Android设备应用程序,允许语音/视频呼叫到连接到XMPP服务器的其他支持WebRTC的设备。我已经成功地将应用程序用于Android设备之间的语音/视频聊天,现在我正在努力将该功能扩展到支持WebRTC的浏览器。我已经成功地使用浏览器进行浏览器语音/视频呼叫,但该系统可以在SDP协议上运行,而我构建的Android应用程序也可以在Jingle协议上运行。我知道我可以重写Android应用程序来处理SDP协议,因为之前已经完成了。但是,我想继续在Android设备上使用Jingle协议,因为我构建的应用程序开发了许多功能/功能,这些功能/功能严重依赖于LibJingle中基于Jingle的代码。
建立已经完成的SDP / Jingle翻译器(具体为Phono library)我目前有一个浏览器客户端和一个Android设备成功协商语音/视频呼叫的媒体方面。然而,当一方试图连接到另一方时,事情似乎失败了。我的一部分认为失败在于ICE / JINGLE翻译。我注意到通过“onicecandidate”传递给浏览器的冰候选者不包含任何用户名和密码信息。我曾尝试将浏览器客户端生成的原始SDP优惠中的用户名和密码信息复制到每个适当的冰候选者(语音与视频)中,但这并没有取得任何成功。我也试过在传输节中不包含任何用户名和密码信息,但这也没有产生任何效果。
我在整个通信期间在浏览器端运行wireshark,我继续看到浏览器和Android设备之间的绑定错误,直到Android设备最终发送“会话终止”信号。具体来说,我看到以下内容:
STUN 158绑定请求用户:r8bGP7y5LklOOKEb:IjgBbKgXQe9V8Pur
Stale Credentials用户:r8bGP7y5LklOOKEb:IjgBbKgXQe9V8PurSTUN 130绑定错误响应错误代码:274(未知错误代码)
最终错误响应停止显示,然后如下所示的消息开始显示:
ICMP 186目标无法访问(端口无法访问)
我仍然对谈判的ICE /运输部分很新,所以我不确定是否有任何wireshark日志是相关的,或者我是否正确地诊断问题。
有谁知道我可能做错了什么?或者有任何经验可以获得基于SDP的客户端和基于Jingle的客户端之间的连接吗?
澄清我在ICE翻译中所做的工作。
SDP候选人:
a =候选人:[基础] [component-id] [传输类型] [优先级] [连接地址] [端口] [候选人类型] [用户名] [密码] [生成]
Jingle候选人:
<candidate component="[comp]" name="[name]" address="[ip]" port="[port]"
protocol="[proto]" username="[uname]" password="[pass]" preference="[pref]"
generation="[gen]"/>
从Jingle转到SDP时,我使用以下映射:
foundation = randomly generated number
component-id = comp
transport type = udp
priority = pref * 10000
connection address = ip
port = port
candidate type = typ host
username = uname
password = pass
sdpMLineIndex = 0 if audio, 1 if video
sdpMid = audio / video
从SDP转到Jingle时,我使用以下映射:
comp = component-id
name = event.candidate.sdpMid (with the adjustment of rtp and rtcp based on
component value)
ip = connection address
port = port
proto = transport type
uname = varies from being empty to being the respective one generated in the
original SDP media information
pass = varies from being empty to being the respective one generated in the
original SDP media information
pref = 0.99
gen = 0
我在Chrome中获得的ICE候选人的一个例子:
a=candidate:3376904655 2 udp 2113937151 192.168.1.144 46794 typ host generation 0
a=candidate:1208975227 1 udp 1845501695 xxx.xxx.xxx.xxx 46794 typ srflx raddr 192.168.1.144 rport 46794 generation 0
我从Jingle获得的ICE候选人的一个例子:
<candidate name="video_rtp" address="xxx.xxx.xxx.xxx" port="37275" preference="0.99" username="4XqIQDW4n9lJrIOM" protocol="udp" generation="0" password="F0Vc9tWo4S2/VhleJ/BdNOId" type="local" network="wlan0"/>
<candidate name="video_rtp" address="xxx.xxx.xxx.xxx" port="54429" preference="0.86" username="0ftgSUZ0qRFXlMh5" protocol="udp" generation="0" password="lIyHJZuZt8L/wIZnnqfQfRED" type="stun" network="wlan0"/>
答案 0 :(得分:1)
因此,事实证明,LibJingle还没有能力使用SDP / ICE转换。具体而言,LibJingle does not currently support the XEP-0176-compliant version of ICE signaling。因此,唯一的办法是将系统重做为基于SDP的系统。