WebRTC - как настроить всегда использовать TURN сервер?

В стандартных спецификациях говорится, что вы можете установить значение ENUM для "relay": http://dev.w3.org/2011/webrtc/editor/webrtc.html

но, как вы устанавливаете enum в "relay", используя Javascript следующего?if (tmp.indexOf("typ relay ") >= 0) { никогда не встречаются в моем тесте. как я могу заставить его перечислить "реле"?

или же

это ошибка? https://code.google.com/p/webrtc/issues/detail?id=1179

Любая идея.

function createPeerConnection() {
  try {
    // Create an RTCPeerConnection via the polyfill (adapter.js).
    pc = new RTCPeerConnection(pcConfig, pcConstraints);
    pc.onicecandidate = onIceCandidate;
    console.log('Created RTCPeerConnnection with:\n' +
                '  config: \'' + JSON.stringify(pcConfig) + '\';\n' +
                '  constraints: \'' + JSON.stringify(pcConstraints) + '\'.');
  } catch (e) {
    console.log('Failed to create PeerConnection, exception: ' + e.message);
    alert('Cannot create RTCPeerConnection object; \
          WebRTC is not supported by this browser.');
      return;
  }
  pc.onaddstream = onRemoteStreamAdded;
  pc.onremovestream = onRemoteStreamRemoved;
  pc.onsignalingstatechange = onSignalingStateChanged;
  pc.oniceconnectionstatechange = onIceConnectionStateChanged;
}

function onIceCandidate(event) {
  if (event.candidate) {
    var tmp = event.candidate.candidate;
    if (tmp.indexOf("typ relay ") >= 0) {
      /////////////////////////////////////////// NEVER happens
      sendMessage({type: 'candidate',
                   label: event.candidate.sdpMLineIndex,
                   id: event.candidate.sdpMid,        
                   candidate: tmp}); 
      noteIceCandidate("Local", iceCandidateType(tmp));   

    }    
  } else {
    console.log('End of candidates.');
  }
}

3 ответа

Решение

Чтобы принудительно использовать сервер TURN, вам необходимо перехватить кандидатов, найденных браузером. Так же, как вы делаете.

Но если это никогда не происходит в ваших тестах, у вас могут быть некоторые проблемы с вашим сервером TURN. Если у вас есть рабочий сервер TURN, вы получите кандидатов с typ relay,

Помните, что вам нужно настроить сервер TURN с аутентификацией. Это обязательно, и браузер будет использовать кандидатов "реле" только если запрос аутентифицирован. Ваша конфигурация iceServers для PeerConnection должна иметь учетные данные, определенные для серверов TURN.

Существует расширение Chrome, ограничитель сети WebRTC, который настраивает сетевой трафик WebRTC путем изменения настроек конфиденциальности Chrome. Вы можете заставить трафик проходить через TURN без каких-либо действий по SDP.


РЕДАКТИРОВАТЬ 1

Цель сделать это доступным в расширениях, для пользователей, которые беспокоятся о своей безопасности. Вы можете проверить этот отличный пост о безопасности WebRTC. То же самое, что и это расширение, также может быть сделано в FF путем изменения флага media.peerconnection.ice.relay_only, Это можно найти в about:config, Не знаю насчет двух других, но держу пари, что у них есть что-то похожее.

С другой стороны, если вы распространяете приложение и хотите, чтобы все ваши клиенты проходили через TURN, у вас не будет доступа к их браузерам, и вы не сможете ожидать, что они изменят эти флаги или установят какое-либо расширение. В этом случае вам придется манипулировать своим SDP. Вы можете использовать этот код

function onIceCandidate(event) {
  if (event.candidate) {
    var type = event.candidate.candidate.split(" ")[7];
    if (type != "relay") {
      trace("ICE  -  Created " + type + " candidate ignored: TURN only mode.");
      return;
    } else {
      sendCandidateMessage(candidate);
      trace("ICE  - Sending " + type + " candidate.");
    }
  } else {
    trace("ICE  - End of candidate generation.");
  }
}

Этот код взят из списка Discussion-Webrtc.

Если вы никогда не получите этих кандидатов, вполне возможно, что ваш сервер TURN настроен неправильно. Вы можете проверить свой сервер TURN на этой странице. Не забудьте удалить существующий сервер STUN, настроенный в этой демонстрации.


РЕДАКТИРОВАТЬ 2

Еще проще: установить iceTransportPolicy: "relay" в вашей конфигурации WebRtcPeer, чтобы заставить TURN:

var options = {
    localVideo: videoInput, //if you want to see what you are sharing
    onicecandidate: onIceCandidate,
    mediaConstraints: constraints,
    sendSource: 'screen',
    iceTransportPolicy: 'relay',
    iceServers: [{ urls: 'turn:XX.XX.XX.XX', username:'user', credential:'pass' }]
}

webRtcPeerScreencast = kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options, function(error) {
    if (error) return onError(error) //use whatever you use for handling errors

    this.generateOffer(onOffer)
});

Это работает для меня:

iceServers = [
     { "url": "turn:111.111.111.111:1234?transport=tcp",
       "username": "xxxx",
       "credential": "xxxxx"
     }
   ]

optionsForWebRtc = {
    remoteVideo : localVideoElement,
    mediaConstraints : videoParams,
    onicecandidate : onLocalIceCandidate,
    configuration: {
        iceServers: iceServers,
        iceTransportPolicy: 'relay'
    }
}
Другие вопросы по тегам