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