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.

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.

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 Variablen

    Globale Variablen gelten im gesamten Dialplan und werden bei Bedarf in der extensions.conf im Abschnitt [globals]

    [globals]
    SOLL_UEBERALL_LESBAR_SEIN=>23

    bzw. in der extensions.ael in globals gesetzt:

    globals {
        SOLL_UEBERALL_LESBAR_SEIN=23;
    }

    Sie können auch im Dialplan mit Set(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-Variablen

    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) definiert und verändert.

    exten => 1005,1,Set(SOLL_NUR_HIER_LESBAR_SEIN=42)
    exten => 1005,n,NoOp(${SOLL_NUR_HIER_LESBAR_SEIN})
  • Systemvariablen

    Systemvariablen 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 2, „Variablen“

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 65, „Goto()

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()

Siehe auch: Abschnitt 195, „While(), Expression

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()

Siehe auch: Abschnitt 66, „GotoIf(), Expression

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()

Siehe auch: Abschnitt 63, „Gosub(), Abschnitt 64, „GosubIf(), Abschnitt 137, „Return(), Abschnitt 81, „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.


AMOOCON 2010

Noch kein Ticket? Dann wird es Zeit. Nur noch wenige Tage.

Twitter

Flattr

Das gedruckte Buch

Werbung