Eine einfache IVR

Bei den Standardsprachbausteinen gibt es eine Datei marryme.gsm, die den Text "Will you marry me? Press 1 for yes or 2 for no."[1] enthält. Um hiermit eine Heiratsantrags-IVR zu realisieren, reicht folgender Dialplan:[2]

Einige der klassischen Asterisk-Sprachbausteine wie marryme, thank-you-cooperation oder hangup-try-again sind im heute mitgelieferten core-sounds-en-Paket nicht mehr enthalten. Sie stehen als historische Dateien im Netz zur Verfügung (z. B. asterisk-legacy-sounds), oder Sie ersetzen sie durch existierende Prompts wie hello-world, demo-thanks bzw. demo-nogo. Wenn ein Prompt fehlt, schreibt Asterisk eine Warnung Unable to open …​ ins Log — das Dialplan-Gerüst selbst ist davon nicht betroffen.

exten => 30,1,Answer()
exten => 30,2,Background(marryme)
exten => 30,3,Hangup()

exten => 1,1,Playback(thank-you-cooperation)
exten => 1,2,Hangup()

exten => 2,1,Playback(sorry)
exten => 2,2,Hangup()

Wird die 30 angerufen, hebt Asterisk ab und spielt das Soundfile marryme.gsm ab. Während der Ansage kann der Benutzer jederzeit eine Eingabe machen. Diese Eingabe wird als weitere Extension gewertet und abgerufen. Wer also die 1 drückt, bekommt die Ansage "Thank you for your cooperation." abgespielt. Danach legt Asterisk auf.

Unterschied zwischen Playback() und Background()

Mit der Applikation Playback() können Soundfiles nur abgespielt werden. Jegliche Eingabe während des Abspielens wird nicht beachtet. Background() hingegen spielt die Datei ab und wartet während des Abspielens auf eine Eingabe. Diese wird dann als Extension interpretiert, als wenn sie im aktuellen Context auch so gewählt worden wäre.

Unterschied zwischen 10 und 1000

Nehmen wir als Beispiel für die Problematik der gleich anfangenden Extensions den folgenden Dialplan:

exten => 30,1,Answer()
exten => 30,2,Background(marryme)
exten => 30,3,Hangup()

exten => 1,1,Playback(thank-you-cooperation)
exten => 1,2,Hangup()

exten => 10,1,NoOp(Test mit 10)
exten => 10,2,Hangup()

exten => 100,1,NoOp(Test mit 100)
exten => 100,2,Hangup()

exten => 2,1,Playback(sorry)
exten => 2,2,Hangup()

Damit Asterisk zwischen den Eingaben 1, 10 und 100 unterschieden kann, wartet Background() nach jeder Eingabe eine bestimmte Zeit. Ist diese Zeit (`TIMEOUT`) abgelaufen, so gilt die Eingabe als beendet.

Mit `TIMEOUT` können noch andere Timeouts definiert werden. Informationen dazu bekommen Sie im CLI mit der Eingabe show function TIMEOUT. Weitere Die vollständige Beschreibung aller TIMEOUT()-Varianten finden Sie in der offiziellen Dokumentation unter https://docs.asterisk.org.

Den `TIMEOUT` kann man in Sekunden angeben und wie folgt im Dialplan setzen:

exten => 123,1,Set(TIMEOUT(digit)=3)

Eigenintelligenz

Asterisk wird beim obigen Dialplan bei der Eingabe der Ziffer 2 direkt und bei der Eingabe der Ziffer 1 erst nach dem Ende des `TIMEOUT`s reagieren. Es erkennt also selbstständig, wann eine Eingabe bereits logisch gültig ist, und agiert entsprechend.

Falscheingaben (die i-Extension)

Eine Falscheingabe (also eine nicht im Dialplan definierte Eingabe) kann mit der i-Extension (i wie invalid) abgefangen werden. Ein einfaches Beispiel würde folgendermaßen aussehen:

exten => 30,1,Answer()
exten => 30,2,Background(marryme)
exten => 30,3,Hangup()

exten => 1,1,Playback(thank-you-cooperation)
exten => 1,2,Hangup()

exten => 2,1,Playback(sorry)
exten => 2,2,Hangup()

; Bei allen anderen Eingaben wird diese
; i-Extension aufgerufen.
exten => i,1,Background(sorry)
exten => i,2,Hangup()

Pausen

Die einfachste Möglichkeit, kurze Pausen für die Eingabe zu realisieren, ist das Abspielen von Soundfiles ohne Inhalt. Im Verzeichnis /var/lib/asterisk/sounds/silence/ gibt es 1 bis 9 Sekunden lange Dateien, die nur Stille abspielen. Soll in unserem Heiratsantragsbeispiel noch 5 Sekunden auf eine Antwort gewartet werden, so kann man das wie folgt erreichen:

exten => 30,1,Answer()
exten => 30,2,Background(marryme)
exten => 30,3,Background(silence/5)
exten => 30,4,Hangup()

exten => 1,1,Playback(thank-you-cooperation)
exten => 1,2,Hangup()

exten => 2,1,Playback(sorry)
exten => 2,2,Hangup()

exten => i,1,Background(marryme)
exten => i,2,Hangup()

1. Übersetzung: Möchtest Du mich heiraten? Drücke 1 für Ja und 2 für Nein.
2. Es sollte auch dem größten Geek unter den Lesern klar sein, dass eine solche IVR nur als Beispiel dient und niemals als reale Möglichkeit eines Heiratsantrags in Betracht gezogen werden sollte! ;-)