Anrufe verarbeiten mit dem asterisk Server / extensions.conf



Eine ausführliche Auflistung aller Befehle findet Ihr unter http://www.das-asterisk-buch.de/. Hier ist meine Beispiel Konfiguration.
Die sogenannte extension.conf ist einer einfachen Programmiersprache sehr ähnlich. Wir werden uns die Beispielkonfiguration Schritt für Schritt erarbeiten. Dazu müssen wir hin und wieder auch andere Konfig Dateien verändern. Diese Anleitung ist mit Sicherheit keine vollständige Beschreibung der Befehle von asterisk. Sie dient eher als Fundgrube für Ideen. Die Komplette Beispielconfig zum runterlladen ist /etc/asterisk/extensions.conf

CAPI Konfiguration

Ladet die Datei /etc/asterisk/capi.conf. Passt darin den Wert der MSN an eure Telefonanlagenkonfiguration an.



Anrufererkennung

Wenn der Computer angerufen wird, dann soll er erst mal schauen, wer überhaupt anruft und auf unterschiedliche Anrufer unterschiedlich reagieren.

[capi-in]
exten => 5,1,Noop(${CALLERID})
exten => 5,n,GotoIf($[ ${CALLERID} = 1 ]?intern:nichtdie1)
exten => 5,n(nichtdie1),GotoIf($[ ${CALLERID} = 2 ]?intern:nichtdie2)
exten => 5,n(nichtdie2),GotoIf($[ ${CALLERID} = 3 ]?intern:nichtdie3)
exten => 5,n(nichtdie3),GotoIf($[ ${CALLERID} = 3 ]?intern:nichtdie4)
exten => 5,n(nichtdie4),GotoIf($[ ${CALLERID} = 001601234567]?handy:extern)


[capi-in] ist hier der Kontext eingehender ISDN Anrufe. Der Name dieses Kontexts muss mit dem in der capi.conf übereinstimmen.
Die Syntax exten => ist etwas gewöhnungsbedürftig; die 5 dahinter ist die Nummer, die angerufen wird, also die Telefonnummer unter der der Computer zu erreichen ist. Das ist aber nicht zwangsläufig Eure Festnetznummer. In meinem Fall ist es die 5, weil die ISDN Anlage auf dem Port 5 meiner Telefonanlage angesteckt ist und ich intern die 5 anrufe, wenn ich meinen Computer sprechen will.
Das n nach der 5 bzw in der ersten Zeile die 1 nummerieren die Befehlszeilen durch.
Der Befehl Noop() macht nicht, ausser den Inhalt der Klammer auf der Kommandozeile des asterisk anzuzeigen (auch CLI genannt). Die Klammern nach den n, also (nichtdie1) usw. sind Markierungen im Text zu denen man per GotoIf Befehl springen kann.
${CALLERID} ist, wer häts erwartet, die Nummer des Anrufers.
Der oben gezeigte Code sorgt dafür, dass wenn der Computer unter der 5 angerufen wird, geprüft wird, ob der Anrufer eine der Nummern von 1 bis 4 hat. Wenn ja dann wird der Code beim Sprungpunkt (intern) ausgeführt. Der entsprechende Code ist oben noch nicht implementiert. Falls der Anrufer die Nummer 001601234567 hat springt der Code zum Punkt (handy). Hier ist eine Null vorgestellt, da es sich um einen Anrufer von aussen handelt. Ob Ihr das mit oder ohne diese Null macht, hängt von der Einstellung Euerer Telefonanlage ab. Falls der Anrufer nicht (intern) oder (handy) zugeordnet werden kann, springt der Code zu (extern).



Authentifizierung

Wenn jemand von extern anruft, soll er sich zuerst authentifizieren. Dazu gibt es den Befehl Authenticate() in asterisk.

exten => 5,n(intern),Noop(intern)
exten => 5,n,Goto(sichereAuswahl)

exten => 5,n(handy),Noop(Handy)
exten => 5,n,Goto(unsichereAuswahl)

exten => 5,n(extern),Noop(extern)
exten => 5,n,Authenticate(1234)
exten => 5,n,Goto(unsichereAuswahl)


Die oberen beiden Punkte haben zwar nicht direkt etwas mit der Authentifizierung zu tun, aber ich habe sie dazu genommnen, um zu verdeutlichen, dass die beiden Sprungpunkte (handy) und (extern) nach der Authentifizierung zu einem Menu zusammenlaufen.



Menus gestalten

Jetzt soll der Anrufer eine Auswahl erhalten, was er machen kann. Diese Auswahl soll Ihm auch vorgelesen werden. Zum vorlesen braucht man eine entsprechende Audio Datei, die ins Verzeichniss /usr/share/asterisk/sounds/ gepackt wird. Um einen Text in eine halbwegs verständliche Ansage zu konvertieren kann man z.B Text to Speech Demo verwenden.

apt-get install sox


Nachdem die erzeugte .wav Datei lokal gespeichert ist kann man sie per sox noch ins raw Format wandeln.

sox -V auswahlExtern.wav -r 8000 -c 1 -w /usr/share/asterisk/sounds/auswahlExtern.raw


Das Menu verwirklicht man, indem man erstmal das Gesprä mit Answer() aufnimmt, kurz wartet und dem Anrufer die Audio Datei vorspielt. Die Auswahl wird per DTFM (Tastendruch bei Tonwahl) an den asterisk übermittelt. Dafür ist Read() zuständig. Die erste Veriable die man dem Read() mitgibt ist die Variable, in die der übermittelte Wert geschrieben werden soll, die dritte Variable gibt an, wie viele Stellen zu erwarten sind. In diesem Fall ist es nur eine. Danach wird über if Abfragen der Wert der Variablen geprüpft und der Anrufer entsprechend weitergeleitet.

exten => 5,n(sichereAuswahl),Noop(sichereAuswahl)
exten => 5,n,Answer()
exten => 5,n,Wait(2)
exten => 5,n,Playback(sichereAuswahl)
exten => 5,n,Read(auswahl,,1)
exten => 5,n,GotoIf($[${auswahl} = 1 ]?vpnraum:weiterr1)
exten => 5,n(weiterr1),GotoIf($[${auswahl} = 2 ]?telefonraum:bye)

exten => 5,n(unsichereAuswahl),Noop(unsichereAuswahl)
exten => 5,n,Answer()
exten => 5,n,Wait(2)
exten => 5,n,Playback(unsichereAuswahl)
exten => 5,n,Read(auswahl,,1)
exten => 5,n,GotoIf($[${auswahl} = 1 ]?telefonraum:weiter1)
exten => 5,n(weiter1),GotoIf($[${auswahl} = 2 ]?durchstellen:weiter2)
exten => 5,n(weiter2),GotoIf($[${auswahl} = 3 ]?ip:weiter3)
exten => 5,n(weiter3),GotoIf($[${auswahl} = 8 ]?ajaxterm:weiter4)
exten => 5,n(weiter4),GotoIf($[${auswahl} = 9 ]?eyeos:bye)

exten => 5,n(bye),Hangup()


Anrufe durchstellen

Um einen Anruf auf ein anderes Telefon durch zu stellen benutzt man den Befehl Dial(). Als Parameter werden mitgegeben weclches Protokoll verwendet werden soll (in unserem Fall CAPI, also ein Anruf im üblichen Sinn über ISDN, alternativ wäre auch ein SIP Gespräch denkbar, SIP ist ein Protokoll das für Netzwerk- bzw. Internettelefonie oft verwendet wird.)
Als weiteren Parameter geben wir an, welcher CAPi Controller verwendet werden soll, hier contr1. Welcher Controller welcher ISDN Karte entspricht wird in der /etc/asterisk/capi.conf festgelegt.
Als dritten Parameter braucht der Befehl noch die Nummer, die angerufen werden soll. Diese kann in diesem Fall der Anrufer selbst eingeben; sie wird per read() Befehl eingelesen.


