WebRTC, STUN/TURN не работают вне локальной сети

index.html (Оферент)

var socket = io.connect('http://127.0.0.1:80'); //socket.io
socket.emit("player 1");

var iceServers = {
    iceServers: [
        {"url":"stun:turn1.xirsys.com"},
        {"username":"myusername","url":"turn:turn1.xirsys.com:443?transport=udp","credential":"mycredential"},
        {"username":"myusername","url":"turn:turn1.xirsys.com:443?transport=tcp","credential":"mycredential"}
    ]
};

var offererDataChannel, answererDataChannel;

var Offerer = {
    createOffer: function () {
        var peer = new PeerConnection(iceServers);
        var dataChannelOptions = {
            reliable: true,
            ordered: false
        };
        offererDataChannel = peer.createDataChannel('channel', dataChannelOptions);
        setChannelEvents(offererDataChannel);
        peer.onicecandidate = function (event) {
            if (event.candidate) {
            socket.emit("candidate", event.candidate);
        }
        };
        peer.createOffer(function (sdp) {
            peer.setLocalDescription(sdp);
            socket.emit("sdp", sdp);
        }, function (err) { peer.close(); });
        this.peer = peer;
        return this;
    },
    setRemoteDescription: function (sdp) {
        this.peer.setRemoteDescription(new SessionDescription(sdp));
    },
    addIceCandidate: function (candidate) {
        this.peer.addIceCandidate(new IceCandidate({
            sdpMLineIndex: candidate.sdpMLineIndex,
            candidate: candidate.candidate
        }));
    }
};

var Answerer = {
    createAnswer: function (offerSDP) {
        var peer = new PeerConnection(iceServers);
        peer.ondatachannel = function (event) {
            answererDataChannel = event.channel;
            setChannelEvents(answererDataChannel);
        };
        peer.onicecandidate = function (event) {
            if (event.candidate) {
                socket.emit("candidate", event.candidate);
            }
        };
        peer.setRemoteDescription(new SessionDescription(offerSDP));
        peer.createAnswer(function (sdp) {
            peer.setLocalDescription(sdp);
            socket.emit("sdp", sdp);
        }, function (err) { peer.close(); });
        this.peer = peer;
        return this;
    },
    addIceCandidate: function (candidate) {
        this.peer.addIceCandidate(new IceCandidate({
            sdpMLineIndex: candidate.sdpMLineIndex,
            candidate: candidate.candidate
        }));
    }
};

var peer = null;

socket.on("client is connected", function () {
    peer = Offerer.createOffer();
    socket.on("candidate", function (candidate) {
        peer.addIceCandidate(candidate);
    });
    socket.on("sdp", function (sdp) {
        peer.setRemoteDescription(sdp);
    });
});

У меня есть другой файл stream.html, который делает то же самое для Ответчика.

На функции setChannelEvents есть реализация канала onmessage.

Это отлично работает в моей локальной сети дома.

Я использовал службу ngrok, чтобы разместить это в сети, чтобы попробовать за пределами моей локальной сети, и это не работает.

Я использую Google Chrome (обновлен до последней версии, в настоящее время 35.0.1916.153).

Есть что-то, чего мне не хватает? Есть ли рабочий пример WebRTC с TURN, который я могу попробовать?

При необходимости я могу добавить оставшийся код, а также некоторый вывод candidate и sdp.

примечание: IP-адрес в сокете изменяется, когда я запускаю ngrok.


person genesisxyz    schedule 14.06.2014    source источник
comment
Пример Google Apprtc, использующий сервер TURN для своих подключений... В вашей реализации вы видите, что кандидаты генерируется и принимается другим узлом?   -  person Benjamin Trent    schedule 16.06.2014
comment
@bwtrent да, они генерируются (RTCIceCandidate), 6 из них имеют мой локальный IP-адрес (192.168.1.69) с портом 56830, последние 3 (таким образом, всего генерируются 9 кандидатов) также имеют внешний IP-адрес, такой же порт, но только для UDP   -  person genesisxyz    schedule 16.06.2014
comment
Вы получаете кандидатов, так что очередь серверов и ледовый процесс работают. Еще одна вещь, в которой нужно убедиться, это то, что другая сторона получает кандидатов. Так ли это?   -  person Benjamin Trent    schedule 16.06.2014
comment
@AdrienVinches, это второй вопрос WebRTC, который Я видел, как вы спамили коммерческими комментариями....   -  person Benjamin Trent    schedule 18.06.2014
comment
@bwtrent см. ответ ниже от парня XirSys, учетные данные были неправильными ... моя вина! Извините... в коде нет проблем   -  person genesisxyz    schedule 18.06.2014


Ответы (1)


Парень XirSys здесь. знак равно

Я не совсем уверен, в чем ваша ошибка, кроме того, что она просто не работает. Если ошибка заключается просто в том, что видео не передается, вы должны знать, что TURN не будет работать, потому что вы внедрили учетные данные для TURN, срок действия которых уже истек. При использовании XirSys вам необходимо вызвать /getIceServers, чтобы получить «свежий» набор серверов STUN и TURN, связанных с вашей учетной записью. Этот запрос POST должен быть выполнен, а результаты помещены в переменную iceServers каждый раз, когда вы инициируете вызов.

Чтобы быстро понять нашу платформу, я бы посоветовал прочитать следующие руководства:

Большое спасибо за проявленный интерес к нашему сервису, и, пожалуйста, дайте мне знать, если у вас есть вопросы или комментарии.

person onichase    schedule 18.06.2014
comment
@bwtrent Спасибо, добрый сэр! знак равно - person onichase; 18.06.2014
comment
Я делал это неправильно, учетные данные были неправильными... теперь работает отлично (единственная проблема - Google Chrome, который сначала пытается TURN вместо STUN).. спасибо! - person genesisxyz; 18.06.2014