Call Files lassen sich am ehesten mit Batch-Dateien vergleichen. Sie
werden ins Verzeichnis /var/spool/asterisk/outgoing/
verschoben und dort dann von Asterisk abgearbeitet.
Ein mv (move) ist im Dateisystem ein atomarer Vorgang und deshalb für Call Files ideal geeignet. Bei einem cp (copy) wird dagegen die Datei Zeile für Zeile kopiert. Es kann also vorkommen, dass ein halbfertig kopiertes Call File von Asterisk bereits abgearbeitet wird. |
Der ganze Mechanismus lässt sich anhand eines Beispiels besser erklären. Nehmen wir an, dass an einer Asterisk-Anlage ein SIP-Telefon mit der Nummer 2000 angemeldet ist. Weiterhin haben wir im Dialplan die folgende Extension eingetragen:
[call-file-test] exten => 10,1,Answer() exten => 10,n,Wait(1) exten => 10,n,Playback(hello-world) exten => 10,n,Wait(1) exten => 10,n,Hangup()
Jetzt generieren wir im Verzeichnis /tmp/
die
Datei ein-test.call
mit folgendem
Inhalt:
Channel: SIP/2000 MaxRetries: 2 RetryTime: 60 WaitTime: 30 Context: call-file-test Extension: 10
Danach verschieben wir diese Datei mit mv /tmp/ein-test.call /var/spool/asterisk/outgoing/
root@molokai:~>mv /tmp/ein-test.call /var/spool/asterisk/outgoing/
Jetzt passiert Folgendes:
/var/spool/asterisk/outgoing/
ein Call File
befindet, und arbeitet dieses ab, sobald es da ist.SIP/2000
. Wenn das Telefon besetzt sein oder nicht
rangehen sollte, dann versucht Asterisk das gleiche noch zwei Mal
(siehe MaxRetries
).[call-file-test]
die
Abarbeitung der Extension 10
. Es wird also der
Sprachbaustein hello-world
abgespielt.Im Call File können folgende Parameter angegeben werden:
Channel: <channel>
Dial()
-Befehl (siehe „Dial()
“).Callerid: <callerid>
WaitTime: <number>
MaxRetries: <number>
RetryTime: <number>
Account: <account>
Context: <context>
Extension: <exten>
Priority: <priority>
Setvar: <var=value>
Setvar:
können beliebig
viele Channelvariablen definiert werden.Archive: <yes|no>
Normalerweise werden Call Files nach der Abarbeitung
direkt gelöscht. Ist Archive: yes
gesetzt, werden die Call Files aber stattdessen ins Verzeichnis
/var/spool/asterisk/outgoing_done/
verschoben. Dabei wird Asterisk noch eine Zeile zum Call File
hinzufügen. Diese beschreibt das Ergebnis des Call Files und
sieht so aus:
Status: <Expired|Completed|Failed>
Beim Aufruf eines Call Files vergleicht Asterisk die Zeit der letzten Änderung der Datei mit der aktuellen Uhrzeit. Liegt dieser Eintrag in der Zukunft, wird das Call File noch nicht abgearbeitet. So kann man leicht Call Files zeitgesteuert abarbeiten.
Nehmen wir an, ein Hotel möchte über Asterisk ein einfaches Weckrufsystem erstellen. Kunden sollen einen Weckruf über die Servicerufnummer *77* aktivieren können. Nach der *77* soll das genaue Datum und die Weckuhrzeit gewählt werden.
[hotel-intern] exten => _*77*XXXXXXXXXXXX,1,Answer() exten => _*77*XXXXXXXXXXXX,n,Set(Jahr=${EXTEN:4:4}) exten => _*77*XXXXXXXXXXXX,n,Set(Monat=${EXTEN:8:2}) exten => _*77*XXXXXXXXXXXX,n,Set(Tag=${EXTEN:10:2}) exten => _*77*XXXXXXXXXXXX,n,Set(Stunden=${EXTEN:12:2}) exten => _*77*XXXXXXXXXXXX,n,Set(Minuten=${EXTEN:14:2}) exten => _*77*XXXXXXXXXXXX,n,NoOp(Weckruf soll fuer die Rufnummer ${CALL ERID(num)} soll um ${Stunden}:${Minuten} Uhr am ${Tag}.${Monat}.${Jahr} erfolgen.) exten => _*77*XXXXXXXXXXXX,n,System(echo -e "Channel: SIP/${CALLERID(num )}\\nContext: Weckruf\\nExtension: 23" > /tmp/${UNIQUEID}.call) exten => _*77*XXXXXXXXXXXX,n,System(touch -t ${Jahr}${Monat}${Tag}${Stun den}${Minuten} /tmp/${UNIQUEID}.call) exten => _*77*XXXXXXXXXXXX,n,System(mv /tmp/${UNIQUEID}.call /var/spool/ asterisk/outgoing/) exten => _*77*XXXXXXXXXXXX,n,Playback(rqsted-wakeup-for) exten => _*77*XXXXXXXXXXXX,n,SayNumber(${Stunden}) exten => _*77*XXXXXXXXXXXX,n,SayNumber(${Minuten}) exten => _*77*XXXXXXXXXXXX,n,Playback(digits/oclock) exten => _*77*XXXXXXXXXXXX,n,Hangup() [Weckruf] exten => 23,1,Answer() exten => 23,n,Wait(1) exten => 23,n,Playback(this-is-yr-wakeup-call) exten => 23,n,Wait(1) exten => 23,n,Hangup()