exten => 5,n(durchstellen),Noop(DURCHSTELLEN)
exten => 5,n,Wait(1)
exten => 5,n,Playback(dialNumber)
exten => 5,n,Read(NUMMER)
exten => 5,n,Dial(CAPI/contr1/${NUMMER})
exten => 5,n,Hangup()


IP vorlesen lassen

Ihr braucht dafür zusätzlich die Datei /home/user/asterisk/ip.sh Ihr könnt die Datei natürlich auch an einen anderen Ort legen. Dann müsst Ihr die beiden Befehle System() und ReadFile() im folgenden Block entsprechend anpassen.

exten => 5,n(ip),Noop(IP Anzeigen)
exten => 5,n,Wait(2)
exten => 5,n,System(cd /home/user/asterisk && ./ip.sh)
exten => 5,n,ReadFile(ip=/home/user/asterisk/ip,15)
exten => 5,n,Noop(${ip})
exten => 5,n,SayPhonetic(${ip})
exten => 5,n,Hangup()


Apache WebServer fernsteuern

Um den Apache Web Server fernzusteuern und durch einen Anruf zwischen verschiedenen Webseiten umschalten zu können werden definieren wir zunächst in der global Sektion der /etc/asterisk/extension.conf ein paar Variablen.

[globals]

apache_ajaxterm_copy=System(/home/user/Apache2/apache_ajaxTerm_copy.sh)
apache_ajaxterm_delete=System(/home/user/Apache2/apache_ajaxTerm_delete.sh)

apache_eyeos_copy=System(/home/user/Apache2/apache_eyeOS_copy.sh)
apache_eyeos_delete=System(/home/user/Apache2/apache_eyeOS_delete.sh)

apache_start=System(/home/user/Apache2/apache_start.sh)
apache_stop=System(/home/user/Apache2/apache_stop.sh)


Man kann zwar die Befehle auch direkt den Variablen zuordnen, aber dann bricht asterisk ab, sobald ein Befehl nicht ausgeführt werden konnte. Dieses Verhalten kann man mit Shell Scripts (also die .sh Dateien) vermeiden.
Die Befehle, die wir in die Variablen geschrieben haben führen wir mit dem Befehl Exec() aus.

exten => 5,n(ajaxterm),Noop(AjaxTerm aktivieren)
exten => 5,n,Exec(${apache_stop})
exten => 5,n,Exec(${apache_eyeos_delete})
exten => 5,n,Exec(${apache_ajaxterm_copy})
exten => 5,n,Exec(${apache_start})
exten => 5,n,Hangup()

exten => 5,n(eyeos),Noop(eyeOS aktivieren)
exten => 5,n,Exec(${apache_stop})
exten => 5,n,Exec(${apache_ajaxterm_delete})
exten => 5,n,Exec(${apache_eyeos_copy})
exten => 5,n,Exec(${apache_start})
exten => 5,n,Hangup()


Telefonkonferenzen

Zunächst muss der zaptel Treiber installiert sein, wie bei asterisk installieren beschrieben. Dann müssen in die Datei /etc/asterisk/meetme.conf die gewünschten Konferenzräume eingetragen werden.

conf => telefonraum conf => vpnraum


In der Datei /etc/asterisk/extensions.conf schickt man dann Anrufer mit meetme(Konferenzraum) in den jeweiligen Konferenzraum.

exten => 5,n(telefonraum),Noop(TELEFONRAUM)
exten => 5,n,Wait(1)
exten => 5,n,meetme(telefonraum)
exten => 5,n,Hangup()

exten => 5,n(vpnraum),Noop(VPNRAUM)
exten => 5,n,meetme(vpnraum)
exten => 5,n,Hangup()


Fehlerhafte Nummern abfangen

exten => i,1,Answer()
exten => i,n,Playback(that-is-not-rec-phn-num)
exten => i,n,Hangup()