Wie registriere ich einen SIP-Client direkt bei Twilio

February 28, 2019
Autor:in:
Alan Klein
Twilion

Wie registriere ich einen SIP-Client direkt bei Twilio

Hallo und danke fürs Lesen! Dieser Blogpost ist eine Übersetzung von Registering a SIP Phone Directly to Twilio (and so much more...).

Mit Twilio Programmable Voice SIP Domains, manchmal auch SIP Interfaces genannt, können Sie Sprachanrufe über einen SIP-Endpunkt tätigen und empfangen, indem Sie sich direkt bei Twilio registrieren.

Neben der Möglichkeit, sich direkt bei Twilio zu registrieren, haben Sie die Flexibilität, den Verbindungstyp zu wählen. Dies kann das herkömmliche öffentliche Telefonnetz (engl. Public switched telephone network PSTN), ein anderes registriertes SIP-Gerät (oft als SIP-Benutzeragent oder SIP-Client bezeichnet) oder sogar ein Endpunkt des Twilio Programmable Voice SDK sein.

Darum geht es in diesem Blogbeitrag:

  • Registrierung eines SIP-Telefons direkt bei Twilio
  • Anrufe von einem registrierten SIP-Telefon tätigen und empfangen
  • Empfohlene Designansätze
  • Zwei verschiedene Methoden für die Bereitstellung von SIP-Domain-Telefonanrufen
  • Erläuterung der Vorteile von Twilio SIP-Domains

Um diesem Artikel zu folgen, benötigen Sie:

Was ist SIP?

Programmable Voice SIP Domains nutzt den Internet Engineering Task Force (IETF) Standard RFC 3261, um Kommunikationssitzungen aufzubauen, zu ändern und abzubauen. SIP hat viele Ähnlichkeiten mit anderen IETF-Protokollen wie HTTP, was für ein erstes Verständnis des Protokolls sehr hilfreich sein kann.

Twilio nutzt Webhooks, um Ihre Anwendung über Ereignisse zu informieren, wie ein eingehender Sprachanruf oder eine eingehende SMS.

Wenn ein solches Ereignis eintritt, sendet Twilio eine HTTP-Anfrage (normalerweise POST oder GET) an eine von Ihnen konfigurierte Webhook-URL. Die Anfrage von Twilio enthält Metadaten wie die eingehende Telefonnummer oder den Text einer eingehenden Nachricht. Viele andere moderne Webdienste wie GitHub und Slack nutzen ebenfalls Webhooks, um Ereignisse zu übermitteln.

Das wichtigste Konzept hinter Twilio SIP-Domains sind die sogenannten Anrufsegmente, aus denen jeder Anruf zwischen zwei Teilnehmern besteht. Dieses Konzept der Anrufsegmente ist wichtig, da zwischen dem einleitenden und dem abschließenden Anrufsegment Daten eingefügt werden, die die Anrufzustellung direkt beeinflussen.

Das einleitende oder auslösende Anrufsegment wird nachfolgend als initiales Segment (Parent Leg) bezeichnet. Das initiale Segment erzeugt häufig ein abschließendes Segment (Child Leg), wenn Ihre Anwendung Twilio Markup Language (TwiML) zurückgibt.

Twilio SIP parent and child leg diagram

Funktionsweise einer Twilio-Anwendung mit Webhooks und Anrufsegmenten

Nach dem Auftreten eines Ereignisses wird die Webhook Ihrer Anwendung aufgerufen. Ihre Anwendung muss dann eine TwiML-Antwort an Twilio senden, dafür kann sie verschiedene Ansätze nutzen.

Ich bin ein großer Befürworter der serverlosen Produkte von Twilio, weil mit ihnen eine Lösung schnell umgesetzt werden kann und die Kapazität bei Bedarf elastisch skaliert werden kann, ohne dass eine eigene Infrastruktur nötig ist. Die beiden serverlosen Produkte, die wir heute nutzen werden, sind TwiML Bins, was „statisches“ TwiML zurückgibt, und Twilio Functions, welche „dynamisches“ TwiML zurückgeben. Die Basis bildet dabei die Logik, die wir in unser Twilio Functions JavaScript integrieren.

Mit der TwiML-Antwort von TwiML Bins oder Twilio Functions erhält Twilio die nötigen Informationen für die Einrichtung des abschließenden Segments. TwiML informiert Twilio über den Verbindungstyp (PSTN, SIP oder ein mit Twilio Programmable Voice SDK betriebenes Gerät wie ein Webbrowser oder ein mobiles Gerät). Nach erfolgreicher Einrichtung des initialen Segments führt Twilio die beiden Anrufsegmente nahtlos zu einem erfolgreichen Anruf zusammen.

Vorteile in der SIP-Domain registrierter Geräte

Bevor es los geht, sollten wir einige der Vorteile der Verwendung von Twilio Programmable Voice SIP Domains besprechen.

Da alle SIP-Domain-Anrufe über ein Datennetzwerk an Ihren SIP-Client gesendet und empfangen werden, hängt die Sprachqualität von dem zugrunde liegenden Netzwerks ab. Twilio Voice Insights ermöglicht, zusätzliche Einzelheiten in diesem Bereich zu erfassen.

Vorteile

  1. Sie haben Zugang zu einer riesigen Auswahl an standardbasierten SIP-Geräten verschiedener Hersteller, Betriebssysteme und Mobilgeräteplattformen.
  2. Die Kosten für das Anrufsegment zu oder von dem in der Twilio SIP-Domain registrierten Gerät sind oft geringer als die Weiterleitung dieses Anrufsegments über das öffentliche Telefonnetz. Beachten Sie, dass jeder Zweiparteienanruf aus zwei Anrufsegmenten besteht, sodass für das andere Anrufsegment höchstwahrscheinlich PSTN-Kosten anfallen würden, wenn Sie nicht einen anderen SIP-Endpunkt anrufen.
  3. Eine Logik zwischen einleitendem und abschließendem Anrufsegment einfügen zu können, eröffnet unzählige Nutzungsmöglichkeiten zum Vorteil Ihres Unternehmens. Sie können Audio-Eingabeaufforderungen einfügen, Ziffern oder Sprache erfassen und entsprechend weiterleiten (Sprachdialogsystem), auf externe APIs zugreifen, um intelligente Routing-Entscheidungen zu treffen, und andere Anpassungen je nach Geschäftsanforderungen vornehmen.
  4. Das Routing zu Geräten, die in der Twilio SIP-Domain registriert sind, ist stark mit den APIs von Twilio, TwiML und Produkten wie Twilio Studio verzahnt. Durch diese Verzahnung können Sie ganz flexibel auf der Grundlage Ihrer Fähigkeiten verschiedene Arten von Endpunkten kombinieren und anpassen.
  5. Clients, die in der SIP-Domain registriert sind, lassen sich mit weniger Programmieraufwand einbinden, als der Einsatz von Twilio Programmable Voice SDK (WebRTC-Client) erfordert. Clients sind problemlos von Drittanbietern erhältlich.
  6. Sie können bis zu 10 Geräte unter einem einzigen Benutzernamen registrieren. Wenn Sie einen Anruf erhalten, klingeln alle registrierten Geräte gleichzeitig.

Mein Name ist Inigo Montoya: Einrichten von SIP-Benutzernamen

Bei der Bereitstellung der Liste mit Anmeldeinformationen für die SIP-Domainregistrierung und der zugehörigen Benutzernamen für Ihre SIP-Domain verwenden Sie am besten das E.164-Format. Das E.164-Format wird zur eindeutigen Identifizierung der Zielrufnummer für einen Anruf verwendet. In Deutschland sieht das so aus: +49 (Ländervorwahl) lokale Rufnummer ohne führende Null. Informationen zum entsprechenden E.164-Format anderer Länder finden Sie hier und hier.

Twilio formatiert alle eingehenden PSTN-Telefonnummern im E.164-Format. Wir empfehlen, die „An“- und „Von“-Nummern für ausgehende Anrufe im E.164-Format anzuzeigen, um Unklarheiten bezüglich der beabsichtigten Ziele zu vermeiden. Twilio bietet ein globales, verbundenes Super Network für die Kommunikation mit zahlreichen internationalen Zielen, daher empfehlen wir, diese Best Practice zu übernehmen.

