Я успешно передал предложение, ответ и замороженных кандидатов для подключения WebRT C от A к B. На этом этапе соединение застряло в состоянии "connecting"
. Инициатор (A), кажется, истекает по таймауту или что-то в этом роде через некоторое время и переключается в состояние "failed"
, тогда как его пульт (B) постоянно находится в состоянии "connecting"
.
Любая помощь будет очень признательна .
Создание пира (A и B):
let peer = new RTCPeerConnection({
iceServers: [
{
urls: [
"stun:stun1.l.google.com:19302",
"stun:stun2.l.google.com:19302",
],
},
{
urls: [
"stun:global.stun.twilio.com:3478?transport=udp",
],
},
],
iceCandidatePoolSize: 10,
});
Создание предложения (A):
peer.onnegotiationneeded = async () => {
offer = await peer.createOffer();
await peer.setLocalDescription(offer);
};
Сбор ледяных кандидатов (A):
peer.onicecandidate = (evt) => {
if (evt.candidate) {
iceCandidates.push(evt.candidate);
} else {
// send offer and iceCandidates to B through signaling server
// this part is working perfectly
}
};
Создание ответа и заполнение ледяных кандидатов (B):
await peer.setRemoteDescription(offer);
let answer = await this._peer.createAnswer();
await peer.setLocalDescription(answer);
// send answer back to A through signaling server
for (let candidate of sigData.iceCandidates) {
await peer.addIceCandidate(candidate);
}
При ответе от B через сервер сигнализации (A):
await peer.setRemoteDescription(answer);
Обнаружение изменения состояния соединения ( A и B):
peer.onconnectionstatechange = () => {
console.log("state changed")
console.log(peer.connectionState);
}
Также обратите внимание, что было два случая, когда он был успешно подключен, но я еще не видел, чтобы он снова работал.
EDIT : Я забыл упомянуть, что я также создаю канал данных (событие onicecandidate
, похоже, не вызывается без этого). Это вызывается сразу после создания RTCPeerConnection
и присоединения любых обработчиков событий.
let channel = peer.createDataChannel("...", {
id: ...,
ordered: true,
});
EDIT 2 : Как предлагается @ jib , я теперь также собираем ледяных кандидатов в B и отправляем их обратно в A для добавления. Однако та же проблема сохраняется.
РЕДАКТИРОВАТЬ 3 : Кажется, подключается в первый раз, когда я сильно перезагружаю веб-страницу для A и веб-страницу для B. Соединение перестает работать снова, пока я не сделаю еще одна жесткая перезагрузка. Есть ли у кого-нибудь идеи, почему это так? По крайней мере, я смогу продолжить разработку до тех пор, пока не выясню эту проблему.
РЕДАКТИРОВАТЬ 4 : Я удалил iceServers
, который использовал, и оставил RTCPeerConnection
конструктор пустой. Как-то теперь намного надежнее. Но мне еще не удалось установить соединение на iOS Safari!