2016-08-04 17 views
0

Hauptsächlich WebRTC funktioniert gut, aber für Zeiten zu Zeiten sind einige Anrufe fehlgeschlagen. Zum Beispiel wurde einer von zwanzig Anrufen nicht eingerichtet, weil PeerConnection nicht zu arbeiten beginnt.WebRTC PeerConnection startet nicht

Sehen wir uns den korrekten Arbeitsablauf auf der Callerseite an.

-> create offer 
-> (sdp observer) getting SDP 
-> (peer observer) start gathering candidates 
-> (peer observer) adding candidates to SDP 
-> set local description with type - offer 
-> (signaling) sending SDP 
    **** accepting call in other side **** 
-> (signaling) receive answer SDP 
-> set remote description with type - answer 
-> (establishing call) 
-> ................... 

Und zur Klärung der Dinge, ich möchte über Call-Flow auf der Callee Seite zeigen. Aber ich denke, es ist nur der gleiche Fluss für jede WebRTC-Anwendung und nicht nur für meine Frage.

-> (signaling) receiving SDP offer 
    ***** accepting call **** 
-> set remote description type offer 
-> create answer 
-> (sdp observer) getting SDP 
-> (peer observer) start gathering candidates 
-> (peer observer) adding candidates to SDP 
-> set local description with type - answer 
-> (signaling) sending SDP answer 
-> ................... 

Und jetzt sind wir zuversichtlich mit korrektem Anrufverlauf. Hier ist ein Problem. Von Zeit zu Zeit schlug WebRTC fehl, da PeerConnection.Observer nichts in onIceConnectionChange (PeerConnection.IceConnectionState iceConnectionState) empfing. Also, wenn Anruf fehlgeschlagen und wenn erfolgreich, ich erhielt identische Protokoll vom Gerät, mit nur einem Unterschied. Im Falle eines Anrufs fehlgeschlagen, PeerConnection.Observer Zustand, hat seinen Status von NEW zu CHECKING nicht geändert! Warum passiert das?


Wie ich schon sagte, es passiert nur die Zeit von Zeit. Aber verstehe immer noch nicht, was falsch ist? Da zwischen Aufrufen nur ein Unterschied besteht, ändert PeerConnection den Beobachterstatus. Vielleicht benutze ich nur einzelne RELAY-Kandidaten, um einen Anruf zu tätigen, vielleicht sammle ich so schnell Kandidaten?

+0

Sie verwenden Vanille ICE (nicht Rinnsal ICE)? Tritt der Fehler manchmal bei denselben Endpunkten mit denselben Netzwerkbedingungen (speziell NATs) oder mit unterschiedlichen Endpunkten auf? – mattm

+0

@mattm mit Vanilleeis und gleichen EndPoint in Geräten. – GensaGames

Antwort

1

Da @Mattm bereits erwähnt, große Chance hat dies mit ICE zu tun. Haben Sie einen STUN/TURN Server? Wenn nicht, versuchen Sie here. Machen Sie ein Konto und verwenden Sie peerconnectionnumb.viagenie.ca:3478 als ICE Server.

Außerhalb Ihres lokalen Netzwerks müssen Sie mit strengeren Firewalls umgehen, ein STUN Server kann "Löcher stanzen" (offene Ports), um eine Peer-to-Peer-Verbindung zwischen Clients zu ermöglichen. Bei der Verwendung von WebRTC in der Produktion benötigen Sie einen. Mach dir keine Sorgen, es gibt Unmengen von öffentlichen oder du kannst selbst eine veranstalten, wenn du willst.

Wenn Sie eine Verbindung zwischen Clients hinter einem strengen NAT herstellen (passiert häufig in Mobilfunk- und Schul-/Unternehmensnetzwerken), können Sie diese normalerweise nicht Peer-to-Peer verbinden. Hier kommt TURN ins Spiel, es ist ein Relay-Server, der alle Clients ihre Daten/Medien darüber senden lässt.

Das TURN Protokoll implementiert auch das STUN Protokoll, also wenn Sie einen einzigen TURN Server verwenden, sind Sie gut zu gehen. Wenn Sie auf große Mengen von Clients skalieren, müssen Sie möglicherweise daran denken, mehr als einen zu hosten.

+0

Ich benutze bereits Google Sample STUN Server. Jedenfalls denke ich, dass es ein anderes Grundproblem ist. – GensaGames

+0

@GensaGames Ein STUN-Server oder ein TURN-Server? Sie benötigen einen TURN-Server, um alle Netzwerktypen abzudecken. – Kevin

+0

Hallo, vielleicht hier noch Problem. Ich verwende nur Google STUN URI. – GensaGames