Aus Linux-Magazin 02/2008

Workshop: Die eigene Asterisk-Anlage - Teil 2

© hulibu, photocase.com

Im zweiten Teil des großen Telefonanlagen-Workshops erfahren Sie, wie Sie komplexe Komfortfunktionen programmieren, beispielsweise interaktive Sprachmenüs, und welche Mechanismen Asterisk im Einzelnen dafür in seinem Ärmel hat.

Im ersten Teil der Artikelserie [1] haben Sie gelernt Asterisk [2] zu installieren und so zu konfigurieren, dass Sie intern und extern über einen SIP-Provider telefonieren können. In dieser Folge bekommen Sie das Handwerkszeug, um dieser noch recht einfachen Telefonanlage Komplexität und Intelligenz einzuhauchen. Los geht\’s mit dem Interactive Voice Response System.

Das IVR stellt Automaten bereit, die den Anrufer anhand von Sprachmenüs führen und weiterverbinden – also ungleich mehr als ein Anrufbeantworter (Abbildung 3). Um eine IVR aufzubauen, müssen Sie natürlich zuvor Sprachdateien aufnehmen. In Asterisks Köcher steckt dafür die Applikation »Record()«. Im Gegensatz zu »Playback()« verlangt »Record()«, dass die Endung des übergebenen Dateinamens zu dem gewünschten Codec passt.

Mit dem Dialplan in Listing 1 können Sie durch Anrufen der 9900 bis 9999 unkompliziert 100 verschiedene Sprachdateien – auch Sprach- oder Voiceprompts genannt – aufnehmen. Sie beenden jede Aufnahme durch Auflegen, die [#]-Taste oder durch Warten. Eine lange Pause am Ende eines Sprachprompts macht sich jedoch schlecht beim Aneinanderketten von mehreren Prompts.

Listing 1:
»extensions.conf« (1)

01 exten => _99XX,1,Answer()
02 exten => _99XX,2,Wait(1)
03 exten => _99XX,3,Record(/tmp/sprachprompt${EXTEN:2}.wav)
04 exten => _99XX,4,Wait(1)
05 exten => _99XX,5,Playback(/tmp/sprachprompt${EXTEN:2})
06 exten => _99XX,6,Hangup()

Um mit den Sprachprompts ein IVR zu realisieren, benutzen Sie die Applikation »Background(Dateinamen)«. Sie spielt den angegebenen Voiceprompt vor und gibt DTMF-Eingaben während des Abspielens an den Dialplan weiter. Der verarbeitet die Touchtones wie ganz normale Anrufe. Wenn Sie während eines Background die [8][8] eingeben, dann sucht Asterisk im aktuellen Context nach der Extension 88 und arbeitet ihn von der Priorität 1 beginnend ab.

Eine einfache Übung: Besprechen Sie die folgenden Voiceprompts und speichern Sie sie danach im Verzeichnis »/var/lib/asterisk/sounds/« ab:

  • »eingabe.wav«: „Bitte drücken Sie auf
    Ihrer Telefontastatur eine Zahl.“
  • »gerade.wav«: „Diese Zahl ist
    gerade.“
  • »ungerade.wav«: „Diese Zahl ist
    ungerade.“

Mit dem Dialplan aus Listing 2 probieren Sie die IVR-Funktion aus. Achtung: Die Eingabe muss während der Abarbeitung von »Background()« passieren! Wollen Sie dem User eine Möglichkeit geben, weitere Eingaben zu machen, benutzen Sie die vorgefertigten Asterisk-Prompts »silence/1« bis »silence/9«:

exten => 30,1,Answer()
exten => 30,n,Background(eingabe)
exten => 30,n,Background(silence/5)
exten => 30,n,Hangup()

Die Zahlen stehen für die Anzahl der Sekunden, in der Asterisk Stille abspielt.

Listing 2:
»extensions.conf« (2)

01 exten => 30,1,Answer()
02 exten => 30,n,Background(eingabe)
03 exten => 30,n,Hangup()
04 
05 exten => _[13579],1,Playback(ungerade)
06 exten => _[13579],n,Hangup()
07 
08 exten => _[2468],1,Playback(gerade)
09 exten => _[2468],n,Hangup()

Mehrstufige IVRs

Das Problem des gezeigten IVR-Konzepts ist, dass es immer innerhalb eines Context arbeitet und deshalb mehrstufige IVRs nur über mehrstellige Ziffern abbilden kann (Abbildung 1 und passendes Listing 3). Das ist natürlich unbefriedigend, aber ein mit der Applikation »Goto()« lösbares Problem. Goto springt wie im guten alten Basic an eine beliebige Stelle des Programms.

Listing 3:
»extensions.conf« (3)

01 [ivr]
02 exten => 50,1,Answer()
03 exten => 50,n,Background(beispielmenue)
04 exten => 50,n,Background(silence/5)
05 exten => 50,n,Hangup()
06 
07 ; Da in einem Context eine Extension nur
08 ; einmal vorhanden sein kann, realisiert
09 ; das Beispiel die Menueebenen durch
10 ; fortlaufende (auch zweistellige) Zahlen
11 ;
12 exten => 1,1,Background(dummy1)
13 exten => 1,n,Background(silcence/5)
14 exten => 1,n,Hangup()
15 
16 exten => 2,1,Playback(dummy2)
17 exten => 2,n,Hangup()
18 
19 exten => 3,1,Playback(dummy3)
20 exten => 3,n,Hangup()
21 
22 exten => 4,1,Playback(dummy4)
23 exten => 4,n,Hangup()

In Asterisk hüpft ein »Goto(10)« zur Priorität 10 in der aktuellen Extension. »Goto(555,1)« geht zur Extension 555 und da zur Priorität 1. Spannend ist »Goto(produktion,20,5)«, das im Context »produktion« die Extension 20 und Priorität 5 anspringt. Mit diesem Trick können Sie bei der Eingabe einer einstelligen Zahl auf der Menü-Ebene 1 auf eine zweistellige Extension in einem anderen Context verzweigen und haben dort wieder die einstelligen Zahlen von 0 bis 9 als Eingabeoption zur Verfügung (Abbildung 2 und zugehöriges Listing 4).

Listing 4:
»extensions.conf« (4)

01 [ebene0]
02 exten => 50,1,Answer()
03 exten => 50,n,Background(beispielmenue)
04 exten => 50,n,Background(silence/5)
05 exten => 50,n,Hangup()
06 
07 ; Um in der naechsten Ebene die einstelligen
08 ; Zahlen fuer Eingaben frei zu halten, sollte
09 ; man an eine beliebige mehrstellige Extension
10 ; springen.
11 ;
12 exten => 1,1,Goto(ebene1,99,1)
13 
14 exten => 2,1,Playback(dummy2)
15 exten => 2,n,Hangup()
16 
17 [ebene1]
18 exten => 99,1,Background(dummy1)
19 exten => 99,n,Background(silcence/5)
20 exten => 99,n,Hangup()
21 
22 exten => 1,1,Playback(dummy3)
23 exten => 1,n,Hangup()
24 
25 exten => 2,1,Playback(dummy4)
26 exten => 2,n,Hangup()

Wer die »n«-Priorität benutzt, muss für Goto Sprungadressen-Labels definieren. Das Beispiel

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Comments
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben