Springe zu: Hauptnavigation, Themennavigation, Seiteninhalt, Spezielle Seiten

Asterisk als Wecker verwenden

In diesem Artikel zeige ich wie man mit Asterisk einen Wecker programmieren kann. Dazu kommen zwei Techniken zum Einsatz. Das Herzstück ist ein sogenanntes Call File. Diese Datei steuert, wann Asterisk automatisch einen Anruf auslösen soll und was passiert, wenn das Gespräch entgegengenommen wird. Damit wir das Call File später nicht per Hand für jeden Weckruf anlegen müssen, werden wir im zweiten Schritt eine Extension programmieren, die alle erforderlichen Informationen über die Telefontastatur abfragt und die Datei automatisch erstellt. Doch beginnen wir zuerst mit ein paar per Hand erstellten Tests mit einem Call File.

Ein einfaches Call File

Ein Call File besteht aus Anweisungen, die jeweils in einer eigenen Zeile notiert werden. Es ist wichtig, dass die Datei erst in das Call File-Verzeichnis /var/spool/asterisk/outgoing verschoben wird, nachdem dieses komplett erstellt und ggf. mit einem anderen Zeitstempel versehen wurde. Würde man die Datei nämlich in das Verzeichnis kopieren, könnte Asterisk eine halbfertige Datei öffnen und mit der Abarbeitung beginnen, was zu ungewollten Effekten führen kann. Wird die Datei stattdessen verschoben, ist das Call File dagegen erst für Asterisk greifbar, wenn der komplette Inhalt im Verzeichnis angekommen ist.

Wir erstellen in einem temporären Verzeichnis eine Datei, die das SIP-Gerät mit der Rufnummer 7424 im Context intern anrufen soll. Wird das Gespräch entgegengenommen, soll die Extension callfiletest abgearbeitet werden. Hier wird ein Morsecode abgespielt und das Gespräch beendet.

Die Datei /tmp/callfile.call hat folgenden Inhalt:

Channel: SIP/7424
Context: intern
Extension: callfiletest

Diese drei Zeilen reichen für ein einfaches Beispiel aus. Im Dialplan von Asterisk ist der context intern um die Extension callfiletest zu erweitern. Sonst könnte der gesteuerte Anruf nicht komplett ausgeführt werden. Die Erweiterung der Datei /etc/asterisk/extensions.ael sieht für den Context intern wie folgt aus:

callfiletest => {
    Answer();
    Wait(1);
    Morsecode(gack);
    Hangup();
}

Die Dialplan-Erweiterung wird erst wirksam, wenn man sich mit dem Asterisk CLI verbindet (Befehl asterisk -r) und die AEL-Konfiguration mit dem Befehl ael reload neu einlesen lässt.

Nun bringen wir das Call File in Position und verschieben die Datei in das Asterisk-Verzeichnis für die abzuarbeitenden Call Files:
debian:~# mv /tmp/callfile.call /var/spool/asterisk/outgoing/

Asterisk findet die Datei und stellt fest, dass die Zeit der letzten Änderung in der Vergangenheit liegt oder exakt mit der aktuellen Zeit übereinstimmt. Daher wird die Datei abgearbeitet. Liegt die Zeit der letzten Änderung in der Zukunft, wird solange gewartet, bis die Zeit erreicht oder verstrichen ist. Dadurch lassen sich Anrufe für die Zukunft programmieren, was wir im nächsten Schritt für die Weckfunktion nutzen wollen.

Die Zeit der Ausführung festlegen

Nun wollen wir festlegen, wann das Call File abgearbeitet werden soll. Dies ist für die Weckfunktion erforderlich, da die Datei während des Telefonats erstellt aber nicht sofort ausgeführt werden soll.

Die Datei /tmp/callfile.call wird mit dem weiter oben gezeigten Inhalt erstellt. Bevor die Datei in das Asterisk-Verzeichnis für Call Files verschoben wird, stellen wir die Zeit der letzten Änderung um 90 Sekunden in die Zukunft:

debian:~# touch -d "$(date -Rd '+90 seconds')" /tmp/callfile.call
debian:~# mv /tmp/callfile.call /var/spool/asterisk/outgoing/

Nach etwa 90 Sekunden sollte das Telefon klingeln und nach der Gesprächsannahme die eingestellte Extension ausgeführt werden.

Den Wecker über das Telefon programmieren

Der Wecker soll über die Extension 9325 programmiert werden können. Die Rufnummer des Anrufers steht uns in der Extension durch die Variable ${CALLERID(num)} zur Verfügung. Datum und Uhrzeit werden über die Telefontastatur abgefragt. Das Call File wird unter einem namen gespeichert, der von Asterisk während des Anrufes in der Variable ${UNIQUEID} bereitgestellt wird. Wird später der Weckruf ausgelöst, wird die Extension hangup abgearbeitet, die das Gespräch sofort beendet. Wenn Asterisk einmal mit der großen Telefonwelt verbunden ist und auch ins Festnetz telefonieren kann, entstehen uns so keine oder nur geringe Gebühren. Damit der Anrufer weiß was er wann eingeben muss, habe ich drei zusätzliche Sprachbausteine erstellt, die ich zum Herunterladen anbiete. Die GSM-Dateien werden im Verzeichnis für die Sprachbausteine abgelegt und beginnen mit dem Präfix lfb-. Hier die Kommandos zum Einbinden der Prompts:

debian:~# cd /usr/src/asterisk/
debian:/usr/src/asterisk# wget http://www.linux-fuer-blinde.de/pub/asterisk/sounds-wecker.tar.gz
--2010-01-31 22:32:45--  http://www.linux-fuer-blinde.de/pub/asterisk/sounds-wecker.tar.gz
Auflösen des Hostnamen »www.linux-fuer-blinde.de«.... 213.239.210.240
Verbindungsaufbau zu www.linux-fuer-blinde.de|213.239.210.240|:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 19383 (19K) [application/x-gzip]
In »sounds-wecker.tar.gz« speichern.

100%[======================================>] 19.383      --.-K/s   in 0,1s

2010-01-31 22:32:45 (155 KB/s) - »sounds-wecker.tar.gz« gespeichert [19383/19383]

debian:/usr/src/asterisk# cd /var/lib/asterisk/sounds/de
debian:/var/lib/asterisk/sounds/de# tar xvzf /usr/src/asterisk/sounds-wecker.tar.gz
lfb-datum.gsm
lfb-uhrzeit.gsm
lfb-weckrufok.gsm
debian:/var/lib/asterisk/sounds/de#

Nun werden die Extensions für den Weckruf im Context intern in den Dialplan eingefügt. Dazu bearbeiten wir die Datei extensions.ael:

9325 => { // Weckruf
    Answer();
    Read(datum,lfb-datum,8);
    Read(uhr,lfb-uhrzeit,4);
    System(echo -e "Channel: SIP/${CALLERID(num)}\nContext: intern\nExtension: Hangup" > /tmp/${UNIQUEID}.call);
    Set(tag=${datum:0:2});
    Set(monat=${datum:2:2});
    Set(jahr=${datum:4:4});
    System(touch -t ${jahr}${monat}${tag}${uhr} /tmp/${UNIQUEID}.call);
    System(mv /tmp/${UNIQUEID}.call /var/spool/asterisk/outgoing/);
    Playback(lfb-weckrufok);
    Hangup();
}

Hangup => {
    Hangup();
}

Nun noch ein paar Kommentare zur Extension für die Weckruf-Programmierung:

Zuerst wird der virtuelle Hörer abgenommen und das Gespräch entgegengenommen. Mit der Applikation Read() werden die vom Anrufer eingegebenen Ziffern in einer Variable gespeichert. Die Anzahl der einzulesenden Ziffern wird mit angegeben. Das Datum besteht ja aus acht Ziffern, während die Uhrzeit nur aus vier besteht.

Mit der Applikation System() kann ein normaler Konsolenbefehl ausgeführt werden. In diesem Fall verwenden wir echo mit der Option -e, die unsere eingegebenen Steuerzeichen für den Zeilenumbruch in das Call File übernimmt. Der Backslash muss für Asterisk maskiert werden, weshalb er doppelt notiert wird. Die anweisungen im Call File wurden schon oben beschrieben. Die drei Set()-Aufrufe zerlegen das eingegebene Datum in die Bestandteile für Tag, Monat und Jahr. Wie man daran sehen kann, können auf einzelne Bestandteile einer Variable zugegriffen werden (Stichwort substring).

Damit die Änderungen am Dialplan wirksam werden, muss im Asterisk CLI der Befehl ael reload ausgeführt werden. Nun können die SIP-geräte einen Weckruf unter der Servicenummer 9325 programmieren.

Datum der Veröffentlichung: Sonntag, 31.01.2010

Nach oben

Diese Seite drucken