Die Schwierigkeit eines solchen Buches liegt unter anderem im breit gestreuten Grundwissen der Leser. Ein Buch über Asterisk wird von Admins, Programmierern, Telefonanlagentechnikern und vielen anderen technisch interessierten Menschen 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 beispielhaft vor und verweise bei Detailfragen auf Anhang B, 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.
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.
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 Variablen
Gelten im gesamten Dialplan und werden mit
Set(X=23,g)
generiert und verändert.
exten => 1004,1,Set(SOLL-UEBERALL-LESBAR-SEIN = 23,g) exten => 1004,n,NoOp(${SOLL-UEBERALL-LESBAR-SEIN})
Channel 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)
generiert und verändert.
exten => 1005,1,Set(SOLL-NUR-HIER-LESBAR-SEIN = 42) exten => 1005,n,NoOp(${SOLL-NUR-HIER-LESBAR-SEIN})
System Variablen
Diese sind quasi "Gott gegeben" (ok, 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: „Variablen“
Mit Goto()
kann man innerhalb des Dialplanes Sprünge
zu einem mit (Labelname) definierten Label vollziehen:[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:
„Goto()
“
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()
Siehe auch:
„While()
“
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} k ommt.) exten => 1014,n,GotoIf($[${CALLERID(num) = ${Lieblingsnebenstelle}]?ja,n ein) exten => 1014,n(ja),Playback(hello-world) exten => 1014,n,Hangup() exten => 1014,n(nein),Playback(tt-monkeys) exten => 1014,n,Hangup()
Siehe auch:
„GotoIf()
“
Mit Gosub() kann man in ein Unterprogramm springen und aus diesem mit Return() 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()
Siehe auch: „Gosub()
“, „GosubIf()
“, „Return()
“, „Macro()
“
[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.