Diese Seite beschreibt die Erkenntnisse der Corvent GmbH in Sachen Asterisk. Es soll mehr eine Ansammlung von Hinweisen auf nötige Änderungen und Stolpersteine sein als ein allwissendes Handbuch. Quellen und weiterführende Artikel wurden (wo vorhanden) angegeben.
Sämtliche Angaben wurden getestet auf einem Ubuntu-System mit Asterisk 1.4.
Die interne Kommunikation zwischen mehreren Telefonen ist denkbar einfach. Folgende Einträge sind dazu nötig:
sip.conf enthält sämtliche Informationen zu den Verbindungen, die über das SIP-Protokoll aufgebaut werden. Das heisst:
[1] ; Gerät hat die Rufnummer 1 type=friend ; Einkommende und ausgehende Anrufe sind erlaubt context=corvent ; Gruppierung secret=1111 ; Passwort für das Telefon, um sich bei Asterisk zu registrieren host=dynamic ; ? [2] type=friend context=corvent secret=1111 host=dynamic
Im obigen Beispiel werden 2 Nummern registriert.
Hinweis: Es können sich beliebig viele Geräte gleichzeitig anmelden und die Nummern für sich beanspruchen.
extensions.conf beschreibt den dial plan, steuert also welche Anrufe wohin weitergeleitet werden.
[corvent]
exten => _X,1,Dial(SIP/${EXTEN})
Die erste Zeile [corvent] bezeichnet den Kontext, aus dem der Anruf kommt. In diesem Abschnitt werden alle Anrufe abgehandelt, die aus dem corvent-Kontext kommen, es können also beliebig viele Aktionen mit verschiedenen Kriterien aufgelistet sein.
Der erste Teil (_X) ist das Kriterium, wonach diese Zeile ausgeführt wird oder nicht. Hier steht entweder eine komplette Nummer oder eine Art Reg-Ex. _ indiziert, dass der folgende Teil ein regulärer Ausdruck ist. X steht für eine beliebige Ziffer von 1-9. In diesem Fall werden also sämtliche einstelligen Telefonnummern behandelt.
Achtung: Asterisk verwendet nicht die offizielle Reg-Ex Syntax! (TODO: Link setzen)
Die Ziffer 1 steht für die Reihenfolge der Befehle. Es können beliebig viele Befehle aneinandergereiht werden, nachfolgende Einträge sind entweder durchnummeriert oder haben die Ziffer n als Platzhalter.
Achtung: Der erste Eintrag muss 1 sein, ansonsten wird keiner der Befehle beachtet.
Dial(SIP/${EXTEN}) ist die auszuführende Aktion. In diesem Fall wird die gewählte Nummer ${EXTEN} über das SIP-Protokoll angerufen.
Details zum Dial-Befehl findet man unter http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial
In diesem Kapitel wird erklärt, wie mit Hilfe eines SIP-Providers Telefoniert werden kann.
Die Datei sip.conf wird genauer erklärt, und es wird auf allgemeine Stolpersteine aufmerksam gemacht.
[general] ... register => 41521234567:abcd1234@sip.myprovider.ch/41521234567 ; corvent useragent=whatever [myprovider] ; Titel der Verbindung type=friend ; ? context=von-voip-provider ; ? username=41521234567 ; ? fromuser=41521234567 ; ? secret=abcd1234 ; ? host=sip.myprovider.ch ; ? fromdomain=sip.myprovider.ch ; ? qualify=yes ; ? insecure=very ; ? nat=yes ; ?
Im Allgemeinen Teil von sip.conf wird festgehalten, wie sich Asterisk gegenüber den SIP-Providern verhalten soll:
register ⇒ ... bewirkt, dass sich Asterisk während dem Starten beim angegebenen Provider anmeldet. Dies ist nötig, um Anrufe von aussen empfangen zu können. Syntax: username:secret@hostname/user. Der Username kann, muss aber nicht, die Telefonnummer sein. Es werden grundsätzlich dieselben Angaben wie im folgenden Abschnitt verwendet. Offene Frage: Wofür steht der user nach dem Slash?asterisk nicht akzeptieren. Es kann eine beliebige Zeichenkette angegeben werden.Danach wird der Provider in sip.conf eingetragen, wie dies auch mit den internen Telefonen der Fall ist. Dies ist nötig, um Anrufe nach aussen zu tätigen. (??)
[myprovider] ist der Titel der Verbindung und muss eindeutig sein. Dieser Titel wird relevant, wenn über den Provider telefoniert werden soll.type bestimmt, in welcher Richtung Anrufe zugelassen sind.context: Gruppierung der einkommenden Anrufeusername ist der Benutzername, der vom SIP-Provider vergeben wurdefromuser
(enthält denselben eintrag wie username)secret ist das Passwort, das vom SIP-Provider vergeben wurdehost ist der SIP-Server des Providersfromdomain
(enthält denselben Eintrag wie host)qualify 
insecure 
nat 
apt-get install asterisk-chan-capi
https://bugs.launchpad.net/ubuntu/+source/linux-restricted-modules-2.6.24/+bug/204624
sagt:
In the meantime it could also (sometimes) help to download http://rapidshare.de/files/39255014/AVM-Fritz.tar.gz.html and use $cd /usr/src/AVM-Fritz/fcpci-3.11.07 $sudo make $sudo make install $sudo depmod -a $modprobe -l | grep fcpci
modules.conf:
[modules] ... load => res_features.so load => chan_capi.so ... [global] ... chan_capi.so=yes
Be sure that /dev/capi20 is read/writeable for the asterisk user. Either chmod /dev/capi20 to 666 or make the asterisk user a member of the capi group
- inhalt des gentoo-wikis übernehmen
capi.conf:
[general] nationalprefix=0 internationalprefix=00 rxgain=0.8 txgain=0.8 [interfaces] ; mode: ptmp (point-to-multipoint) or ptp (point-to-point) isdnmode=ptmp ; allow incoming calls to this list of MSNs, * == any incomingmsn=* ; capi controller number controller=1 ; dialout group group=1 ; enable/disable software dtmf detection, recommended for AVM cards softdtmf=1 ; context for incoming calls context=capi-in ; number of concurrent calls on this controller (2 makes sense for single BRI) devices => 2
extensions.conf:
[corvent]
...
exten => _0[0-9].,1,Set(CALLERID(number)=0522423475)
exten => _0[0-9].,n,SetCallerPres(prohib)
exten => _0[0-9].,n,Dial(Capi/contr1/${EXTEN}/bo)
exten => _0[0-9].,n,Hangup()
bo sind nötig, damit Asterisk den Summton an das SIP-Gerät weiterleitet. Ansonsten wird nur Stille übertragen, bis der Empfänger den Anruf entgegennimmt.extensions.conf:
[capi-in] exten => 2423475,1,Dial(SIP/1&SIP/2&SIP/3) ; corvent
Einkommende Anrufe über ISDN werden genau gleich gehandhabt wie jeder andere Anruf auch. Unterschied: Sie entspringen dem Kontext capi-in, wie in capi.conf angegeben.
Zu beachten: Im obigen Beispiel sind im Dial-Befehl mehrere Aktionen durch & aneinander gereiht. Das heisst, bei einem Anruf auf die Nummer 052 242 34 75 läuten die SIP-Geräte 1, 2 und 3.
Mit dem Asterisk Gateway Interface lassen sich beliebige Skripte aufrufen. Dies kann unter anderem dazu verwendet werden,
extensions.conf:
[corvent]
exten => _X,1,AGI(test.php)
exten => _X,n,Dial(SIP/${EXTEN})
Obige Zeile führt den Skript test.php aus und wählt danach die eingegebene Telefon-Nummer. Der Pfad, wo die Skripte zu liegen haben, ist in der Datei /etc/asterisk/asterisk.conf in der Variable astagidir abgelegt und zeigt (unter Ubuntu) per default auf /usr/share/asterisk/agi-bin. Der Ordner agi-bin existiert nach der Installation nicht und muss erst erstellt werden.
Ist PHP auf dem Asterisk-Server noch nicht installiert, wird es (unter Ubuntu) mit apt-get install php5-cli installiert.
/usr/share/asterisk/agi-bin/test.php:
#!/usr/bin/php -q <?php fwrite(STDOUT, "EXEC Wait 1 \"\"\n"); // Vor der 1. Ausgabe 1 Sekunde warten fwrite(STDOUT, "SAY NUMBER 7 \"\"\n"); // Gibt die gesprochene Zahl 7 aus ?>
Wichtig: test.php muss für den Asterisk-User ausführbar sein.
Der obige Code spricht dem Anrufer die Zahl 7 in der eingestellten Landessprache.
Die erste Zeile enthält den Ort des PHP-Interpreters. (Entspricht der Shell-Skript Syntax. Anstelle des PHP-Interpreters kann hier ein beliebiger Interpreter für eine beliebige Skript-Sprache angegeben sein.)
Die Kommunikation zwischen Asterisk und dem Skript geschieht über STDIN bzw. STDOUT.
Durch Tippen von agi show im CLI erhält man eine Liste aller möglichen Anweisungen an Asterisk.
Ein ausführlicheres Beispiel-Programm findet man hier.
Ziel: Eine beliebige Software auf dem PC soll aktuelle Anrufe anzeigen. Eine Logfile-Auswertung kommt nicht in Frage, da das Logfile erst nach Beendigung des Anrufes geschrieben wird.
Corvent-Lösung: AGI-Skript, das einen UDP-Broadcast sendet. Der Client (PC, bei uns: Java-Applet in Webapplikation) empfängt den Broadcast und zeigt den Namen des Anrufers an.
#!/usr/bin/php -q <?php $agi['callerid'] = 1234; // wird in Produktiv-Version aus Parametern ausgelesen $msg = "incoming call: ".$agi['callerid']; $port = 2323; $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1); // Broadcasts erlauben (wichtig!!) socket_connect($socket, '255.255.255.255', $port); socket_send($socket, $msg, strlen($msg), 0); socket_close($socket); ?>
Alternativ zu obigem Code kann das Shellprogramm nc (netcat) verwendet werden:
#!/bin/bash echo "incoming call" | nc -u -q 0 -b 255.255.255.255 2323
Ziel: Der Benutzer klickt in einer Web-Applikation eine Telefonnummer an. Daraufhin läutet sein Telefon, wenn er es abnimmt beginnt Asterisk der angeklickten Nummer anzurufen.
Genauer:
manager.conf:
; By default asterisk will listen on localhost only. [general] enabled = yes port = 5038 ;bindaddr = 127.0.0.1 bindaddr = 0.0.0.0 [web] secret = 1234 ;permit=192.168.2.71/255.255.255.0 ;permit=0.0.0.0/255.255.255.0 ;permit=127.0.0.1/255.255.255.0 ;deny=0.0.0.0/0.0.0.0 read = system,call,log,verbose,command,agent,config write = system,call,log,verbose,command,agent,config displayconnects=yes ; No access is allowed by default. ; To set a password, create a file in /etc/asterisk/manager.d ; use creative permission games to allow other serivces to create their own ; files #include "manager.d/*.conf"
Quelle: Andres Obrero
PHP-Skript (Telnet-Aufruf):
/****** * Im Request übergebene Nummern auslesen: * @param device: Interne Nummer (Gerät des Anwenders) * @param number: Ziel-Nummer (welche gewählt werden soll) ***/ $von = (isset($_REQUEST["device"]))? $_REQUEST["device"] : "3"; $nach = (isset($_REQUEST["number"]))? $_REQUEST["number"] : "0793949242"; if(substr($nach, 0, 7) == 'callto:') $nach = substr($nach, 7); // Falls Skript über callto-Link aufgerufen wird $sys_ip = "192.168.2.8"; //127.0.0.1"; // gemäss manager.conf $sys_port = 5038; // gemäss manager.conf $username = "web"; // gemäss manager.conf $secret = "1234"; // gemäss manager.conf $context = "webcall"; // gemäss extensions.conf $log_file = "/tmp/log.html"; // anpassen ??? $WaitTime = "30"; $strCustdata = $nach; if(isset($_REQUEST["number"])){ $oSocket = fsockopen($sys_ip, $sys_port, $errnum, $errdesc) or die("Connection to host failed"); sleep(3); fputs($oSocket, "Action: login\r\n"); fputs($oSocket, "Username: $username\r\n"); fputs($oSocket, "Secret: $secret\r\n\r\n"); print(fgets($oSocket)); fputs($oSocket, "Events: off\r\n\r\n"); fputs($oSocket, "Action: originate\r\n"); fputs($oSocket, "Channel: SIP/$von\r\n"); fputs($oSocket, "WaitTime: $WaitTime\r\n"); fputs($oSocket, "CallerId: $strCustdata\r\n"); fputs($oSocket, "Exten: $nach\r\n"); fputs($oSocket, "Context: $context\r\n"); fputs($oSocket, "Async: true\r\n"); fputs($oSocket, "Priority: 1\r\n\r\n"); print(fgets($oSocket)); fputs($oSocket, "Action: Logoff\r\n\r\n"); fclose($oSocket); }
Situation:
Mitarbeiter verbindet Telefon zu Hause (Netzwerk mit NAT) mit Asterisk (Netzwerk mit NAT).
Ports, die zu Asterisk weiterzuleiten sind:
| Port | Protokoll | Funktion |
|---|---|---|
| 5060 | TCP & UDP | SIP Signalisierung |
| 10000-10100 | UDP | RTP Media Streaming (Port-Bereich wird in rtp.conf eingestellt) |
sip.conf:
[general] ... externip=x.x.x.x localnet=192.168.x.0/255.255.255.0 ... [ext-account] ... nat=yes
rtp.conf:
[general] ... rtpstart=10000 rtpend=10100
Da extensions.conf sehr schnell sehr gross werden kann, gibt es zwei verschiedene Include-Direktiven, um die Übersicht zu wahren:
#include <myFolder/kunden.conf> includet eine ganze Datei. (Dieser Befehl steht in allen .conf-Dateien zur Verfügung.)include => notruf kopiert den Kontext notruf an die entsprechende Stelle. Der Kontext muss jedoch im selben File irgendwo definiert werden. Dieser Mechanismus kann verwendet werden, wenn eine gewisse Abfolge an mehreren Orten vorkommt.Einige Telefone haben einen internen Transfer-Mechanismus, der unabhängig von der Asterisk-Konfiguration funktioniert. Folgende Konfigurationen haben wir getestet:
Das Weiterleiten über Asterisk funktioniert grundsätzlich, ist aber in der Anwendung eher mühsam:
* und 2 müssen einigermassen schnell hintereinander getippt werdenextensions.conf:
exten => _X,n,Dial(SIP/${EXTEN},,tT)
In extensions.conf muss lediglich die Parametrisierung des Dial-Befehls angepasst werden:
modules.conf: Der Datei modules.conf muss folgende Zeile eingefügt werden:
load => res_features.so
features.conf: Folgende Einträge von features.conf sollten angepasst werden:
[general]
transferdigittimeout => 5 ; Number of seconds to wait between digits when transferring a call
; (default is 3 seconds)
featuredigittimeout = 2000 ; Max time (ms) between digits for
; feature activation (default is 500 ms)
[featuremap]
atxfer => *2 ; Attended transfer
Grundsätzlich ist keine der obigen Einstellungen nötig, sollten aber den eigenen Wünschen entsprechend angepasst werden.
transferdigittimeout und featuredigittimeout sind per default zu kurz eingestellt. 5 bzw. 2 Sekunden sind erfahrungsgemäss gute Werte.atxfer ist die Tastenkombination (bzw. -abfolge), die auf dem Telefon gedrückt werden muss, um einen Anruf weiterzuleiten.Beim Siemens Gigaset C47H muss die Übertragung der DTMF-Töne konfiguriert werden. Es stehen 3 Optionen zur Verfügung, die beliebig kombiniert werden können. Folgende Kombinationen erlauben die Zusammenarbeit mit Asterisk:
Offenes Problem: Sind die DTMF-Töne so konfiguriert, dass sie von Asterisk verstanden werden, werden sie nicht nach aussen weitergeleitet. (siehe offene Probleme)
Hinweis: Siemens Handsets scheinen einen internen Weiterleit-Mechanismus zu haben (”Rückfr”-Taste), der unabhängig von der Asterisk-Konfiguration einmal funktioniert und dann wieder nicht.
Player installieren (Ubuntu) und Musik bereitstellen:
apt-get install madplaymkdir /var/lib/asterisk/mohmp3chown asterisk:asterisk /var/lib/asterisk/mohmp3musiconhold.conf:
[default] mode=custom directory=/var/lib/asterisk/mohmp3 application=/usr/bin/madplay -Q -o raw:- --mono -R 8000 -a -12
(Quelle: vergessen)
extensions.conf:
Folgende Konfiguration ist zum Testen, ob MOH funktioniert: Bei Anruf auf 9999 wird der Anruf angenommen, 10 Sekunden lang Musik gespielt und danach wieder aufgehängt.
exten => 9999,1,Answer exten => 9999,2,SetMusicOnHold(default) exten => 9999,3,WaitMusicOnHold(10) exten => 9999,4,Hangup
features.conf:
parkedmusicclass=default ; This is the MOH class to use for the parked channel
; as long as the class is not set on the channel directly
; using Set(CHANNEL(musicclass)=whatever) in the dialplan
Musik wird abgespielt, falls der Anrufer (z.B. bei Anrufweiterleitung) warten muss. default entspricht der Überschrift in musiconhold.conf
Falls Lösungen für diese Probleme bekannt sind, bitte an info at corvent punkt ch mailen. Sie werden nach erfolgreicher Umsetzung in diese Dokumentation aufgenommen.
Es gibt offenbar keinen Mechanismus, einem DECT-Telefon mitzuteilen, ob ein Anruf angenommen wurde oder nicht.
Wird Asterisk über /etc/init.d/asterisk start als Dienst gestartet, können sich die SIP-Geräte nicht registrieren, demzufolge funktioniert überhaupt nichts.
???
Problem: Sipcall-Nummern sind nicht erreichbar (”Diese Rufnummer ist ...”)
Ursache/Eingrenzung: Mehrere Sipcall-Accounts (gleicher host/fromdomain) zeigen auf verschiedene Contexts.
Lösung: Alle Accounts des selben Providers müssen auf denselben Context zeigen!!!
Anrufe weiterleiten funktioniert nicht
Problem: Migration auf anderen Asterisk-Server, Konfig-Files 1:1 kopiert, nichts geht
Ursache/Lösung: Die Konfig-Files in /etc/asterisk müssen dem User asterisk gehören.
chown -R asterisk:asterisk /etc/asterisk
Problem: Asterisk meldet sich nicht beim Provider an, keine Fehlermeldungen in CLI
Ursache/Lösung: Die Anweisung insecure=very in sip.conf ist deprecated. Neu muss es heissen insecure=invite,port
Problem: Einkommende Anrufe, die nicht engegengenommen werden, brechen nach 30 Sekunden ab. Und zwar unabhängig von Weiterleitungen etc. in extensions.conf.
Ursache: Seit Anfangs 2010 bietet der Provider Sipcall den “Service”, ankommende Anrufe zu verwalten. Dies beinhaltet, dass Anrufe nach 30 Sekunden abgeklemmt werden, sofern nichts anderes konfiguriert wird.
Lösung: Sie müssen auf der Konfigurations-Homepage von Sipcall die Einstellungen für jede Nummer ändern.
| extensions.conf | Enthält den Dial-Plan. Diese Datei bestimmt, was mit sämtlichen einkommenden/ausgehenden Anrufen geschieht. Sie ist unterteilt in verschiedene Kontexte, die in sip.conf oder anderen Konfigurationsdateien definiert sind. |
|---|---|
| sip.conf | Enthält sämtliche Verbindungsdaten, die für die IP-Telefonie benötigt sind. Das heisst: Benutzer, Passwörter, Hostnamen, Sound-Kodierung etc. |
| capi.conf | Enthält die ISDN-Einstellungen, sofern CAPI verwendet wird. |
| modules.conf | Bestimmt, welche Erweiterungen geladen oder nicht geladen werden. |
| features.conf | Ist u.a. für die Einstellungen zur Anruf-Weiterleitung etc. zuständig. |
asterisk -cvvvv aufgerufen. Achtung: ein allfällig laufender Asterisk-Dienst muss zuerst gestoppt und danach wieder gestartet werden! (Alternative: Läuft der Dienst bereits, kann über asterisk -r mit dem CLI verbunden werden. Mit dem CLI-Befehl core set verbose 20 wird die Menge des Outputs erhöht.)