SIP via WebRTC in der Produktion. Wie sind wir gelaufen und welche Probleme haben Sie gelöst?

    Доброго времени суток всем!

    Я уже писал о своем опыте работы с WebRTC тут, но учитывая то, что в последнее время всё больше статей на эту тему появляется на хабре и то, что я давно хотел написать о том, как мы добились стабильной работы SIP телефонии через WebRTC на продакшне, я решил написать через что мы прошли.

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

    Кому интересно, прошу под кат.


    Предыстория:



    Wir haben Software für unser Callcenter geschrieben und hatten die Möglichkeit, sie so zu gestalten, dass wir uns nicht um die browserübergreifende Kompatibilität kümmern.

    In der Anfangsphase entschieden wir uns für:

    • SIPml5 - als Frontend-Bibliothek
    • Asterisk - wie ein Backend
    • Google Chrome ist wie ein Browser. wo das alles funktionieren sollte.


    Den ganzen Weg haben wir genutzt:

    • Asterisk und SIPml
    • Asterisk + Webrtc2sip und SIPml
    • Freeswitch + SIPml
    • Freischalter + JSSIP


    Nicht viel über Software:


    • Asterisk ist ein bekannter Soft-Switch. Hergestellt von Digium-Handwerkern
    • Freischalter - Soft-Schalter. Einer der Mitbewerber von Asterisk
    • SIPml5 - positionieren Sie sich als erster HTML5-SIP-Client. Javascript für die Arbeit mit SIP.
    • JSSIP - leichtes Javascript für die Arbeit mit SIP.
    • WebRTC2SIP - SIP und Media Gateway


    Sternchen + sipml


    Der Beginn der Reise. Wir mussten ein funktionierendes Schema finden und einen Anruf von einem Browser auf unser Handy tätigen.
    Asterisk wurde in diesem Handbuch gepatcht und kompiliert .
    Nachdem wir dies erreicht hatten, begannen wir mit dem Testen.

    Während des Testens fanden wir:

    1. "Weißes Rauschen" beim Anrufen
    2. Bis zu 10 Sekunden Stille bei einem eingehenden Anruf.
    3. Eingehender Anruf wurde abgehend geworfen.


    1. „Weißes Rauschen“ wurde mit diesem Patch behoben.
    2. Wir haben das Problem des Verbindungsabbruchs mithilfe der Benutzereinstellungen auf Asterisk gelöst. Es wurde ein Limit von 1 Anruf pro Benutzer festgelegt.
    3. Wir haben uns entschlossen, das Problem mit 10 Sekunden Stille zu beheben, indem wir Asterisk auf Version 1.6 aktualisiert haben.

    Und jetzt sind wir bei 1,6 asterisk. Nach einem kurzen Test wurde klar:

    • Es gibt kein "weißes Rauschen"
    • Native Web-Socket-Unterstützung


    Folgende Probleme traten jedoch auf:

    1. Asterisk stürzt bei eingehenden Anrufen bei der RTP-Definition ab
    2. Die Stille dauerte bis zu 10 Sekunden.


    Das Problem mit der Stille wurde dadurch gelöst, dass wir STUN in SIPml5 aufgegeben haben. Die Situation ist besser geworden, aber nicht ganz weg.
    Wir haben uns für WebRTC2SIP entschieden, wie von den SIPml5-Betreuern empfohlen.

    Sternchen + webrtc2sip + sipml



    In dieser Phase haben wir die folgende Situation:

    • Keine alten Käfer
    • Sternchen fällt nicht
    • Die Stille ist weg.


    ABER! Es gab ein Problem, bei dem WebRTC2SIP nicht produktionsbereit ist. Er fiel ständig in verschiedenen Abständen.
    Dem Bugreport im Tracker nach zu urteilen , wussten sie ein halbes Jahr lang von dem Problem, als wir begannen, es zu verwenden. Sie stellten fest, dass von den Betreuern nichts gewonnen werden konnte und begannen, das Problem selbst zu lösen.

    // Inzwischen ist das Projekt bereits in Produktion.

    Nach einer Woche und ohne das Problem zu lösen, machten wir einen Neustart von webrtc2sip und begannen, nach Freeswitch zu schauen.

    freischalter + sipml



    Ich habe nach Freeswitch gesucht, selbst als die Beta-Version 1.4 mit WebRTC-Unterstützung veröffentlicht wurde.

    In diesem Stadium wurde klar, dass weder Asterisk noch Doubango Telecom helfen sollten und Sie das Problem irgendwie selbst lösen müssen.

    In der Anfangsphase der Arbeit mit Freeswitch nehmen die XML-Konfigurationen wirklich das Gehirn heraus, aber wenn Sie sich an sie gewöhnen, können Sie nicht ohne sie leben.
    Nachdem wir die Arbeit unter produktionsnahen Bedingungen von ihm erhalten hatten, testeten wir sie und stellten fest, dass es keine Fehler gab. Wir begannen, die Produktion weiter zu testen und konnten weiterhin auf das Asterisk + WebRTC2SIP-Bundle zurückgreifen.

    Nach der Migration verschwanden die Probleme mit dem Softswitch. Es gab Probleme seitens SIPml:

    • Wenn Sie anrufen und den Hörer abheben, denkt sipml, dass er auch angerufen wird, und versucht, einen bereits toten Anruf entgegenzunehmen.
    • Der Anruf dauerte nicht länger als 2 Minuten.


    Sie machten mehrere Krücken, damit uns diese Probleme nicht störten, und beschlossen, auf JSSIP umzusteigen. Über JSSIP ist seit etwa einem Monat bekannt. Und es gab viel Hass auf Doubango und ihre Produkte und einen großen Wunsch, ihre Produkte loszuwerden.

    Nachdem SIP drei Tage nach der Migration auf JSSIP alles auf tryit.jssip.net überprüft und festgestellt hatte, dass es keine Probleme gibt, begann es stabil und fehlerfrei zu arbeiten.

    Zusammenfassung


    Hier ist die Geschichte. Und jetzt meine persönliche Meinung zu jeder Software.
    Sipml


    Vorteile:
    • Unterstützt die Übertragung


    Nachteile:
    • Sehr gut Die minimierte js-Datei wiegt> 1 MB
    • Keine vollständige Dokumentation. Ich musste viele Dinge im Internet finden.
    • Mehr von WebRTC2sip geschärft
    • Viel Code


    Serververbindungsbeispiel
    // Взято из документации
             SIPml.init(
                        function(e){
                            var stack =  new SIPml.Stack({realm: 'example.org', impi: 'bob', impu: 'sip:bob@example.org', password: 'mysecret',
                                events_listener: { events: 'started', listener: function(e){
                                            var callSession = stack.newSession('call-audiovideo', {
                                                    video_local: document.getElementById('video-local'),
                                                    video_remote: document.getElementById('video-remote'),
                                                    audio_remote: document.getElementById('audio-remote')
                                                });
                                            callSession.call('alice');
                                        } 
                                    }
                            });
                            stack.start();
                        }
                );
    


    Beispiel aufrufen
    // Взято из документации
                var callSession;
                var eventsListener = function(e){
                    console.info('session event = ' + e.type);
                }
                var makeCall = function(){
                    callSession = sipStack.newSession('call-audiovideo', {
                        video_local: document.getElementById('video-local'),
                        video_remote: document.getElementById('video-remote'),
                        audio_remote: document.getElementById('audio-remote'),
                        events_listener: { events: '*', listener: eventsListener } // optional: '*' means all events
                    });
                    callSession.call('johndoe');
                }
    


    Jssip


    Vorteile:

    • Leicht (~ 130kb)
    • Hervorragende Dokumentation auf der Entwicklerseite
    • Funktioniert hervorragend mit Freeswitch (theoretisch mit Asterisk und anderen, aber ich habe es hier nicht überprüft)
    • Tolle API


    Nachteile:
    • Weiß nicht, wie man einen Vermittlungsanruf tätigt


    Ein Beispiel für die Verbindung zu einem Server:
    // Из документации
    var configuration = {
      'ws_servers': 'ws://sip-ws.example.com',
      'uri': 'sip:alice@example.com',
      'password': 'superpassword'
    };
    var coolPhone = new JsSIP.UA(configuration);
    


    Beispiel aufrufen
    // из документации
    var selfView =   document.getElementById('my-video');
    var remoteView =  document.getElementById('peer-video');
    // Register callbacks to desired call events
    var eventHandlers = {
      'progress':   function(e){ /* Your code here */ },
      'failed':     function(e){ /* Your code here */ },
      'started':    function(e){
        var rtcSession = e.sender;
        // Attach local stream to selfView
        if (rtcSession.getLocalStreams().length > 0) {
          selfView.src = window.URL.createObjectURL(rtcSession.getLocalStreams()[0]);
        }
        // Attach remote stream to remoteView
        if (rtcSession.getRemoteStreams().length > 0) {
          remoteView.src = window.URL.createObjectURL(rtcSession.getRemoteStreams()[0]);
        }
      },
      'ended':      function(e){ /* Your code here */ }
    };
    var options = {
      'eventHandlers': eventHandlers,
      'extraHeaders': [ 'X-Foo: foo', 'X-Bar: bar' ],
      'mediaConstraints': {'audio': true, 'video': true}
    };
    coolPhone.call('sip:bob@example.com', options);
    


    Webrtc2sip


    Vorteile:
    • Geholfen, das Problem mit Asterisk zu lösen

    Nachteile:
    • Nicht stabil
    • Die Stabilität wurde nach einem Jahr festgestellt.


    Sternchen


    So wie ich es verstehe, reparieren die Handwerker es in einem Release und brechen es in einem anderen.
    In Version 1.7 funktionierte SIP über WebRTC nicht mehr für mich.

    Habrauser Ovoshlook hat ein Problem perfekt und ausführlich beschrieben:

    Handwerker haben bereits geflickt. Jetzt ist das universelle und umfassende Problem anders: Wenn ein Sternchen eine Überbrückung durchführt, sendet er eine Einladung mit AVP-Transport, und wenn der angerufene Teilnehmer am Telefon sitzt, erwartet er dementsprechend AVPF-Transport und -Verschlüsselung. Infolgedessen antwortet der Anrufer mit einem 603-Fehler, wobei der Kommentar beim Tätigen eines Anrufs kein lokales SDP abruft.
    Im Allgemeinen - mit ausgehenden Sternchen nicht überwachen, auf welchem ​​Gerät der Client sitzt. Alternativ können Sie über openSIPS oder Kamailio einen Proxy erstellen und konvertieren, dies ist jedoch ein völlig anderes Thema.

    Infolgedessen war dies alles müde und wir entschieden uns für Freeswitch als Soft-Switch

    Freischalter


    Vorteile:
    • Funktioniert
    • Aktiv entwickelt
    • Bei Neuerscheinungen bricht nichts zusammen

    Nachteile:
    • Es gibt keine Möglichkeit, ein solches Callcenter zu erstellen, wie dies bei einem Sternchen mit einer Roboterin durch Timeout der Fall ist


    Zusammenfassung


    SIP begann stabil zu arbeiten. Die Betreiber sind glücklich. Das aktuelle Bündel von Freeswitch + JSSIP verarbeitet ca. 10.000 Anrufe pro Tag und bis zu 15.000 Anrufe während der Stoßzeiten.

    PS


    Ich kann jedem schreiben, der daran interessiert ist, wie wir Freeswitch mit Integration in MySQL, Call Center und Anrufaufzeichnung einrichten und fehlertolerant machen.

    Jetzt auch beliebt: