Archiv der Kategorie: Asterisk

Telefonieren mit Asterisk (VI)

Was genau geschieht, wenn ein Teilnehmer mehrere Anrufe gleichzeitig erhält? Oder anders, etwas differenzierter gefragt: was geschieht, wenn ein am Asterisk Server angeschlossenes Telefon einen Anruf erhält, während dieser Apparat gerade für ein Gespräch genutzt wird? Antwort: Bei der Digitaltelefonie sind mehrere, gleichzeitige Anrufe problemlos möglich. Ruft jemand auf eine Nummer, die gerade für ein Gespräch genutzt wird, wird dies dem Angerufenen optisch oder akustisch mitgeteilt. Dieser kann nun entscheiden, was er mit dem neuen Anruf machen will: abweisen, parken oder annehmen, während der bisherige Gesprächspartner im Haltemodus bleibt.

Einem Kunden war dies alles zu kompliziert. Er wünschte das gute alte Besetztzeichen zurück! Während er also telefoniert ist er für niemand anders erreichbar und Anrufer erhalten das aus der Analogtelefonie bekannte Besetztzeichen. Glücklicherweise verwenden wir SNOM Telefone und mit diesen ist dies recht einfach zu bewerkstelligen. Die alles entscheidende Option findet sich im Webinterface des Telefones in der Rubrik «Erweitert/Audio»:

Ich verwende hier ein SNOM 320 mit der Firmware 7.3.14. Die Sprache ist auf deutsch eingestellt. Die gesuchte Option heisst deshalb «Anklopfen» Die englische Bezeichnung lautet: «Call Waiting». Hier kann eingestellt werden, wie sich das Telefon verhalten soll, wenn es mehrere Anrufe erhält. Per Vorgabe lautet die Einstellung Ein – der Angerufene wird mit einem Klingelzeichen und einer Anzeige auf dem Display auf den neuen Anrufer aufmerksam gemacht. Die beiden folgenden Optionen, Nur Klingeln und Visuell schränken dieses Verhalten entsprechend ein. Mit der letzten Einstellung, Aus, wird dem Asterisk Server ein BUSY signalisiert, sobald er mehr als einen Anruf zustellen will.

Auf Seite des Asterisk Server erfolgt diese BUSY Meldung des SNOM beim Aufruf der Applikation Dial(), die ich hier schon vorgestellt habe. Wichtig ist hier zu wissen, dass Asterisk nicht automatisch ein Besetztzeichen sendet, sondern einfach die Dial() Applikation beendet und die Abarbeitung des Dialplan fortsetzt. Um sicherzustellen, dass der Anrufer auch tatsächlich das vertraute Besetztzeichen hört und es später noch einmal versucht, muss die Busy() Applikation aufgerufen werden, wenn der Rückgabestatus der Dial() Applikation “BUSY” lautetet. Wir ergänzen den Dialplan aus II wie folgt:

exten => 200, 1, Answer
exten => 200, n, Dial(SIP/pc2, 60)
exten => 200, n, GotoIf($["${DIALSTATUS}" != "BUSY"] ?alldone)
exten => 200, n, Busy
exten => 200(alldone), n, Hangup

Die Dial() Applikation hat eine äusserst nützliche Funktion, die wir hier nutzen: sie liefert uns nach Beendigung in einer Variablen den Status des Anrufes: Keine Antwort(NOANSWER), Überlastet (CONGESTION), Unerreichbar (CHANUNAVAIL), etc. Dieser Status, der in der Variablen ${DIALSTATUS} gespeichert ist, kann nun recht einfach mit einer GotoIf() Anweisung ausgewertet werden. In meinem Beispiel wird schlicht ein Label (alldone) verwendet, wenn das Telefon nicht besetzt ist. Natürlich wäre es hier angezeigt, auch die anderen Stati auszuwerten. Dabei könnte dem Anrufer die Möglichkeit gegeben werden, eine Nachricht zu hinterlassen.

LED’s auf SNOM Telefonen ein-/ausschalten

SNOM IP Telefone verfügen – je nach Modell – über sechs, resp. 12 programmierbare Funktionstasten. Jede dieser Tasten kann mit verschiedenen Aktionen belegt werden, das Wählen einer fest eingestellten Nummer ist dabei nur das einfachste Beispiel. Es ist auch möglich, Gespräche weiterzuleiten, für ein Gespräch einen bestimmten SIP Kanal zu verwenden oder den Anruf auf einer anderen Leitung entgegenzunehmen. Und da zu jeder Taste eine LED (Leuchtdiode) gehört, ist es auch möglich, einer Taste verschiedene Stati zuzuweisen. Mit der «hint»-Extension von Asterisk kann beispielsweise der Status einer Leitung angezeigt werden: frei, läutet oder belegt.

Damit die LED’s einzelner Tasten auch unabhängig von bestimmten Stati ein- oder ausgeschaltet werden können, hat SNOM eine einfache Notation eingeführt, die das entfernte Steuern der Dioden via SIP Message erlaubt. Das Dokument beschreibt sehr detailliert die einzelnen Betriebsmodi der Funktionstasten und die jeweils dazu gehörende Umsetzung. Was leider fehlt, ist ein Praxisbeispiel, etwa mit dem sipsak Utility von Nils Ohlmeier. Dies soll an dieser Stelle nachgeholt werden. Im folgenden Beispiel geht es lediglich darum, die LED der Funktionstaste 6 ein- und wieder auszuschalten. Ich verwenden dazum ein SNOM 370 mit einer Firmware Version 7.1.30 und sipsak 0.9.6. SNOM Telefone mit einer Firmware < 7.0 müssen auf 7.x aktualisiert werden. Zuerst muss eine SIP Message erstellt werden, diese hat folgendes Aussehen. Die Sequenznummern stehen hier in der Datei, was noch zu verbessern wäre: Datei: led.txt

MESSAGE $user$@$dsthost$;transport=udp SIP/2.0
From: sip:sipsak@$srchost$:1036;tag=38473
To: $user$@$dsthost$
Call-ID: 6algjorv@test
CSeq: 59620 MESSAGE
Max-Forwards: 70
Contact: < $user$@$dsthost$;transport=udp>
Subject: buttons
Content-Type: application/x-buttons
Content-Length: 10

k=6
c=on

Zu der SIP Message ist folgendes zu beachten:

  • Die Länge der SIP Message (Content-Length: 10) muss in jedem Fall angegeben werden. Hinweise darauf, dass sipsak diese Aufgaben übernimmt, scheinen nicht zu stimmen. Wird keine oder eine falsche Content-Length angegeben, sendet das SNOM zwar ein 200-OK, das Kommando wird aber nicht verarbeitet.
  • Bei $user$, $srchost$ und $dsthost$ handelt es sich um sipsak Tags, die bei der Verarbeitung durch die tatsächlichen Werte ersetzt werden. Siehe dazu die sipsak Manpage, insbesondere die Argumente -s und -G.
  • Mit k=6 wird bestimmt, welche Taste genau angesprochen wird. Die Ziffer 6 bezeichnet dabei nicht den Wert, der im Nummernfeld angegeben wurde, sondern den Index der Taste (1-12 bei einem SNOM 370). Mit k=1 wird die erste programmierbare Taste angesprochen, mit k=6 die Taste ganz unten links und mit k=12 die letzte, unten rechts.

Damit das ganze nun ausprobiert werden kann, wird ein SNOM Telefon benötigt, auf dem mindestens eine SIP Identität registriert worden ist. In meinem Beispiel kommen die folgenden Werte zur Anwendung:

IP des SNOM 370: 212.101.99.40
Identität 1 – Nutzerkennung: demo-3437
Identität 1 – Authorisierungsname: demo-3437
Identität 1 – Registrar: 212.101.99.41

Damit registriert sich das SNOM auf dem Asterisk Server, der auf einem Rechner mit der IP 212.101.99.41 installiert ist. Infos über das Erstellen von SIP Accounts gibt es auf voip-info.org. Wichtig: Damit das Beispiel funktioniert, sollte das SNOM Telefon ordnungsgemäss registriert sein. Der Grund dafür ist die SIP-User Kennung demo-3437, die im Folgenden verwendet wird.

Bevor die aufbereitete SIP Message an das SNOM gesendet werden kann, muss eine Funktionstaste mit dem Tastentyp «Button» belegt werden. Dies geht am einfachsten über das Webinterface des SNOM Telefones, in der Rubrik Funktionstasten. Ich verwende im Folgenden die Taste P6. Alles was hier eingestellt werden muss, ist der Tastentyp, der auf «Button» stehen muss, so wie im Beispiel rechts.

Damit sind wir schon fast am Ziel. Auf dem Asterisk Server wird nun mit sipsak die Datei sip.txt an das SNOM Telefon gesendet. Das sipsak Utility ist auf sipsak.org zu finden und kann von dort heruntergeladen und installiert werden. Das folgende Kommando sollte die sechste Funktionstaste (P6) auf dem SNOM zum Leuchten bringen.

sipsak -G --hostname 212.101.99.41 -s sip:demo-3437@212.101.99.40 
--filename led.txt

Wie so oft im Leben geht gerne etwas schief. Falls P6 nun nicht leuchtet, sollte folgendes kontrolliert werden:

  • Ist das SNOM so konfiguriert, dass es SIP Messages entgegennimmt? Ein FAQ-Artikel auf dem Snom WIKI gibt Auskunft, welche Einstellungen ggf. angepasst werden müssen.
  • Klappt der Transfer der SIP Message. sipsak kennt mehrere Verbosity-Level, mit denen die gesendeten und empfangenen SIP Blöcke angezeigt werden können: sipsak -vvv …
  • Auf dem Webinterface des SNOM gibt es zwei Seiten, die bei der Fehlersuche hilfreich sein können: Log und SIP-Protokollierung. Das SNOM muss bei der Antwort in jedem Fall ein «200 – OK» senden, wenn eine andere Meldung daherkommt, stimmt mit der SIP Nachricht etwas nicht.

Telefonieren mit Asterisk (IV)

Asterisk LogoIn den beiden letzten Kapiteln wurde der Grundstein für eine einfache, private Telefonzentrale gelegt, die das Führen externer Gespräche ermöglicht und jedem angeschlossenen Telefon eine interne, private Nummer zuweist, so dass auch interne Gespräche und Weiterleitungen möglich sind. Dabei sind einige wenige Anweisungen in den Wählplan eingebaut worden. Der Wählplan ist das Herzstück des Asterisk Servers und enthält ein enormes Potential. Mit Hilfe einer leicht verständlichen Makrosprache können einfache Aufgaben, wie etwa die bisher vorgestellte realisiert werden. Damit wird aber nur ein Bruchteil der Möglichkeiten ausgeschöpft, die der Wählplan bietet. Beispielsweise kann mit dem Wählplan festgelegt werden, dass ein Anrufer eine Nachricht (Voicemail) hinterlassen kann, wenn nach 60 Sekunden niemand den Anruf entgegenimmt oder die Leitung besetzt ist. Anhand der Nummer eines Anrufenden oder der Tages- oder Nachtzeit (…) kann entschieden werden, ob und wie ein Anruf entgegengenommen wird. Immer häufiger verwenden Teilnehmer die Rufnummerunterdrückung, vielleicht soll auch dieser Fall speziell berücksichtigt werden.

Ich will im folgenden die Lösung für ein Problem vorstellen, das mir schon mehrfach begegnet ist: Anrufe zu später Stunde oder auch mitten in der Nacht! Meist geschieht dies nicht willentlich, jemand hat sich verwählt oder einfach vergessen, dass es auf unserem Planeten Zeitzonen gibt. Für das um seinen Schlaf gebrachte «Opfer» ist dies verständlicherweise ein schwacher Trost. Also habe ich meine Telefonzentrale so eingestellt, dass zwischen 22 Uhr Abends und acht Uhr am Morgen keine Anrufe entgegengenommen werden. Um diese Aufgabe zu lösen, müssen zwei Vorkehrungen getroffen werden:

  1. Aufteilen des bisher erstellten Wählplanes in zwei Kontexte. Ein Kontext übernimmt die bisherigen Anweisungen des Wählplanes und ist tagsüber aktiv. Der zweite Kontext legt fest, dass Anrufe in der Nacht mit einem Besetztzeichen beantwortet werden.
  2. Festlegen der Zeit, wann welche Kontexte aktiv sind

Kontexte sind nichts anderes als Teile eines Wählplanes, die unter einem gemeinsamen Namen zusammengefasst werden. Diese Aufteilung ist nicht nur bei grossen Wählplänen sinnvoll, sie ermöglicht es auch, festzulegen, welche Teilnehmer welche Kontexte nutzen dürfen oder – unser Beispiel – welche Kontexte zu welchen Tageszeiten, resp. Tagen aktiv sind. Beispielsweise kann bei einer Firma für das Wochenende ein Kontext weekend aktiviert werden, der nach einer Mitteilung («Sie rufen ausserhalb unserer Geschäftszeiten an…») den Voicemail Dienst aufruft. Die Möglichkeiten, die mit Kontexten geschaffen werden, sind vielfältig. Gerne werden sie auch für «virtuelle» Zentralen genutzt: Mehrere Firmen teilen sich dabei einen Server; mit Kontexten werden die verschiedenen Wählpläne den Teilnehmern zugewiesen.

Das Definieren eines Kontextes gestaltet sich denkbar einfach: vor die Anweisungen im Wählplan wird der Name des Kontextes in eckige Klammern gesetzt. Alle nun folgenden Extensions gehören zu diesem Kontext. Erst das Ende der Datei oder ein neuer Kontext beenden den Gültigkeitsbereich. In der extensions.conf, die unseren Wählplan enthält, sind bereits einige Kontexte definiert. Der wichtigste davon ist default. Wenn nicht anders bestimmt, nimmt er alle neuen Extensions auf, die am Ende der Datei angehängt werden. Wird bei einem Anruf nicht explizit ein Kontext bestimmt, durchsucht Asterisk stets den default Kontext nach einer passenden Extension. In meiner Version von extensions.conf steht der Kontext default fast am Ende der Datei:

[default]
;
; By default we include the demo. In a production system, you
; probably don't want to have the demo there.
;
include => demo
...

Wir erstellen nun einen neuen Kontext daily-calls und verschieben alle Extensions für eingehende Anrufe in diesen Kontext. Wichtig: Der Kontext muss am Ende der Datei, also hinter allen bisher erstellten Anweisungen in der Datei zu stehen kommen. Die Extensions für eingehende Anrufe müssen an ihrer bisherigen Stelle gelöscht werden.

; Eingehende Anrufe tagsueber
[daily-calls]
exten => 0325178180, 1, Dial(SIP/pc1&SIP/pc2,60)
exten => 0325178180, n, Hangup

Und nun folgt ein zweiter Kontext nightly-calls, der nächtliche Anrufer abfertigt:

; Eingehende Anrufe nachts
[nightly-calls]
exten => 0325178180,1,Answer
exten => 0325178180,2,Playtones(congestion)
exten => 0325178180,3,Congestion

Die drei Anweisungen bewirken dies: als erstes wird der Anruf mit Answer entgegengenommen (damit es den Anrufer auch etwas kostet…), dann senden wir mit Playtones(congestion) ein Besetztzeichen. Die dritte Anweisung Congestion signalisiert der Gegenstelle abschliessend, dass wir besetzt sind und wartet, bis der Anrufer auflegt. Dies ist sicher nicht die freundlichste Art, einen Anruf «entgegenzunehmen», ich werde deshalb in einem der folgenden Kapitel als Beispiel Voicemail verwenden, so dass der Anrufer eine Nachricht hinterlassen kann.

Nun müssen wir nur noch den Zeitplan definieren, der festlegt, wann welche Kontexte gültig sein sollen. Der Zeitplan kann an den Beginn des default Kontextes gestellt werden:

[default]
include => nightly-calls|22:00-23:59|*|*|*
include => nightly-calls|00:00-08:00|*|*|*
include => daily-calls

Der Zeitplan besteht aus include Anweisungen, vermöge derer Kontexte in den aktuellen Wählplan eingefügt werden können. Die include Anweisung kann auch genutzt werden, um externe Dateien einzubinden. Mit einem vierspaltigen Zeitschema kann jede include Anweisung an eine Zeit gebunden werden. Nur wenn alle der vier Platzhalter mit der aktuellen Zeit übereinstimmen, wird eingefügt. Die vier Platzhalter werden getrennt durch einen Balken (|) direkt an die include Anweisung angehängt. Ein Asterisk (*) als Platzhalter gilt immer als Übereinstimmung:

include => nightly-calls|Zeit|Wochentag|Tag|Monat

Die vier Spalten haben folgende Bedeutung, resp. folgende möglichen Werte:

Zeit: Die Tageszeit im 24-Stunden Format SS:MM, also zum Beispiel 18:00 für sechs Uhr Abends. Ein Zeitbereich wird in der Form SS:MM-SS:MM angegeben. Wichtig: Als Zeitmesser gilt die Uhr des Servers, auf dem Asterisk läuft. Ist dieser Server auf UTC (ehemals GMT) eingestellt, müssen die Zeitbereiche entsprechend angepasst werden.

Wochentag: Für Wochentage muss die englische Kurzform verwendet werden: mon, tue, wed, thu, fri, sat, sun. Auch hier sind Bereiche wie mon-fri möglich.

Tag: Der Tag im Monat, also Werte im Bereich 1..31. Praktisch, um in Verbindung mit dem Monat bestimmte Tage als Feiertage zu markieren (1. Mai, 24. Dezember, etc.). Wie bei den anderen Feldern sind Bereiche möglich.

Monat: Beim Monat muss wiederum die englische Kurzform verwendet werden. Mir ist zurzeit nicht bekannt, ob auch numerische Werte verwendet werden können.

Es müssen wie gesagt alle vier Zeitangaben mit der aktuellen Systemzeit übereinstimmen, nur dann wird der Kontext eingefügt. In unserem Beispiel verwenden wir nur die Tageszeit. Da ich nicht sicher bin, ob Zeitbereiche, die Mitternacht einschliessen, richtig interpretiert werden, verwende ich zwei Zeilen. Bei einem extern eingehenden Anruf geschieht nun folgendes:

Asterisk durchsucht den Wählplan und findet im default Kontext die include-Anweisungen. Asterisk durchsucht den Wählplan grundsätzlich sequentiell, also vom Beginn zum Ende der Datei, bis eine Extension gefunden wird, die mit der gewählten Nummer übereinstimmt!

Tagsüber wird der Kontext nightly-calls nicht eingefügt, wohl aber der daily-calls Kontext. Dieser ist nicht an eine bestimmte Zeit gebunden und wird somit immer eingefügt. Asterisk findet nun im daily-calls eine passende Extension und fürt diese aus: Die Telefone pc1 und pc2 beginnen zu klingeln.

Nach 22 Uhr Abends wird der Kontext nightly-calls eingefügt. Damit steht er nun vor dem Kontext daily-calls. Vermöge der Regel der sequentiellen Ausführung findet Asterisk jetzt in diesem Kontext eine passende Extension: Der Anrufer hört das Besetztzeichen und wir können weiterschlafen…

Telefonieren mit Asterisk (III)

Asterisk LogoDer letzte Teil hat gezeigt, dass die Konfiguration einfacher Aufgaben leicht zu bewerkstelligen ist. Mit ein paar Zeilen in den Konfigurationsdateien extensions.conf und sip.conf kann eine einfache, hausinterne Telefonanlage aufgebaut werden. Die Aufgabe bestand darin, zwei Telefone via SIP mit dem Server zu verbinden und einen möglichst einfachen Wähplan zu erstellen, so dass zwischen den beiden Endgeräten Gespräche geführt werden können. Im folgenden soll die Telefonanlage so ausgebaut werden, dass auch externe Gespräche geführt werden können. Genau so, wie mit einem herkömmlichen Telefon, das am Festnetz angeschlossen ist.

Um das Kunststück zu vollbringen, benötigen wir ein VoIP Konto bei einem Schweizer Provider. VoIP Konti für den Heimgebrauch gibt es bei SolNet oder Green bereits für eine Monatspauschale ab Fr. 10.–. Bei beiden Providern gibt es VoIP als eigenständiges Produkt oder als Zugabe zu einem ADSL Abonnement. VoIP Kontos werden meist in Verbindung mit einer ATA Box (Analog-Telefon-Adapter) verwendet, so dass sie auch mit einem handelsüblichen, analogen Telefon genutzt werden können. Eine kurze Beschreibung einer Fritz!Box ATA gibt es hier. Ich verwende im folgenden ein VoIP Konto mit den folgenden fiktiven Zugangswerten:

Telefonnummer: 032 517 81 80
Login: 0325178180
Passwort: horsepower
SIP Server: sip.solnet.ch

ATA Boxen oder SIP-fähige VoIP Telefone können diesen Zugang direkt nutzen, um externe Teilnehmer anzurufen oder Gespräche zu empfangen. Im folgenden Beispiel erweitern wir unsere Konfiguration so, dass der Asterisk Server den VoIP Zugang nutzt. Dies bringt den Vorteil, dass alle am Server angeschlossenen Telefone externe Nummer anrufen können – auch gleichzeitig! Bei eingehenden Gesprächen kann bestimmt werden, welche internen Telefone das Gespräch entgegennehmen können.

Bei einigen Providern können zusätzliche Telefonnummern zu einem VoIP Konto bestellt werden, so dass jedem Telefon eine externe Nummer zugewiesen werden kann. Wir werden uns vorerst mit einer Nummer begnügen. Die Konfiguration unserer Anlage sieht dementsprechend wie folgt aus:

Beide im letzten Kapitel angeschlossenen Telefone können externe Nummern wählen und werden dann via Asterisk und dem VoIP Provider mit dem gewünschtne Teilnehmer verbunden. Falls das Telefon des Angerufenen eine Nummernanzeige hat, erscheint dort die Nummer des VoIP Kontos, also 032 517 8180. Mit Asterisk ist es möglich, zusätzlich zur Nummer auch einen Namen anzugeben. Es gibt eine Vielzahl an Möglichkeiten, die Caller ID (CID) zu manipulieren. Ruft ein externer Teilnehmer an, klingeln beide am Asterisk angeschlossenen Telefone.

In der Datei sip.conf müssen die folgenden Ergänzungen angefügt werden:

register => 0325178180:horsepower@sip.solnet.ch/0325178180

Damit wird der Asterisk Server angewiesen, sich beim VoIP Provider mit der Nummer 0325178180 zu registrieren. Der SIP Proxy beim Provider wird damit informiert, an welche Adresse im Internet ein eingehendes Gespräch weitergeleitet werden muss. Ruft jemand die Nummer 0325178180, gelangt das Gespräch zum VoIP Provider und dieser leitet es an unseren Asterisk Server weiter. Damit auch unser Server weiss, was er mit dem eingehenden Anruf zu tun hat, schreiben wird noch folgendes in sip.conf:

[sip-inout-0325178180]
type=peer
secret=horsepower
username=0325178180
fromuser=0325178180
host=sip.solnet.ch
context=default
insecure=very

Dieser Konfigurationsblock bewirkt zweierlei: Er wird einerseits benötigt um ausgehende Gespräche über den Wählplan zu initiieren. Andererseits dient er der Zuweisung eines externen Gespräches an einen Benutzer: Ruft jemand von extern auf unsere Nummer, durchsucht Asterisk alle Einträge in dieser Datei nach einem Namen, der mit der gewählten Nummer übereinstimmt. Wird ein Eintrag gefunden, gelten alle für diesen Benutzer festgelegten Parameter. Anschliessend wird im Wählplan eine passende Extension gesucht. Die Direktiven fromuser, insecure und context können in den meisten Fällen weggelassen werden. Ich habe sie trotzdem in das Beispiel aufgenommen, um sicherzustellen, dass das Beispiel funktioniert. Zum Schluss muss extensions.com noch wie folgt erweitert werden.

; Eingehende Anrufe
exten => 0325178180, 1, Dial(SIP/pc1&SIP/pc2,60)
exten => 0325178180, n, Hangup
; Ausgehende Anrufe
exten => _X., 1, Dial(SIP/${EXTEN}@sip-inout-0325178180, 120)
exten => _X., n, Hangup

Die erste Extension regelt die Zuweisung eines eingehenden Anrufes. Wird die Nummer 0325178180 gewählt, gelangt der Anruf via VoIP Provider auf unseren Asterisk Server. Dieser weist den Anruf dem internen SIP Konto sip-inout-0325178180 zu und sucht dann im Wählplan eine zur gewählten Nummer passende Extension. Diese wird in der zweiten Zeile nach dem Kommentar gefunden und ausgeführt. Mit Dial wird erreicht, dass beide Endgeräte, also die Softphones auf PC 1 und PC 2 während 60 Sekunden läuten. Wird auf einem der Geräte der Anruf entgegengenommen, kommt das Gespräch zustande. Das Dial Kommando kann also mehrere Telefone ansprechen, die SIP Kontos müssen lediglich durch ein ‘&’ voneinander getrennt werden. Sollen mehrere Teilnehmer einen Anruf entgegennehmen können, bieten sich die Queues an. Queues sind wesentlich flexibler und erlauben die verschiedensten Optionen zur Steuerung.

Die Zeilen fünf und sechs, die dem zweiten Kommentar folgen, regeln das Verhalten des Servers bei ausgehenden Gesprächen. Als Extension verwenden wir hier ein Suchmuster, das auf eine beliebige Zahlenfolge der Ziffern 0 bis 9 zutrifft:

  • Eingeleitet werden Suchmuster im Wählplan stets mit einem Unterstrich (_). Asterisk erkennt daran, dass im folgenden keine Nummer kommt, sondern einer oder mehrere Platzhalter für Ziffern.
  • Ein ‘X’ steht für eine beliebige Ziffer im Bereich 0 bis 9. Für Zahlenbereiche von 1 bis 9 kann ‘Z’ verwendet werden, Bereiche von 2 bis 9 werden mit ‘N’ notiert.
  • Der Punkt ist ein Platzhalter für eines oder mehrere Zeichen. _X. bedeutet somit: Eine oder mehrere Ziffern im Bereich 0 bis 9. So einfach ist das :-)

Wird nun eine Nummer wie zum Beispiel 0326143754 gewählt, geschieht folgendes: Asterisk sucht im Wählplan eine passende Extension und wird beim Suchmuster _X. fündig. Nun wird die gewählte Nummer, die in der Variablen ${EXTENSION} gespeichert ist, gewählt. Dazu wird wiederum das SIP Protokoll verwendet. Als Erweiterung kommt hinzu, dass wir den zuvor definierten SIP Peer verwenden. Dieser leitet das Gespräch anhand der Login- und Server Parameter an den VoIP Provider weiter. Dies geschieht einfach dadurch, dass wir am Ende der zu wählenden Nummer mit einem Klammeraffen angeben, welcher Peer für den Gesprächsaufbau verwendet werden soll.

Nun geht’s an’s ausprobieren. Zuvor muss aber dem Asterisk Server mitgeteilt werden, dass die Konfigurationsdateien neu geladen werden müssen. Öffnen Sie mit asterisk -r eine Konsole und geben Sie die beiden folgenden Kommandos ein:

extensions reload
sip reload

Falls jetzt keine Fehlermeldungen angezeigt werden, sind die Aenderungen akzeptiert worden und Sie können mit den Tests beginnen. Stellen Sie einen hohen verbose Level ein, um zu sehen, was im System vor sich geht.

Telefonieren mit Asterisk (II)

Asterisk LogoWer einen Asterisk Server installiert hat und einen Blick in den Ordner mit den Konfigurationsdateien wirft, wird eine Überraschung erleben: Es gibt – je nach Version und Distribution – rund 30 Konfigurationsdateien. Dies braucht den Einsteiger jedoch nicht zu beunruhigen, denn um eine simple Testkonfiguration zu erstellen, genügt das Anpassen von zwei Dateien. Das folgende Beispiel zeigt, wie eine Minimalkonfiguration erstellt werden kann: Diese besteht aus zwei Telefonen, die via Asterisk Server miteinander kommunizieren können. Anstelle der Telefone können als Endgeräte auch PC’s mit sogenannten Softphones verwendet werden. Ich gehe im folgenden davon aus, dass es ein lokales Netz gibt, an dem bereits ein Linux Server und zwei PC’s angeschlossen sind. Auf dem Linux Server ist zudem Asterisk installiert, die Konfigurationsdateien befinden sich unter /etc/asterisk.

Name und IP der verwendeten Rechner:

Linux Server: bigfoot [192.168.10.1]
PC 1 (Endgerät): phone1 [192.168.10.2]
PC 2 (Endgerät): phone2 [192.168.10.3]

Wichtig: Zwischen den beiden PC’s und dem Linux Server darf keine Firewall stehen! Asterisk unterstützt Konfigurationen mit Firewalls, einfachheitshalber wird hier aber nicht weiter darauf eingegangen.

In einem ersten Schritt geht es darum, die beiden PC’s, auf denen später Softphones installiert werden, beim Asterisk Server anzumelden. Es gibt mehrere Protokolle, die dafür verwendet werden. Wir werden im folgenden das zurzeit populärste Protokoll verwenden: Das Session Initiation Protocol, kurz SIP. Alle zu verwendenden SIP-Geräte werden in der Datei sip.conf eingetragen. Mit einem Editor wie joe oder vi wird also sip.conf editiert und folgendes an das Ende der Datei geschrieben:

[pc1]
type=friend
username=pc1
secret=dolittle
host=dynamic

[pc2]
type=friend
username=pc2
secret=dolittle
host=dynamic

Es handelt sich hier nur um das absolut nötigste, damit ein Endgerät sich anmelden kann. Weitere Informationen zu sip.conf und den Parametern für SIP Konti gibt’s auf voip-info.org, dem zurzeit umfassendsten Angebot rund um das Thema VoIP. Die beiden Konfigurationsblöcke definieren zwei SIP Konti pc1 und pc2. Die Username’s, die für das Login benötigt werden, lauten genau gleich: pc1 und pc2. Das für die Anmeldung benötigte Passwort wird mit secret festgelegt. Ich habe für beide Konti dasselbe Passwort verwendet, was für die Praxis natürlich nicht zu empfehlen ist. In einer produktiven Umgebung sollten auch stärkere Passwörter zur Anwendung kommen.

Mit type=friend wird festgelegt, wie eine Verbindung zwischen dem Endgerät und dem Server zustande kommt: Die Option friend bestimmt, dass von beiden Seiten eine Verbindung aufgebaut werden kann. Die beiden anderen möglichen Optionen lauten user und peer.

host definiert, unter welcher Adresse das Endgerät erreicht werden kann. Wir könnten hier auch die Hostnamen der verwendeten PC’s eintragen (phone1/phone2). Mit der Option dynamic geben wir an, dass die Adresse nicht bekannt ist, also zur Laufzeit ermittelt wird, wenn das Endgerät sich anmeldet. In einer produktiven Umgebung ist es angezeigt, die Host Adresse anzugeben, wenn sie bekannt ist. Die Option dynamic wird häufig verwendet, wenn die Endgeräte ihre Adresse dynamisch per DHCP beziehen und keinen eindeutigen Hostnamen haben.

Die Konfiguration der SIP Endgeräte ist damit abgeschlossen. Hat doch nicht weh getan, oder? Damit könnte nun bereits ein Softphone auf einem PC konfiguriert und angemeldet werden. Das wäre aber auch schon alles; die Eingabe einer Nummer würde nur zu einem Fehler führen. Wir müssen Asterisk als nächstes mitteilen, was geschehen soll, wenn eine bestimmte Nummer auf einem Endgerät gewählt wird. Mit anderen Worten: Wir müssen einen einfachen Wählplan zusammenstellen: Wenn die Nummer 100 gewählt wird, soll das Softphone auf PC 1 läuten und wenn dieser die Nummer 200 wählt, soll sich das Softphone auf PC 2 angesprochen fühlen. Dies ist der denkbar einfachste Wählplan, der in vielen Asterisk-Tutorials zu finden ist.

Bei Asterisk sind alle Einstellungen des Wählplanes in der Datei extensions.conf abgelegt. Lassen Sie sich durch den Umfang der Datei nicht beirren, gewiss sind umfangreiche Wählpläne eine komplexe Angelegenheit; einfachere Konfigurationen bestehen aber dennoch nur aus wenigen, leicht zu verstehenden Direktiven. Wenn Sie einen Asterisk Server aufbauen, werden Sie nach und nach mit allen Konzepten und Möglichkeiten des Wählplans vertraut werden. Öffnen sie als nächstes extensions.conf und tragen Sie am Ende der Datei folgendes ein:

exten => 100, 1, Answer
exten => 100, n, Dial(SIP/pc1, 60)
exten => 100, n, Hangup

exten => 200, 1, Answer
exten => 200, n, Dial(SIP/pc2, 60)
exten => 200, n, Hangup

Sobald Sie mit einen verbundenen Endgerät eine Nummer wählen, durchsucht Asterisk den Wählplan nach dieser Nummer. findet er eine entsprechende Extension, führt er die darin aufgeführten Komandos solange aus, bis eine der beiden Gegenstellen das Gespräch beendet. Wählen Sie zum Beispiel die Nummer 200, findet Asterisk die Extension 200 und führt das erste Komnando aus: Answer. Damit wird der Server angewiesen, den Anruf entgegenzunehmen. Das nächste Kommando, Dial, bildet bereits den Kern der ganzen Sache: Es ruft das Endgerät pc2 an und stellt eine Verbindung her, wenn das Gespräch entgegengenommen wird. Mit anderen Worten: Wählt PC 1 die Nummer 200, klingelt bei PC 2 60 Sekunden lang das Softphone. Wird das Gespräch entgegengenommen, kommt eine Sprechverbindung zustande. Nimmt PC 2 nicht ab, kommt nach 60 Sekunden die nächste Anweisung im Wählplan zum Zuge: Hangup. Damit endet die Verbindung.

Wichtig: Die Anweisungen einer Extension werden nicht in der Reifenfolge abgearbeitet, wie sie in der Datei stehen. Vielmehr entscheiden Prioritäten darüber, welche Anweisung als nächstes zum Zuge kommt. Prioritäten müssen in aufsteigender, lückenloser Reihenfolge notiert werden. Um die Sache etwas einfacher zu machen, kann wie in unserem Beispiel anstelle der Aufzählung (1..2..3) auch die Priorität ‘n’ (next) verwendet werden. Prioritäten können ähnlich wie in alten BASIC-Dialekten als Sprungmarken verwendet werden.

Nun ist es an der Zeit, den Server zu starten und die Endgeräte anzumelden. Asterisk wird üblicherweise beim Booten als Hintergrundprozess gestartet. Um Asterisk als Daemon zu starten, genügt es, den Programmnamen einzugeben: asterisk. Wenn keine Fehlermeldungen angezeigt werden, können Sie davon ausgehen, dass Ihre Einträge in den Konfigurationsdateien in Ordnung sind. Wir wollen jedoch genau wissen, was der Server tut und starten ihn deshalb im Konsolenmodus. In diesem Modus wird – ähnlich einer UNIX Shell – eine Eingabeaufforderung angezeigt. Sie können durch die Eingabe von Kommandos den Status des Systems prüfen, einzelne Konfigurationsdateien neu laden und tausend weitere Dinge tun. Eine Übersicht der verfügbaren Kommandos erhalten Sie durch die Eingabe von help. Starten Sie Asterisk nun wie folgt:

asterisk -vvvvvc

Dies startet den Server und bringt Sie sofort in den Konsolenmodus. Die 5 Buchstaben ‘v’ setzen den Verbosity Level auf 5. Asterisk zeigt in diesem Level alle wichtigen Ereignisse auf der Konsole an. Sie können den Level mit dem Kommando set verbose 0-12 jederzeit neu setzen. Im Level 12 bekommen Sie nahezu alles angezeigt, was Asterisk tut, im Level 0 herrscht stoische Ruhe auf der Konsole. Setzen Sie für den folgenden Test den Level auf 12.

Wenn Sie Asterisk wieder beenden wollen, geben Sie stop now ein. Falls Asterisk bereits als Hintergrundprozess läuft, können Sie mit folgendem Kommando zur Konsole gelangen: asterisk -r. Mit exit verlassen Sie die Konsole wieder, ohne dass auch Asterisk beendet wird.

Da der Server nun für unseren Test betriebsbereit ist, können wir uns der Konfiguration der Endgeräte, resp. der Softphones auf den PC’s zuwenden. Ich werde im folgenden das Softphone Ekiga für Linux verwenden. Die Konfiguration kann aber leicht auch auf andere Programme übertragen werden, etwa auf das X-Ten Softphone, das auf verschiedenen Plattformen läuft. Bei Ekiga ist es ein Leichtes, ein SIP Konto zu erstellen. Wenn Sie Ekiga das erste Mal starten, erscheint der Konfigurations-Druide. Nehmen Sie sich einen Moment Zeit und legen die die Programmparameter fest. Wenn Sie gefragt werden, ob Sie ein kostenloses Ekiga.net Konto anlegen wollen, wählen Sie die Checkbox “Überspringen”.

Sobald Sie den Konfigurations-Druiden durchlaufen haben, wählen Sie im Menu Bearbeiten => Konten und im folgenden Dialog die Option Hinzufügen. Nun können Sie die Parameter für das SIP Konto festlegen, im folgenden Beispiel konfigurieren wir PC 1:

Speichern Sie nun diese Einstellungen und schliessen Sie den Dialog mit den Konten. In der Statuszeile von Ekiga sollte nun eine Meldung wie die folgende erscheinen: Ekiga ist bei 192.168.10.1 angemeldet. Ebenso sollten Sie auf der Asterisk Konsole eine Meldung sehen, dass sich ein Endgerät verbunden hat:

-- Registered SIP 'pc1' at 212.101.1.113 port 5061 expires 3600
-- Saved useragent "Ekiga/2.0.1" for peer pc1

Geschieht nichts? Dann kontrollieren Sie bitte alle Einstellungen noch einmal. Sind die beiden Geräte untereinander erreichbar? Haben Sie eine Firewall aktiv, welche die SIP Ports blockiert? Läuft Asterisk? Um Gewissheit darüber zu haben, ob ein Engerät erfolgreich angemeldet ist, geben Sie auf der Konsole folgendes ein: sip show peers. Es sollte für PC 1 folgendes angezeigt werden:

pc1/pc1 192.168.10.2 5061 OK (5 ms)

Haben Sie beide Endgeräte konfiguriert und angemeldet? Nun, dann geben Sie jetzt im Ekiga auf PC 1 in der Wählleiste die Nummer 200 ein und klicken Sie auf das Verbindungssymbol:

Auf PC 2 sollte nun das Softphone klingeln. Sobald Sie den Anruf entgegennehmen, wird ein Gesprächskanal aufgebaut. Auf der Konsole werden Sie ausserdem eine Menge Meldungen sehen. Falls etwas nicht klappt, analysieren Sie die Konsolenmeldungen; Asterisk ist in bezug auf Fehlermeldungen sehr detailliert.

Sicher, nach dem ersten Erfolgserlebnis wird die Ernüchterung kommen, denn die nun erreichte Konfiguration dient bestenfalls als Gegensprechanlage. Der nächste Teil zeigt wie Sie via SIP Provider auch externe Gespräche führen und entgegen nehmen können.

Telefonieren mit Asterisk (I)

Asterisk Logo«…Was soll ich machen? Eine virtuelle PBX? Was um alles in der Welt ist das!?» Ich gebe es freimütig zu, ich hatte den Begriff «PBX» wirklich nie zuvor gehört. Dass hängt damit zusammen, dass ich bisher mit Telefonie so gut wie nichts zu tun hatte und mich für Telefone bis vor einigen Wochen auch kaum interessierte. Telefone waren für mich eher etwas langweiliges.

Also, PBX ist die Abkürzung für «Private Branch Exchange» und kann am einfachsten mit «Telefonanlage» übersetzt werden. Klingt ganz einfach, oder? Ist es aber nicht! Denn damit begeben wir uns in ein Fachgebiet, das eine unstillbare Neigung zur Unübersichtlichkeit und Komplexität hat. Das hängt damit zusammen, dass vieles neu und die Dokumentation dementsprechend spärlich ist.

Durch die zunehmende Rechenleistung und erhöhte Bandbreite in den weltumspannenden Netzen haben sich in den vergangenen Jahren verschiedene Technologien entwickelt, die das Telefonieren auf IP-Basis ermöglichen. Als Trägermedium dient also nicht mehr ein herkömmliche Telefonleitung sondern ein Computernetzwerk. Digitale Telefonzentralen ermöglichen es, eine firmen- oder hausinterne Telefonanlage aufzubauen, die weniger als herkömmliche Zentralen kostet, dafür aber in bezug auf Funktionsumfang und Flexibilität einiges mehr bietet.

Wer sich mit digitaler Telefonie beschäftigt, wird rasch mit einer Unmenge an Fachbegriffen konfrontiert: VoIP, SIP, IAX, DTMF, H232, OpenSER, Voicemail, etc. etc. Um mir ein Bild der der Sache machen zu können, habe ich mich zuerst durch die Online-Dokus der verschiedenen Websites durchgelesen, die sich mit diesem Thema beschäftigen. Etwas frustriert stellte ich dann fest, dass es nicht ganz simpel ist, sich einen Überblick zu verschaffen und etwas Ordnung in das umfangreiche Angebot zu bringen. Ein guter Einstiegspunkt ist nach meiner bisherigen Erfahrung voip-info.org. Die Wiki-Seite ist zwar stellenweise ziemlich chaotisch, aber sie enthält einen Bereich für Einsteiger, der die verschiedenen Möglichkeiten, Techniken und Produkte vorstellt.

Asterisk, der Alleskönner

Eher früher als spät taucht der Begriff «Asterisk» auf, eine von Digium entwickelte Software-Telefonanlage, von der eine kommerzielle, aber auch eine freie, GPL-lizensierte Version gibt. Asterisk läuft auf den verschiedensten UNIX-Varianten, benötigt – je nach Verwendungszweck – keine zusätzliche Telefoniehardware und stellt durch einen modularen Aufbau eine Myriade an Funktionen zur Verfügung. Dabei ist das System in bezug auf die Ressourcen dennoch genügsam, ein kleines System mit bis zu 10 SIP-Telefonen läuft auf einem Server mit einer 700Mhz Intel-CPU mit 256 MB RAM problemlos.

Aber was genau ist Asterisk? Die Software als Telefonanlage zu bezeichnen ist zwar nicht falsch, aber eine glatte Untertreibung, denn Asterisk kann wesentlich mehr! Ausserdem muss Asterisk entsprechend konfiguriert und mit einem an die Bedürfnisse angepassten Wählplan ergänzt werden, damit es als Telefonanlage verwendet werden kann. Es ist treffender, Asterisk als Baukasten zu bezeichnen, der die Bausteine liefert mit denen verschiedensten Aufgaben gelöst werden können.

Der Wählplan

Das Herzstück des Asterisk Server ist der Wählplan (Dialplan), mit dem festgelegt wird, wer wen anrufen darf und welche Telefone klingeln, wenn eine bestimmte Nummer gewählt wird. Im Wählplan wird ferner festgelegt, wie das System reagiert, wenn ein Teilnehmer nicht abnimmt, besetzt ist oder selbst eine Umleitung definiert hat. Und endlich legt der Wählplan fest, welche externen Anschlüsse von welchen Teilnehmern benutzt werden dürfen und wie diese externen Anschlüsse basierend auf der gewählten Nummer selektiert werden. Und dies sind nur einige Standardfunktionen des Wählplans, er kann noch einiges mehr. Und das erfreuliche an der Sache: Die verschiedenen Kommandos des Wählplanes sind sehr gut dokumentiert und es gibt im Internet viele praxisnahe Beispiele.

Der Wählplan kann mit der Makrosprache einer Office-Anwendung verglichen werden. Dort gibt es Kommandos, die Anwendungsfunktionen wie «sortieren», «exportieren» oder «formatieren». Auch die Kommandos des Asterisk Wählplanes operieren auf einem entsprechend hohen Level. Eines der wichtigsten Kommandos ist «Dial». Dial() erwartet als Argument nebst verschiedenen Optionen eine Telefonnummer die in der Folge angerufen wird. Nimmt der Besitzer des angerufenen Telefones ab, kommt eine Verbindung zustande und Dial() bleibt solange aktiv, bis einer der Teilnehmer den Hörer auflegt oder die Verbindung anderweitig unterbrochen wird. Anschliessend wird das nächste Kommando im Wählplan ausgeführt, in einfacheren Beispielen ist dies meist «Hangup».

Anständige Makrosprachen ermöglichen auch Konstrollstrukturen, also das Verzweigen innerhalb des Makros, sobald gewisse Bedingungen erfüllt sind. Beim Wählplan ist dies nicht anders. Beispielsweise kann entsprechend reagiert werden, wenn eine externe Leitung vorübergehend nicht verfügbar ist oder wenn ein Teilnehmer seinen Appart auf «DND» (Do not disturb) gestellt hat. Im Wählplan können ausserdem externe ähnlich der CGI-Spezifikation Scripts aufgerufen werden, eine Gruppe von Anweisungen lässt sich in einem Makro zusammenfassen und beliebige Werte können für eine spätere Verwendung in einer Datenbank gespeichert werden.

Beispiele

Um das ganze zu veranschaulichen folgen nun einige praxisbezogene Beispiele, was mit Asterisk ohne grossen Aufwand realisiert werden kann:

snom360.jpg

Kann auch Wetterdaten und Fussballergebnisse anzeigen: snom 360

Aufwerten des privaten Telefonanschlusses durch Voicemail, Ansagetext und Anrufumleitung. Die Einstellungen können je nach Tageszeit ändern, so dass in der Nacht garantiert Ruhe herrscht. Einzelne Nummern oder auch ganze Nummernbereiche können gesperrt werden und eine Auswertung gibt Auskunft über alle ein- und ausgehenden Anrufe.

Teilen eines privaten Telefonanschlusses durch das Anschliessen mehrerer Telefone an einen Asterisk Server. Damit können intern kostenlos Gespräche geführt werden und wer eine externe Nummer wählt, wird automatisch weiterverbunden. Selbstverständlich können wiederum alle Funktionen aus dem ersten Beispiel genutzt werden.

Flexible und preiswerte KMU Telefonzentrale. Mit einem Asterisk Server wird das interne Firmennetz für die Telefongespräche genutzt. Alle angestellten erhalten eine Nummer für die interne Kommunikation. Wer externe Anrufe entgegennehmen können muss, bekommt zusätzlich eine externe Nummer, die global erreichbar ist. Für die verschiedenen Abteilungen der Firma können Gruppennummern definiert werden. Wer häufig im Aussendienst arbeitet, kann Gespräche per Knopfdruck auf ein Mobiltelefon umleiten oder ad hoc einen Ansagetext hinterlassen. Ausserhalb der Bürozeiten erhalten Anrufer eine entsprechende Meldung und können ihr Anliegen dem Voicemail-Dienst anvertrauen. Es können Konferenzgespräche geführt und direkte Verbindungen mit Partnerfirmen erstellt werden. Mit entsprechender Ausstattung sind auch Videokonferenzen möglich.

– Fortsetzung folgt –