6.1. Kleines Programmierer-Howto
Die Schwierigkeit, ein Buch wie dieses zu schreiben, besteht unter
anderem im unterschiedlichen Vorwissen der Leser. Ein Buch über Asterisk
wird von Admins, Programmierern, Telefonanlagentechnikern und vielen
anderen technisch Interessierten gelesen. Die praktischen
Programmierkenntnisse sind dabei sehr unterschiedlich ausgeprägt. Um die
Fähigkeiten von Asterisk auszureizen, benötigt man schon einfache
Programmierkenntnisse und ein gesundes Basiswissen. In diesem Howto möchte
ich die wichtigsten Grundprinzipien und Ideen für Programmierer erläutern.
Dabei gehe ich anhand von Beispielen vor und verweise bei Detailfragen auf
Anhang C, Applikationen im Dialplan. Einige Themen werden Sie hier sicher aus
anderen Kapiteln wiedererkennen. Dieses kleine Howto soll Ihnen einen sehr
schnellen Überblick zu dem Thema bieten.
6.1.1. Programmstruktur
Im Dialplan (also der
/etc/asterisk/extensions.conf
) gibt es für jede zur
Verfügung gestellte Zielrufnummer ein kleines Programm. Dieses Programm
heißt bei Asterisk Extension. Eine Extension sieht
dabei wie folgt aus:exten => 1001,1,Answer() exten => 1001,n,Playback(hello-world) exten => 1001,n,Hangup()
Häufig sieht man die Prioritäten auch nicht mit
n
,
sondern mit Zahlen benannt:exten => 1001,1,Answer() exten => 1001,2,Playback(hello-world) exten => 1001,3,Hangup()Die Funktionsweise der jeweiligen Extensions ist identisch. Wer mit
n
programmiert, kann
später aber leichter einzelne Zeilen löschen oder hinzufügen.6.1.2. Variablen
Zum Generieren und Verändern von Variablen wird die Applikation
Set()
benutzt:exten => 1002,1,Set(Lieblingstier=Tiger) exten => 1002,n,Set(Lieblingszahl=23)
Zum Lesen und Ausgeben von Variablen wird die Syntax
${VARIABLENNAME}
benutzt. Mit der Applikation
NoOp()
kann man Variablenwerte auf dem CLI ausgeben (ab
Verbose-Level 3):exten => 1003,1,NoOp(${Lieblingstier}) exten => 1003,n,NoOp(${Lieblingszahl})
Es gibt verschiedene Arten von Variablen:
- Globale VariablenGlobale Variablen gelten im gesamten Dialplan und werden bei Bedarf in der
extensions.conf
im Abschnitt[globals]
[globals] SOLL_UEBERALL_LESBAR_SEIN=>23
bzw. in derextensions.ael
inglobals
gesetzt:globals { SOLL_UEBERALL_LESBAR_SEIN=23; }
Sie können auch im Dialplan mitSet(GLOBAL(X)=23)
gesetzt und verändert werden:exten => 1004,1,Set(GLOBAL(SOLL_UEBERALL_LESBAR_SEIN)=23) exten => 1004,n,NoOp(${SOLL_UEBERALL_LESBAR_SEIN})
- Channel-VariablenChannel-Variablen gelten nur im aktiven Channel (ein Channel kann z. B. ein Gespräch von Peter und Uwe sein). Sie werden mit
Set(Y=42)
definiert und verändert.exten => 1005,1,Set(SOLL_NUR_HIER_LESBAR_SEIN=42) exten => 1005,n,NoOp(${SOLL_NUR_HIER_LESBAR_SEIN})
- SystemvariablenSystemvariablen sind quasi „gottgegeben“ (okay, natürlich eher „Asterisk-gegeben“ ;-)) und können einfach im Dialplan aufgerufen werden. Eine typische Systemvariable ist
${EXTEN}
:exten => 1006,1,NoOp(Gewaehlte Nummer: ${EXTEN})
Siehe auch:
Abschnitt 6.2, „Variablen“6.1.3. Labels und Goto()
Mit
Goto()
kann man innerhalb des Dialplans zu einem
mit „(Labelname
)
“
definierten Label springen:[24]- Innerhalb einer Extension:
exten => 1007,1,Answer() exten => 1007,n(Anfang),Wait(1) exten => 1007,n,Playback(hello-world) exten => 1007,n,Goto(Anfang)
- Von Extension zu Extension:
exten => 1008,1,Answer() exten => 1008,n,Goto(1009,Ping) exten => 1009,1(Ping),Playback(hello-world) exten => 1009,n,Wait(2) exten => 1009,n,Goto(1010,Pong) exten => 1010,1(Pong),Playback(weasels-eaten-phonesys) exten => 1010,n,Wait(2) exten => 1010,n,Goto(1009,Ping)
- Von Context zu Context:
[zentrale] exten => 1011,1,Answer() exten => 1011,n,Playback(hello-world) exten => 1011,n,Goto(verkauf,1012,1) [verkauf] exten => 1012,1,Playback(hello-world) exten => 1012,n,Hangup()
Siehe auch:
Abschnitt C.65, „Goto()
“6.1.4. While()-Schleifen
Mit
While()
lassen sich Schleifen im Dialplan
erzeugen:exten => 1013,1,Answer() exten => 1013,n,Set(i=1) exten => 1013,n,While($[${i} < 10]) exten => 1013,n,SayNumber(${i}) exten => 1013,n,Wait(1) exten => 1013,n,Set(i=$[${i} + 1]) exten => 1013,n,EndWhile() exten => 1013,n,Hangup()
6.1.5. GotoIf()-Bedingung
Mit
GotoIf()
lassen sich Sprünge zu anderen Teilen im
Dialplan mit einer Bedingung verbinden:exten => 1014,1,Answer() exten => 1014,n,Set(Lieblingsnebenstelle = 0815) exten => 1014,n,NoOp(Ueberpruefe, ob Anruf von ${Lieblingsnebenstelle} kommt.) exten => 1014,n,GotoIf($[${CALLERID(num)} = ${Lieblingsnebenstelle}]?ja:nein) exten => 1014,n(ja),Playback(hello-world) exten => 1014,n,Hangup() exten => 1014,n(nein),Playback(tt-monkeys) exten => 1014,n,Hangup()
6.1.6. Gosub()-Unterprogramme
Mit
Gosub()
können Sie in ein Unterprogramm springen,
und mit Return()
kehren Sie aus diesem wieder
zurück:exten => 1015,1,Gosub(cid-setzen) exten => 1015,n,Dial(SIP/${EXTEN}) exten => 1015,n(cid-setzen),Set(CALLERID(all)=Apfelmus GmbH <012345678>) exten => 1015,n,Return()
[24] Man kann natürlich mit Goto()
auch zu einer
bestimmten Priorität springen. Aber dann ist der ganze Vorteil der
n-Priorität wieder weg.