Не удается создать RTCDataChannel - PullRequest
3 голосов
/ 08 апреля 2020

Я пытаюсь следовать этому примеру для создания DataChannel.

Для сигнализации я использую веб-сокеты, которые ведут себя так:

User A joins

User B joins
User B asks User A to create an offer
-> A opens datachannel before creating an offer
-> A sets his local description
User A sends his offer to User B 
-> B answers the offer
-> B sets local and remote description 
User B sends A his local description

( Пользователь B напрямую не отправляет сообщение пользователю A, это делается через веб-сокеты с промежуточным сервером, который проводит сеансы веб-сокетов, пропуская эту часть ради простоты)

Создание кода предложения для пользователя A является следующее:

let pc = new RTCPeerConnection({
    iceServers: [
        {
            urls: "stun:stun.l.google.com:19302",
        }
    ]
});
let dc = pc.createDataChannel("Base");
dc.onbufferedamountlow = function(){
console.error("dataChannel.onbufferedamountlow");
};
dc.onclose = function(){
    console.error("dataChannel.onclose");
};
dc.onerror = function(){
    console.error("dataChannel.onerror");
};
dc.onmessage = function(){
    console.error("dataChannel.onmessage");
};
dc.onopen = function(){
    console.error("dataChannel.onopen");
};

let offer = await pc.createOffer();
await pc.setLocalDescription(offer);
let offerString = JSON.stringify(pc.localDescription); //Is sent to B

Полный код для пользователя B следующий:

let pc = new RTCPeerConnection({
    iceServers: [
        {
            urls: "stun:stun.l.google.com:19302",
        }
    ]
});
await pc.setRemoteDescription(new RTCSessionDescription(offer)); //From A
let answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
let answerString = JSON.stringify(pc.localDescription); //Returns to A

Поэтому, когда A получает ответ B, он просто:

await pc.setRemoteDescription(new RTCSessionDescription(answer));

Object A:

A user log

Объект B:

enter image description here

Firefox о: webrt c ошибки

То, что я также пытался без успеха:

- открытие канал данных после того, как оба пользователя установили соединения, ничего, ни одно из событий не запускается, некоторые обновления об этом:

  1. после создания канала данных на b Во-вторых, я всегда вижу, что ReadyState соединяется ... на обоих клиентах ... picture of RTCPeer data channel error

- открывает канал данных на B, пока A все еще ожидает ответ B назад , Событие onclose канала данных запускается, даже не вызывая событие открытия ...

- используя https://test.webrtc.org/ для проверки, это результат:

enter image description here

-Я также искал другие вопросы или похожие на мои, форумы, блоги и т. Д. c ... все ответы, которые варьируются от 2 до 5 лет, кажутся устаревшими и не работает ...

-создание канала с обеих сторон примерно так:

pc.createDataChannel("Test", {
    id: 1,
    negotiated: true,
})

Приводит к OperationError: Id is in use на одном из клиентов. Как я могу присоединиться к каналу по его идентификатору , если DO C заявляет это :

В качестве альтернативы (true) они могут быть согласованы вне диапазона, где обе стороны вызовите createDataChannel с согласованным идентификатором.

Если я должен присоединиться к каналу по идентификатору, но при создании объекта я получаю, что идентификатор используется, как мне присоединиться к нему?

Если я не укажу идентификатор, который я получаю TypeError: id is required when negotiated is true

В то время как do c говорит:

ID: Необязательно - 16-битная цифра c ID для канала; допустимые значения 0-65534. Если вы не включите эту опцию, пользовательский агент выберет для вас идентификатор.

Добавление await pc.addIceCandidate(); или await pc.addIceCandidate(null); после настройки обоих подключений Локальное и Удаленное описание.

Запустил мой собственный сервер TURN с открытыми TCP и UDP, тот же результат, что и на сервере STUN Google.

Пробовал с использованием серверов STUN и TURN на iceServer.

Пробовал как Firefox, так и Chrome последние версии.

Вопросы:

1) Когда должен открываться канал данных? После того, как оба клиента провели переговоры и p c .connectionState стабильно? Сразу после создания объекта подключения? До или после установки локального описания?

1 Ответ

0 голосов
/ 11 апреля 2020

Проблема в том, что вам нужно обмениваться информацией ICE по сигналу (а не только информацией SDP).

Лед - это то, что удаленный узел знает, как подключиться, SDP - это то, что нужно содержание, которое я могу обслуживать.

...