2014-12-01 5 views
10

У меня есть приложение webrtc, оно отлично работает, но для тестирования мне нужно проверить, работает ли мой сервер TURN, но поскольку оба тестовых устройства находятся в одной сети, я не в состоянии проверить, мысли ниже коды будет ограничивать кандидат только те, используя сервер TURN,WebRTC: заставить одноранговых узлов использовать сервер TURN

function onIceCandidate(event, targetSessionID, targetUserName) { 
    if (event.candidate) { 
    var candidate = event.candidate.candidate; 
    if(candidate.indexOf("relay")<0){ // if no relay address is found, assuming it means no TURN server 
     return; 
    } 
    sendMessage(candidate); // using socket.io to send to the otherside 
... 

, но я заметил, что (с большим разочарованием), это не работает, потому что когда сверстники создают описание ответа,

.... 
a=candidate:0 1 UDP 2128609535 13.198.98.221 58779 typ host 
a=candidate:0 2 UDP 2128609534 13.198.98.221 58780 typ host 
.... 

это означает, что передача является прямой, а не через ТУР N server, правильно ли я предполагаю это? Теперь, как заставить webrtc использовать сервер TURN?

+0

Да, кандидаты отображаются в этом обратном вызове, но впоследствии они добавляются в любой SDP, созданный после. Вам также придется удалить нежелательных кандидатов из SDP. –

+0

@BenjaminTrent Я просмотрел SDP во время предложения и ответа, поэтому единственный способ предотвратить прямое соединение p2p - это вручную манипулировать предложением и строкой ответа (получать из '' 'createOffer''' и' '' createAnswer'' ')? – mido

+1

Я так считаю, что если вы удалите нежелательных кандидатов на лёд, прежде чем устанавливать их локально и отправляете их сверстникам, которые ДОЛЖНЫ работать. –

ответ

6

просто добавив это, чтобы закрыть этот вопрос,

function onIceCandidate(event, targetSessionID, targetUserName) { 
    if (event.candidate) { 
    var candidate = event.candidate.candidate; 
    if(candidate.indexOf("relay")<0){ // if no relay address is found, assuming it means no TURN server 
     return; 
    }... 

Приведенный выше код работает, проверено на wireshark,

после добавления условия if(candidate.indexOf("relay")<0), общение происходит только через TURN сервер , если на сервере нет/неверные данные, состояние подключения get's равно new

Редактировать:Редактировать:, как Каллен сказал в своем ответе, по w3 webrtc, проходя relay в iceTransportPolicy должно работать, но я не проверил, если она реализована в Firefox и Chrome еще ...

+0

Это реализовано сейчас, fwiw. – RandallB

+0

Не в Chromium 50 AFAICT –

+0

Ahh ... это только с adapter.js. – RandallB

3

Я понятия не имею, поддерживают ли браузеры или нет, но посмотрите на «политику кандидата ICE» в разделе 4.1.1 проекта-ietf-rtcweb-jsep-08, вы можете увидеть, как настройка политики «реле» будет делать то, что вы хотите. В текущем проекте API W3C это устанавливается с использованием значения RTCIceTransports «relay» для поля iceTranports в конфигурации. Поиск RTCIceTransports в https://w3c.github.io/webrtc-pc/

0

Для целей тестирования на светлячок вы можете заставить Реле TURN.

Проверьте мой ответ here!

Смежные вопросы