我正在为Android设备开发一个应用程序,允许语音/视频呼叫到连接到XMPP服务器的其他支持WebRTC的设备。我已经成功地让应用程序在Android设备之间进行语音/视频聊天,现在我正在努力将该功能扩展到支持WebRTC的浏览器。我已经成功地进行了浏览器到浏览器的语音/视频通话,但是该系统在SDP协议上工作,而我构建的Android应用程序在Jingle协议上工作。我知道我可以重写Android应用程序来使用SDP协议,就像以前做过的那样。然而,我想继续在Android设备上使用Jingle协议,因为我所构建的应用程序已经开发了许多严重依赖于LibJingle中基于Jingle的代码的特性/功能。
基于已经完成的SDP/Jingle翻译器(特别是Phono库),我目前有一个浏览器客户端和一个Android设备,可以成功地协商语音/视频呼叫的媒体方面。然而,当一方试图与另一方建立联系时,事情似乎正在失败。我的一部分认为,失败在于ICE/JINGLE的翻译。我注意到,通过"oniccandidate"传递给浏览器的ice候选人不包含任何用户名和密码信息。我已经尝试将浏览器客户端生成的原始SDP报价中的用户名和密码信息复制到每个适当的ice候选(语音与视频)中,但没有取得任何成功。我也试过在传输节中不包括任何用户名和密码信息,但也没有产生任何结果。在整个通信过程中,我在浏览器端运行wireshark,我继续看到浏览器和Android设备之间的绑定错误,直到Android设备最终发送"会话终止"信号。具体来说,我看到了以下内容:
STUN 158绑定请求用户:r8bGP7y5LklOOKEb:IjgBbKgXQe9V8Pur
过期凭据用户:r8bGP7y5LklOOKEb:IjgBbKgXQe9V8PurSTUN 130绑定错误响应错误码:274 (未知错误码)
最终错误响应停止显示,然后开始显示如下消息:
ICMP 186目的不可达(端口不可达)
我对谈判的ICE/transport部分仍然很陌生,所以我不确定是否有任何wireshark日志相关,或者我是否正确诊断了问题。
有谁知道我可能做错了什么吗?或者有任何经验获得基于SDP的客户端和基于Jingle的客户端工作之间的连接?澄清我在ICE翻译中所做的事情。
SDP候选人:
a=candidate:[foundation] [component-id][传输类型][优先级][连接地址][端口][候选类型][用户名][密码][generation]
叮当候选人:
<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"/>
所以,事实证明,LibJingle还不能与SDP/ICE转换一起工作。具体来说,LibJingle目前不支持ICE信令的xep -0176兼容版本。所以,唯一的办法就是重做一个基于SDP的系统。