Aus Linux-Magazin 12/2008

Workshop: Programmieren mit dem Asterisk Gateway Interface (Seite 5)

Im Zweifel die Quellen

Beschleicht Sie der Verdacht, dass die Dokumentation bei [6] veraltet ist, oder brauchen Sie den Datentyp eines Rückgabewerts, hilft das Studium des Asterisk-Quelltextes. Die Quelltextdatei für den Befehl »AGI« trägt den Namen »Asterisk-Quellverzeichnis/res/res_agi.c«. Unter [7] gibt es zudem eine mit Doxygen erstellte Dokumentation der Asterisk-Quellen. Daten, die Asterisk an das AGI-Programm schickt, beginnen im Quelltext mit »fdprintf(fd,« oder »fdprintf(agi->fd,«.

Für jeden AGI-Befehl gibt es in der Datei eine eigene Funktion, für »STREAM FILE« beispielsweise ist die Funktion »handle_streamfile()« zuständig. Die beiden Zeilen

fdprintf(agi->fd, "200 result=%d endpos=%ldn", 0, sample_offset);
fdprintf(agi->fd, "200 result=%d endpos=%ldn", res, sample_offset);

machen klar, dass Asterisk eine Antwort in der Art »200 result=%d endpos=%ldn« zurückliefern wird, wobei »%d« ein Integer ist und »%ld« ein Long Integer.

Dead-AGI beim Hangup

Eine weitere Möglichkeit, AGI-Programme zu starten, bietet der Dialplan-Befehl »DeadAGI«. Er dient dazu, Programme in einer Hangup-Extension aufzurufen. Der folgende Context stellt das dar:

[default]
exten => 69,1,Answer()
exten => 69,2,AGI(agi.php)
exten => 69,3,Hangup()
exten => h,1,DeadAGI(deadagi.php)

Wenn ein Benutzer auflegt, während »agi.php« läuft, springt Asterisk sofort in die Extension »h«, ohne die Priority 3 in der Extension »69« auszuführen. In »h« startet »DeadAGI« dann das Programm »deadagi.php«.

Dead-AGI-Programme werden gern benutzt, um Aufräumarbeiten zu erledigen. So könnte zum Beispiel das Programm »agi.php« mehrere temporäre Dateien gespeichert haben, deren Namen alle mit dem Namen des Channel beginnen. Da der Channel-Name auch in »deadagi.php« zur Verfügung steht, können Sie darin alle temporären Dateien löschen, die mit dem Channel-Namen beginnen.

Die Abfrage des Channel-Status mit dem AGI-Befehl »CHANNEL STATUS« in »deadagi.php« liefert möglicherweise überraschend die Antwort »Line is up« – und das selbst bei folgendem Context:

[default]
exten => 69,1,Answer()
exten => 69,2,Hangup()
exten => h,1,DeadAGI(deadagi.php)

Dies ist wichtig für Abrechnungsfragen. Wenn in dem eben gezeigten Context das Dead-AGI-Programm nichts anderes macht, als 10 Sekunden zu warten, dann zeigt Asterisk in den Call Detail Records eine Abrechnungszeit von mindestens 10 Sekunden an. Die wohl eher gewünschte Abrechnungszeit von 0 Sekunden liefert dagegen der Context:

[default]
exten => 69,1,Answer()
exten => 69,2,Hangup()
exten => h,1,ResetCDR(w)
exten => h,2,DeadAGI(deadagi.php)

Der Befehl »ResetCDR(w)« speichert den momentanen Zustand des Call Detail Record. Nach dem Aufruf des Dead-AGI-Programms in der Hangup-Extension können natürlich weitere Priorities folgen, die Asterisk nach Beendigung des Dead-AGI-Programms ausführen soll.

Abbildung 4: In der zweiten Zeile teilt Asterisk mit, dass es das Programm »tue-nichts« aufruft. Es besteht lediglich aus der Zeile »int main() {return 0;}«. Das AGI-Debugging ist bei diesem Aufruf aktiviert.

Abbildung 4: In der zweiten Zeile teilt Asterisk mit, dass es das Programm »tue-nichts« aufruft. Es besteht lediglich aus der Zeile »int main() {return 0;}«. Das AGI-Debugging ist bei diesem Aufruf aktiviert.

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Comments
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben