WebRTC, STUN/TURN не работят извън LAN

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.

Това работи перфектно в моята LAN у дома.

Използвах услугата 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
Получавате кандидати, така че процесът на turn server и ice работи. Другото нещо, за което трябва да се уверите, е, че другата страна получава кандидатите. такъв ли е случаят   -  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