RTCIceTransport 接口定义了收发数据包的P2P传输通道,当需要获取 ICE 连接状态信息时,通过该接口进行访问。
当调用 setLocalDescription() 或 setRemoteDescription()方法时,WebRTC自动创建 RTCIceTransport 对象,对象中的ICE 代理(ICE Agent)负责管理 ICE 的连接状态。
//RTCIceTransport的定义
interface RTCIceTransport : EventTarget {
readonly attribute RTCIceRole role;
readonly attribute RTCIceComponent component;
readonly attribute RTCIceTransportState state;
readonly attribute RrCIceGathererstate gatheringState;
sequence<RTCIceCandidate> getLocalCandidates();
sequence<RTCIceCandidate> getRemoteCandidates();
RTCIceCandidatePair? getSelectedCandidatePair();
RTCIceParameters? getLocalParameters();
RTCIceParameters? getRemoteParameters();
attribute EventHandler onstatechange;
attribute EventHandler ongatheringstatechange;
attribute EventHandler onselectedcandidatepairchange;
};
//RTCIceRole的定义
enum RTCIceRole {
"unknown",
"controlling",
"controlled"
};
RTCIceRole 枚举值说明 | |
枚举值 | 说明 |
unknown | ICE代理的角色还没有确定 |
controlling | ICE 控制代理 |
controlled | ICE 受控代理 |
ICE 区分不同角色,帮助协商过程顺利完成。
该属性返回当前对象使用的传输协议,类型为 RTCIceComponent。
//RTClceComponent的定义
enum RTCIceComponent {
"rtp",
"rtcp"
};
RTCIceComponent 枚举值说明 | |
枚举值 | 说明 |
rtp | 当前对象使用的 RTP 协议 |
rtcp | 当前对象使用的 RTCP 协议 |
该属性表示ICE传输状态,类型为 RTCIceTransportState。
//RTCIceTransportState的定义
enum RTCIceTransportState {
"new",
"checking",
"connected",
"completed",
"disconnected",
"failed",
"closed"
};
RTCIceTransportState 枚举值说明 | |
枚举值 | 枚举值说明 |
new | RTClceTransport正在收集候选地址,或者正在等待对等端返回ICE候选者地址 |
checking | RTCIceTransport 收到了对等端返回的ICE候选者地址,正在进行配对 |
connected | RTCIceTransport 找到了一条可用的网络连接。为了找到一个更优的网络路径RTCIceTransport仍然会继续进行ICE候选者地址收集和配对 |
completed | RTCIceTransport结束了ICE候选者地址的收集,并从对等端收到没有更多ICE 候选者地址的指令,最终执行配对过程,成功找到了可用的网络连接 |
disconnected | RTCIceTransport网络连接中断,这是一个可恢复的短暂状态,在弱网环境可能会频繁触发 |
failed |
RTCIceTransport完成了ICE候选者收集,但是因为没有成功连通的候选者对导致配对失败。 除非ICE重启,否则该状态不会恢复,同时该状态不会导致DTLS传输层关闭。 |
closed | RTCIceTransport 对象已关闭,不再响应 STUN 请求。 |
该属性表示ICE候选者的收集状态,类型为 RTCIceGathererState。
//RTCIceGathererState 的定义
enum RTCIceGathererState {
"new",
"gathering",
"complete"
};
RTCIceGathererState 属性说明 | |
枚举值 | 枚举值说明 |
new | 刚刚创建 RTCIceTransport,还没有开始收集ICE候选者信息 |
gathering | RTCIceTransport 正在收集ICE候选者信息 |
complete | RTCIceTranspont 完成了ICE候选者信息的收集,已经向对等端发送了ICE候选者结束标识 |
该方法返回本地ICE候选组。ICE代理将收集到的新的ICE候选项放入候选组,同时触发事件 RTCPeerConnection:icecandidate。
localCandidates = RTCIceTransport.getLocalcandidates();
参数:无。
返回值:包含 RTCIceCandidate 对象的数组。每个 RTCIceCandidate 对象代表一个本地 ICE 候选项。
//getLocalCandidates()方法示例
const localCandidates = pc.getSenders()[0].transport.iceTransport.getLocalCandidates();
localCandidates.forEach((candidate, index) => {
console.log("Candidate " + index + ":" + candidate.candidate);
});
该方法返回对等端ICE候选组。
当本地应用程序调用 RTCPeerConnection.addIceCandidate()方法将对等端候选项加入ICE 会话时,调用该方法可获得包含此候选项的数组。
remoteCandidates = RTCIceTransport.getRemoteCandidates();
参数:无。
返回值:包含RTCIceCandidate对象的数组。每个RTCIceCandidate对象代表一个从对等端收到的 ICE 候选项。
//getRemoteCandidates() 方法示例
const remoteCandidates = pc.getSenders()[0].transport.iceTransport.getRemoteCandidates();
remoteCandidates.forEach((candidate, index) => {
console.log("Candidate " + index + ":" + candidate.candidate);
});
该方法返回ICE代理当前选择的候选对。
candidatePair = RTCIceTransport.getSelectedCandidatePair();
输入:无。
返回值:RTCIceCandidatePair 对象,描述了当前选择的 ICE 候选对。
//RTCIceCandidatePair的定义
dictionary RTCIceCandidatePair {
RTCIceCandidate local;
RTCIceCandidate remote;
};
其中,local 表示候选对中的本地候选项,remote 表示候选对中的对等端候选项。下面的代码清单 演示了获取并显示当前ICE候选对使用的网络协议。
//getSelectedCandidatePair()方法示例
const iceTransport = pc.getSenders()[0].transport.iceTransport;
const localProto = document.getElementById("local-protocol");
const remoteProto = document.getElementById("remote-protocol");
iceTransport.onselectedcandidatepairchange = (event) => {
const pair = iceTransport.getSelectedCandidatePair();
localProto.innerText = pair.local.protocol.toUpperCase();
remoteProto.innerText = pair.remote.protocol.toUpperCase();
}
该方法返回本地ICE参数。
当调用方法 RTCPeerConnection.setLocalDescription() 时,相应地设置了本地 ICE 参数。
parameters = RTCIceTransport.getLocalParameters();
参数:无。
返回值:RTCIceParameters 对象,如果未被设置,则返回 nul1。
//RTClceParameters的定义
dictionary RTCIceParameters {
DOMString usernameFragment;
DOMString password;
};
其中,usernameFragment 和 password 分别表示用户名和密码。
该方法返回对等端ICE的参数,返回值类型为RTCIceParameters,其用法基本与getLocalParameters()方法一致,不再赘述。
当 RTClceTransport 状态发生改变时触发该事件,通过属性 RTCIceTransport.state 获取当前状态值,对应事件句柄 onstatechange。
//statechange事件句柄示例
let iceTransport = pc.getSenders()[0].transport.iceTransport;
iceTransport.onstatechange = ev => {
if (iceTransport.state === "failed") {
handleFailure(pc);
}
}
也可以使用 addEventListener 监听 statechange 事件。
当ICE候选者的收集状态值发生改变时触发该事件,通过属性 gatheringState 获取当前状态值,对应事件句柄 ongatheringstatechange。
该事件与 icegatheringstatechange 相似,但 icegatheringstatechange 代表整个连接的候选收集状态,包括所有 RTCIceTransport,而 gatheringstatechange 只代表单个 RTCIceTranspor 的收集状态。
//gatheringstatechange事件句柄示例
pc.getSenders().forEach(sender => {
sender.transport.iceTransport.ongatheringstatechange = ev => {
let transport = ev.target;
if (transport.gatheringState === "complete") {
/* 这个传输通道已经完成了ICE候选者收集,但是其他通道可能仍在进行中 */
}
};
});
也可以使用 addEventListener 监听 gatheringstatechange 事件。
当ICE代理选择了新的候选对时触发该事件,对应事件柄 onselectedcandidatepairchange。
在ICE协商过程中,从本地和对等端收集ICE候选者信息,当找到了一个有望成功建立网络连接的候选对,即触发事件selectedcandidatepairchange 时,使用 getSelectedCandidatePair() 方法可以获取此候选对。
ICE继续配对,如果找到了更优的候选对,则替换掉当前的,并再次触发 selectedcandidatepairchange 事件。