Darum sollten die Benutzernamen Ihrer Anmeldedatenliste das E.164-Format verwenden

Welche Vorteile bietet die Definition von Benutzernamen für die Anmeldelistenregistrierung durch E.164-Nummern? Gute Frage!

  1. Wenn ein SIP-Endgerät bei Ihrer Twilio-SIP-Domain registriert wird, zeigt dieser Endpunkt oft den registrierten Benutzernamen an. Dies ist sehr nützlich, da Teammitglieder so Anrufenden bei Bedarf einfach direkt die Telefonnummer nennen können. So ist gleich klar, welche Nummer für einen Rückruf verwendet werden kann.
  2. Wenn Teammitglieder Anrufe außerhalb des Twilio-Netzwerks über das öffentliche Telefonnetz tätigen, können Sie einfach den E.164-formatierten SIP-Benutzernamen als ausgehende Anrufer-ID verwenden. Dann können Endgeräte direkt zurückgerufen werden, statt eine gemeinsame Anruferkennung (auch Pilotnummer genannt) für alle ausgehenden Anrufe auf Ihren registrierten Geräten zu verwenden.
  3. Wenn Anrufe von Parteien außerhalb von Twilio eingehen, erhält Twilio die Zielrufnummer To im E.164-Format. Mit der E.164-Namenskonvention für SIP-Benutzernamen können Anrufe direkt an das richtige SIP-Endgerät weitergeleitet werden, ohne zusätzliche Logik oder spezielle Suchvorgänge.

Ausgehend von all diesen Vorteilen verwenden wir in diesem Beitrag das E.164-Format für den Benutzernamen. Da es jedoch eine Vielzahl von Anwendungsfällen gibt, etwa dass nur SIP-zu-SIP-Anrufe gebraucht werden, habe ich im Folgenden auch andere Formate angegeben. SIP-zu-SIP-Anrufe sind etwa für die interne Kommunikation zwischen SIP-Endpunkten nützlich.

Nächste Schritte: Herangehensweisen und Kompromisse beim SIP-Routing

Für eingehende Anrufe oder Anrufe an Ihre in der SIP-Domain registrierten Endpunkte verwenden wir das gleiche TwiML Bin-Routing.

PSTN to SIP inbound call diagram with Twilio

Für das ausgehende Routing biete ich zwei verschiedene Herangehensweisen an.

SIP outbound call diagram with Twilio

Die einfachere Variante über TwiML Bins für das ausgehende SIP-Domain-Routing ist begrenzt, da ein TwiML Bin überwiegend nur statisches TwiML zurückgibt. Dieser Anwendungsfall eignet sich am besten für registrierte SIP-Endpunkte, die fast nur ausgehende PSTN-Anrufe tätigen (dies ist auch der häufigste Anwendungsfall).

Da TwiML Bins nur begrenzt in der Lage sind, TwiML dynamisch zu erstellen, werden Anrufe von Twilio SIP E.164-Benutzername zu Twilio SIP E.164-Benutzername mit diesem Ansatz nicht optimal geroutet.

Twilio berechnet pro Anrufsegment. Die Weiterleitung eines Anrufs von SIP-Endpunkt zu SIP-Endpunkt über TwiML Bins erfordert vier Anrufsegmente [ SIP-Client > „abschließender“ E.164-Benutzername > Voice-URL der „initialen“ Twilio-Nummer > TwiML-Bin auf den „abschließenden“ E.164-Benutzernamen].

Abläufe mit Unterstützung durch TwiML Bin SIP Domain Voice URL:

  • Twilio E.164 SIP-Benutzername > E.164 PSTN (2 Anrufsegmente)
  • Twilio E.164 SIP-Benutzername > Twilio E.164 SIP-Benutzername (4 Anrufsegmente, suboptimal)

Mit Twilio Functions haben Sie mehr Möglichkeiten für das ausgehende SIP-Domain-Routing.

Anrufabläufe mit Unterstützung durch TwiML Function SIP Domain Voice URL:

  • Twilio E.164 SIP-Benutzername > E.164 PSTN (2 Anrufsegmente)
  • Twilio E.164 SIP-Benutzername > Twilio E.164 SIP-Benutzername (2 Anrufsegmente)
  • Twilio E.164 SIP-Benutzername > Twilio Alphanumerischer SIP-Benutzername (2 Anrufsegmente)
  • Twilio Alphanumerischer SIP-Benutzername > E.164 PSTN (verwendet Standard-Anrufer-ID, 2 Anrufsegmente)
  • Twilio Alphanumerischer SIP-Benutzername > Twilio E.164 SIP-Benutzername (verwendet SIP-Benutzername als Anrufer-ID, 2 Anrufsegmente)
  • Twilio Alphanumerischer SIP-Benutzername > Twilio Alphanumerischer SIP-Benutzername (verwendet SIP-Benutzername als Anrufer-ID, 2 Anrufsegmente)

Einführung in SIP und Twilio

Erwerben Sie Ihre Twilio-Nummern

Erwerben Sie die Twilio-Telefonnummern, die Ihre SIP-Domain-Clients zum Empfangen von Anrufen verwenden sollen:

  1. Öffnen Sie die Twilio Console und rufen Sie die Seite Telefonnummern auf.
  2. Klicken Sie auf der linken Seite des Bildschirms auf „Buy a Number“.
  3. Erwerben Sie Ihre Twilio-Nummern und notieren Sie sich diese für die späteren Schritte. Beim Erstellen der Benutzernamen für die Anmeldeliste werden diese Nummern für das Routing an die SIP-Domain-Clients eingebunden.

Erstellen Sie Ihre SIP-Domain

So richten Sie Ihre Twilio-SIP-Domain ein:

  1. Rufen Sie die Sektion SIP-Domain in der Konsole auf.
  2. Klicken Sie auf das blaue Pluszeichen (+).
  3. Geben Sie einen FriendlyName ein und geben Sie Ihrer SIP-URI einen eindeutigen Namen (IhreDomain), an den sip.twilio.com angefügt wird.
  4. In einem späteren Schritt ändern wir die Call Control Configuration. Dies wird entweder unser Beispiel für TwiML Bin oder für Twilio Functions. Kopieren Sie die Platzhalter-TwiML-URL https://demo.twilio.com/welcome/voice/ und fügen Sie sie in das Bearbeitungsfeld mit dem Titel „A Call Comes In“ ein. Diese URL gibt die folgende TwiML zurück:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say voice="alice">Thanks for the call. Configure your number's voice U R L to change this message.
  </Say>
  <Pause length="1"/>
  <Say voice="alice">Let us know if we can help you in any way during your development.
  </Say>
</Response>

Wir experimentieren später damit, wenn wir unseren ersten ausgehenden Anruf über den SIP-Client tätigen.

  1. Klicken Sie auf (+) neben "Credential Lists"und geben Sie einen Anzeigenamen ein. Fügen Sie dann den Benutzernamen und das Passwort für Ihren SIP-Client hinzu. Geben Sie als Benutzernamen für Ihre Geräte die Twilio-Nummer im E.164-Format an, die Sie mit diesem Client verbinden wollen (Beispiel: +15005551212). Diese muss mit einer der Twilio-Nummern übereinstimmen, die Sie gerade erworben haben. *Achten Sie auf die Formatierung*: keine Leerzeichen zwischen den Ziffern.
  2. Geben Sie ein komplexes Passwort ein (mindestens 12 Zeichen, davon mindestens ein Großbuchstabe, eine Kleinbuchstabe und eine Ziffer) und klicken Sie auf „Erstellen“.
  3. Aktivieren sie die Option "SIP Registration"
  4. Klicken Sie auf „Credentials Lists“ und wählen Sie die Liste aus, die Sie zuvor in Schritt 5 erstellt haben.
  5. Klicken Sie auf „Speichern“.

Herangehensweisen an eingehende Anrufe mit TwiML Bin und Twilio Function

Für eingehende Anrufe erstellen wir ein TwiML-Bin.

  1. Erstellen Sie einen TwiML Bin mit einem Namen wie etwa ToSIPClient. Fügen Sie dann die folgende TwiML-Datei ein und klicken Sie auf „Erstellen“. HINWEIS: Ersetzen Sie „unique-name“ (Montoya) durch den Domainnamen, den Sie für Ihre SIP-Domain gewählt haben.
<?xml version="1.0" encoding="UTF-8"?>
    <Response>
        <Dial answerOnBridge="true">
            <Sip>
 {{To}}@montoya.sip.us1.twilio.com
            </Sip>
        </Dial>
</Response>

TwiML Bins enthalten einige Mustache-Vorlagen, wie {{To}}{{From}}{{#e164}} und andere. Weitere Informationen finden Sie unter Vorlagen mit TwiML Bins verwenden.

  1. Gehen Sie zur Konfigurationsseite für Telefonnummern, wählen Sie die eingehende Telefonnummer aus, die Sie mit dem SIP-Telefon des Teammitglieds verknüpfen möchten, und klicken Sie dann darauf.
  2. Blättern Sie nach unten zu „Voice & Fax“ und wählen Sie unter „A Call Comes In“ die Option „TwiML“ aus dem Dropdown-Menü aus. Wählen Sie ToSIPClient (bzw. den Namen, den Sie verwendet haben) aus der nächsten Dropdown-Liste aus und klicken Sie auf „Save“.

Jetzt können an diese Twilio-Nummer eingehende Anrufe Ihr SIP-Telefon klingeln lassen. Richten wir einen SIP-Client für einen kurzen Test ein.

SIP-Client einrichten

Für unsere ersten Tests verwenden wir Telephone. Über den Link können Sie es für Windows oder Mac herunterladen.

Sobald Sie Telephone installiert haben und es läuft, wählen Sie im Menü „Einstellungen“ die Option „Accounts“ und geben einen Kontonamen wie „TwilioSIPDomain“ ein. Führen Sie dann diese Schritte aus:

  • Full Name / User Name: (Ihr Anmeldelistenbenutzername im E.164-Format, den Sie zuvor erstellt haben)
  • Domain: ihredomain.sip.twilio.com
  • Passwort: (was Sie in Ihrer Anmeldeliste für diesen E.164-Benutzernamen angegeben haben)
  • Klicken Sie auf Done.

Twilio SIP with X-Lite configuration example

Nun sollte ein grünes Symbol angezeigt werden, dass Ihr SIP-Client erfolgreich bei Twilio registriert wurde.

SIP UA registered to Twilio in X-Lite

Jetzt können Sie Ihren ersten Anruf tätigen.

Da der SIP-Client nun erfolgreich bei Twilio registriert und unsere Twilio-Nummer so zugeordnet ist, dass sie auf den SIP-Client verweist, können wir einen eingehenden Testanruf tätigen, um zu sehen, ob unser SIP-Client klingelt. Versuchen Sie jetzt, anzurufen. Dazu können Sie etwa die Nummer Ihres Twilio SIP-Client mit Ihrem Mobiltelefon anrufen.

Hat Ihr Telefon geklingelt? Ausgezeichnet!

Erinnern Sie sich noch an die Standard-URL, auf die wir beim Einrichten unserer SIP-Domain gestoßen sind? Lassen Sie uns einen ausgehenden Anruf von Ihrem SIP-Client an ein beliebiges Ziel tätigen.

Das funktioniert leider nicht. Twilio fordert die TwiML Antwort unter https://demo.twilio.com/welcome/voice/ an und beendet anschließend den Anruf.

Was zuerst nach einem Fehler klingt, ist tatsächlich das beabsichtigte Verhalten. Diese Voice Configuration Request URL teilt Twilio mit, wie der Anruf zu behandeln ist, daher kommt als Anweisung nur die Demo TwiML zurück.

Die nächsten Schritte bestehen darin, ausgehende Anrufe von Ihrem SIP-Client zuzulassen. Wir ersetzen die Standard-URL entweder durch einen TwiML Bin oder eine Twilio Function, wie wir bereits besprochen haben.

Ausgehende SIP-Anrufe mit einem TwiML Bin

Für ausgehende SIP-Client-Anrufe mit einem TwiML Bin führen Sie diese Schritte aus:

  1. Rufen Sie TwiML-Bins in Ihrer Konsole auf.
  2. Klicken Sie auf das blaue Pluszeichen (+).
  3. Geben Sie dem TwiML Bin einen Anzeigenamen wie „SipClientOutbound“.
  4. Fügen Sie die nachstehende TwiML-Datei ein (und ersetzen Sie dabei den vorhandenen Inhalt):
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Dial answerOnBridge="true" callerId="{{#e164}}{{From}}{{/e164}}">{{#e164}}{{To}}{{/e164}}</Dial>
</Response>
  1. Wenn am unteren Rand der Textbox: „Valid Voice TwiML“ steht, hat alles geklappt.
  2. Klicken Sie auf die Schaltfläche „Create“.
  3. Scrollen Sie nach oben und kopieren Sie die URL in Ihre Zwischenablage (oder klicken Sie auf das Kopiersymbol).
  4. Kehren Sie zu Ihrer SIP-Domain zurück.
  5. Klicken Sie auf Ihre SIP-Domain: „IhreDomain.sip.twilio.com“.
  6. Fügen Sie die URL in das Feld „Call Control Configuration“ ein und klicken Sie auf „Save“.

Sie sollten nun von Ihrem SIP-Telefon ausgehende Anrufe in das Telefonnetz tätigen können.

Probieren Sie es aus: Versuchen Sie, Ihre Handynummer (oder eine andere verifizierte Nummer) von Ihrem SIP-Client aus anzurufen. Wenn der Anruf nicht durchgestellt werden sollte, lesen Sie bitte den Abschnitt zur Fehlerbehebung.

Ausgehende SIP-Anrufe mit Twilio Functions

Ersetzen wir nun den TwiML Bin, den wir im letzten Schritt erstellt haben, durch eine Twilio Function, die komplexere Anrufabläufe ermöglicht (und dabei potenziell weniger Anrufsegmente braucht).

  1. Rufen Sie Twilio Function auf.
  2. Wählen sie “Create Service” und erstellen Sie einen neuen Service mit dem Name “SipDomainRouter”.
  3. Fügen Sie unter “Dependencies” zwei neue NPM-Module hin und bestätigen Sie mit  “Add”.
  • Name: google-libphonenumber und version: 3.2.30
  • Name: twilio und version: 3.80.0
  1. Rufen Sie Twilio Functions auf.
  2. Klicken Sie auf die Schaltfläche „Add +“ und wählen dann “Add Function”.
  3. Nennen sie die Datei sip.js.
  4. Klicken Sie auf die Schaltfläche „Erstellen“.
  5. Kopieren Sie den Inhalt des nachstehenden JavaScript in das Textfeld „Code“ (und ersetzen Sie dabei den vorhandenen Inhalt).
  6. Klicken Sie auf “Save“ und danach auf “Deploy All”.
  7. Kopieren Sie die vollständige URL dieser Function mit einem Klick auf die Schaltfläche „Copy URL“.
  8. Rufen Sie die SIP-Domain auf, klicken Sie auf Ihre SIP-Domain und fügen Sie die URL in das Feld „Voice Configuration Request URL“ ein.
  9. Klicken Sie auf „Save“.

Die Standardformatierung der Ländernummer entspricht der für die USA. Sie können die Voice Configuration Request URL ändern, um einen anderen Parameter für defaultCountry im ISO-Alpha2-Format zu übergeben. Für Deutschland würde die Voice Configuration Request URL zum Beispiel so aussehen:

https://YOURRUNTIMEDOMAIN.twil.io/sip.js?defaultCountry=DE

Beachten Sie das Hinzufügen von: ?defaultCountry=DE am Ende der URL.

Kehren Sie zurück zu Ihren Functions, klicken Sie auf Ihre “Enable live logs”. Nun können Sie die Konsolenausgabe sehen, wenn Sie Anrufe von Ihrem SIP-Client tätigen.

Tätigen Sie einen SIP-Anruf und überprüfen Sie, ob der Anruf erfolgreich war.

Aktualisieren Sie den Wert der Variable defaultCallerId, die derzeit auf +15005551212 eingestellt ist, auf eine Nummer in Ihrem Twilio-Konto. Diese Nummer wird als Standard-Anrufer-ID verwendet, wenn ein Anruf von einem SIP-Client getätigt wird, der mit einem nicht als E.164 formatierten Benutzernamen registriert ist.

/* URL Parameters
URL parameters: defaultCountry=[international country code - ISO alpha2]
Feel free to remove any console.log statements.
*/
// Require `PhoneNumberFormat`.
const PNF = require('google-libphonenumber').PhoneNumberFormat;
// Get an instance of `PhoneNumberUtil`.
const phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();
exports.handler = function(context, event, callback) {1
    const client = context.getTwilioClient();    
    let twiml = new Twilio.twiml.VoiceResponse();
    const { From: fromNumber, To: toNumber, SipDomainSid: sipDomainSid } = event;
    let mergedAggregatedE164CredentialUsernames = [];
    let regExNumericSipUri = /^sip:((\+)?[0-9]+)@(.*)/;
    let regAlphaSipUri = /^sip:(([a-zA-Z][\w]+)@(.*))/;
    // Change the defaultCallerId to a phone number in your account
    let defaultCallerId = '+15005551212';
    let defaultCountry = event.defaultCountry || 'US';
    let fromSipCallerId = (fromNumber.match(regExNumericSipUri)
    ? fromNumber.match(regExNumericSipUri)[1] :
    fromNumber.match(regAlphaSipUri)[2]);
    if (!toNumber.match(regExNumericSipUri)) {
        console.log('Dialing an alphanumeric SIP User');
        twiml.dial({callerId: fromSipCallerId, answerOnBridge: true})
        .sip(toNumber);    
        callback(null, twiml);
    }
    let normalizedFrom = (fromNumber.match(regExNumericSipUri)
    ? fromNumber.match(regExNumericSipUri)[1] : defaultCallerId);
    let normalizedTo = toNumber.match(regExNumericSipUri)[1];
    let sipDomain =  toNumber.match(regExNumericSipUri)[3];
    console.log(`Original From Number: ${fromNumber}`);
    console.log(`Original To Number: ${toNumber}`);
    console.log(`Normalized PSTN From Number: ${normalizedFrom}`);
    console.log(`Normalized To Number: ${normalizedTo}`);     
    console.log(`SIP CallerID: ${fromSipCallerId}`);
    // Parse number with US country code and keep raw input.
    const rawFromNumber = phoneUtil.parseAndKeepRawInput(normalizedFrom, defaultCountry);
    const rawtoNumber = phoneUtil.parseAndKeepRawInput(normalizedTo, defaultCountry);    
    // Format number in E.164 format
    fromE164Normalized = phoneUtil.format(rawFromNumber, PNF.E164);
    toE164Normalized = phoneUtil.format(rawtoNumber, PNF.E164);
    console.log(`E.164 From Number: ${fromE164Normalized}`);
    console.log(`E.164 To Number: ${toE164Normalized}`);
    function enumerateCredentialLists(sipDomainSid) {
        return client.sip.domains(sipDomainSid)
            .auth
            .registrations
            .credentialListMappings
            .list();
    }
    function getSIPCredentialListUsernames(credList) {
        return client.sip.credentialLists(credList)
            .credentials
            .list();  
    }      
    enumerateCredentialLists(sipDomainSid).then(credentialLists => {
        Promise.all(credentialLists.map(credList => {
            return getSIPCredentialListUsernames(credList.sid);
        })).then(results => {
            results.forEach(credentials => {
                // Merge together all SIP Domain associated registration
                // credential list usernames prefixed by + into one array
                mergedAggregatedE164CredentialUsernames.push
                .apply(mergedAggregatedE164CredentialUsernames,
                credentials.filter(record => record["username"].startsWith('+'))
                .map(record => record.username));
            });
            console.log(mergedAggregatedE164CredentialUsernames);
            if (mergedAggregatedE164CredentialUsernames.includes(toE164Normalized)) {
                console.log('Dialing another E.164 SIP User');
                twiml.dial({callerId: fromSipCallerId, answerOnBridge: true})
                .sip(`sip:${toE164Normalized}@${sipDomain}`);
            } else {
               console.log('Dialing a PSTN Number');
               twiml.dial({callerId: fromE164Normalized, answerOnBridge: true},
               toE164Normalized);
            }    
                callback(null, twiml);
            }).catch(err => {
                console.log(err);
                callback(err);
            });
    });
};   

Fehlerbehebung für SIP und Twilio

Beschränkungen von Testkonten

Für Twilio-Testkonten gelten bestimmte Einschränkungen. Mit den folgenden Schritten können Sie die Beschränkungen mindern bzw. umgehen:

  • Nur  zuvor verifizierte Telefonnummer können angerufen werden. Wir empfehlen es daher, dass Sie ihre Nummer verifizieren, bevor Sie anrufen.
  • Einige kostenpflichtige Servicenummern sind standardmäßig nicht erreichbar. Hilfe bei der Aktivierung von Anrufen in Länder außerhalb der USA und Kanadas finden Sie in unserem Artikel zu geografischen Berechtigungen.
  • Testkonten können bei ausgehenden Anrufen nur die Twilio-Nummer Ihres Kontos oder eine verifizierte Anrufer-ID als Anrufer-ID (From-Nummer) verwenden.

Weitere Einzelheiten zu Twilio-Testkonten finden Sie im Artikel 

Wie funktioniert die kostenlose Testversion von Twilio?

Debugger / Request Inspector

Die Twilio Console bietet einige hervorragende Debugging-Tools, falls Sie auf Probleme stoßen.

In der oberen linken Ecke Ihrer Twilio Console sehen Sie eine Schaltfläche mit dem Namen “Monitor”.

Weitere Einzelheiten zur Verwendung des Debuggers finden Sie unter Anwendungen debuggen.

SIP-Domains, Anrufe und Twilio – Zusammenfassung

Jeder Anruf über eine SIP-Domain besteht aus Anrufsegmenten. Für die Kommunikation zwischen zwei Teilnehmern gibt es ein initiales und ein abschließendes Anrufsegment mit Ihrer Routing-Logik dazwischen. Sie haben gesehen, wie Sie eine Twilio-SIP-Domain einrichten und wie Sie bei der Bereitstellung von Benutzergeräten Best Practices in der Auswahl von Benutzernamen für Anmeldelisten anwenden. Sie haben zwei verschiedene Voice Configuration Request URL implementiert, um TwiML für die Anrufweiterleitung zu verwenden: TwiML Bins und Twilio Functions. Hauptsächlich aber haben wir diese verschiedenen Ansätze und einige der erforderlichen Kompromisse besprochen.

Nächste Schritte

Der nächste Schritt besteht für die meisten darin, eine Logik (mit Twilio Functions) für eingehende Anrufe an die Twilio-Nummern Ihrer SIP-Domains-Endgeräte hinzuzufügen. Dann können Sie unbeantwortete Anrufe an die Voicemail oder ein anderes Ziel Ihrer Wahl weiterleiten lassen.

Twilio bietet noch ein weiteres SIP-Produkt an: Elastisches SIP-Trunking. Elastisches SIP-Trunking stellt eine direkte SIP-Verbindung (VoIP) zum öffentlichen Telefonnetz (PSTN) zur Verfügung. Diese Verbindung kann für Anrufe zu und von einer bestehenden Kommunikationsinfrastruktur, in der Regel einer Telefonanlage (Private Branch Exchange, PBX), genutzt werden.. Funktionen wie IVR, SimRing, Voicemail usw. werden von Ihrer vorhandenen Infrastruktur und nicht von Twilio bereitgestellt.

Weitere Ressourcen zu SIP-Domains