我正在为Android设备开发一个应用程序,该应用程序允许与连接到XMPP服务器的其他启用WebRTC的设备进行语音/视频通话。我已经成功地使应用程序在Android设备之间进行语音/视频聊天,现在我正在将该功能扩展到支持WebRTC的浏览器。我已经成功拥有浏览器到浏览器的语音/视频通话功能,但是该系统可在SDP协议上运行,而我构建的Android应用程序可在Jingle协议上运行。我知道我可以重写Android应用程序以使用SDP协议,就像以前所做的那样。但是,我想继续在Android设备上使用Jingle协议,因为我构建的应用程序开发了许多功能,这些功能在很大程度上取决于LibJingle中基于Jingle的代码。
在已经完成的SDP / Jingle转换器的基础上(特别是Phono library),我目前拥有一个浏览器客户端和一个Android设备,可以成功地协商语音/视频通话的媒体方面。但是,当一侧尝试连接到另一侧时,事情似乎失败了。我的一部分认为,失败的原因在于ICE / JINGLE的翻译。我注意到,通过“ onicecandidate”传递给浏览器的ice候选人不包含任何用户名和密码信息。我尝试将浏览器客户端生成的原始SDP产品中的用户名和密码信息复制到每个适当的ice候选对象(语音与视频)中,但是并没有成功。我还尝试过在传输节中不包括任何用户名和密码信息,但这也无济于事。
在整个通信过程中,我都是在浏览器端运行wireshark,然后继续看到浏览器与Android设备之间的绑定错误,直到Android设备最终发送“会话终止”信号。具体来说,我看到以下内容:
STUN 158绑定请求用户:r8bGP7y5LklOOKEb:IjgBbKgXQe9V8Pur
陈旧凭证用户:r8bGP7y5LklOOKEb:IjgBbKgXQe9V8PurSTUN 130绑定错误响应错误代码:274(未知错误代码)
最终,错误响应停止显示,然后出现如下所示的消息:
ICMP 186目标不可达(端口不可达)
我对谈判的ICE /运输部分还很陌生,所以我不确定是否有任何Wireshk日志是否相关,或者我什至无法正确诊断问题。
有人知道我在做什么错吗?还是有任何使基于SDP的客户端和基于Jingle的客户端之间的连接有效的经验?
为了澄清我在ICE翻译中的工作。
SDP候选人:
a =候选:[基础] [组件ID] [传输类型] [优先级] [连接地址] [端口] [候选类型] [用户名] [密码] [世代]
叮当候选人:
<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到丁当时,我使用以下映射:
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"/>
最佳答案
因此,事实证明,LibJingle尚不具备SDP / ICE转换功能。具体来说,是LibJingle does not currently support the XEP-0176-compliant version of ICE signaling。因此,唯一的办法就是将系统重做为基于SDP的系统。