Mini-HowTos von Klaus Franken
Es sollen mehrere SIP-Clients gleichzeitig bei einem Anruf klingeln, wo als erstes der Anruf entgegengenommen wird, hat die Leitung und die anderen Telefone hören auf zu klingeln. Die SIP-Clients können auch an verschiedenen externen Standorten sein, solange sie Zugriff zum Asterisk-Server haben.
Das Problem: Selbstverständlich könnte man bei einem SIP-Account mehrere Telefone mit denselben SIP-Daten registrieren lassen. Aber in der Praxis hat sich gezeigt, dass es ungewiss ist, ob sich die Registierungen nicht untereinander stören. Im Klartext: es klingelt zufeälligerweise das Telefon, was sich zuletzt registriert hat. Ausserdem könnte man die einzelnen Apparate nicht mehr einzeln anklingeln oder man müsste an jedem Apparat mehrere SIP-Accounts eintragen (was nicht immer geht und womit man die Flexibilität verliert das über Asterisk selbst zu konfigurieren).
Die Lösung:
[1000] callerid=Klaus Franken am App. 1000 <1000> ; überschreibt name des sip clients type=friend username=1000 secret=geheim host=dynamic context=default nat=yes canreinvite=no ; kein RTP direkt mailbox=1000,9999 [1001] callerid=Klaus Franken am App. 1001 <1001> ; überschreibt name des sip clients type=friend username=1001 secret=geheim2 host=dynamic context=default nat=yes canreinvite=no ; kein RTP direkt mailbox=1001,9999
; alle 4 stelligen Nr. intern betrachten exten => _XXXX,1,Dial(SIP/${EXTEN},15,tT) exten => _XXXX,2,Wait(1) exten => _XXXX,3,Voicemail(${EXTEN}) exten => _XXXX,4,Hangup
; Sammelruf direkt auf mehrere SIPs exten => 9999,1,Ringing exten => 9999,2,Set(LANGUAGE()=de) exten => 9999,3,Dial(SIP/1000&SIP/1001,20) exten => 9999,4,Wait(1) exten => 9999,5,Voicemail(${EXTEN}) exten => 9999,6,Hangup
Aufgabe: der Teilnehmer für Notfälle immer erreichbar sein, aber im Normalfall soll der Anrufer eine Nachricht auf dem Anrufbeantworter hinterlassen. Es wird per Tastendruck eine Weiterleitung auf eine Telefonnummer veranlasst, die dem Anrufer garnicht bekannt ist. Das könnte z.B. die Handy-Nummer der Teilnehmers sein.
Lösung:
exten => 9999,1,Ringing exten => 9999,2,Set(LANGUAGE()=de) exten => 9999,3,Dial(SIP/1000&SIP/1001,20) exten => 9999,4,Goto(menu9999,s,1) [menu9999] exten => s,1,ResponseTimeout,2 ; Set Response Timeout exten => s,2,Answer exten => s,3,Wait(2) exten => s,4,Background(msg-voice) exten => 8,1,Playback(transfer) exten => 8,2,SetCallerID(StrukturPunkt/Franken) exten => 8,3,Dial(SIP/0172xxxxxx@dusnet-out) exten => 8,4,Hangup exten => t,1,Voicemail(9999) ; timeout: Default exten => t,2,Hangup exten => i,1,Background(KFRmsg0006) ; incorrect: Fange neu an
Aufgabe: Anstatt eine Nummer manuell am Telefonapparat zu wählen, soll der Asterisk-Server die Verbindung herstellen, der Anwender braucht nur den Hörer abzunehmen.
Unter /var/spool/asterisk/outgoing/ eine Datei erstellen, z.B. 1000-97797117
Channel: SIP/1000 Callerid: Wähle 97797117 <97797117> Context: default Extension: 97797117 MaxRetries: 0 Retrytime: 3 WaitTime: 5 Priority: 1
Erklärung:
Getestet mit Asterisk 1.0 und 1.2
Mit dem folgenden Programm dial kann das Wählbefehl (genauer: das Spoolfile) automatisch erzeugt werden:
/* !/bin/sh */ /* (c) 2006, 2007 Klaus.Franken@StrukturPunkt.de */ SPOOLDIR=/var/spool/asterisk/outgoing SELF=9999 NR="$1$2$3$4$5$6$7$8$9" CALLNR=`echo $NR | perl -ne '$_ =~ s?[\(\)/-\s]??g; print $_;'` SPOOLFILE="$SELF-$CALLNR.$$" if [-z "$NR" ]; then echo "keine Nr. angegbene" >&2 exit 1 fi echo " Channel: Local/$SELF Callerid: Waehle $NR <$CALLNR> Context: default Extension: $CALLNR MaxRetries: 0 Retrytime: 3 WaitTime: 15 Priority: 1 " > $SPOOLDIR/$SPOOLFILE
Anpassung:
Die Zielrufnummer kann in einem (fast) beliebigen Format sein, z.B. 0911 / 123 456-7
Das Script muss ausführbar sein und der Benutzer muss Schreibrechte in /var/spool/asterisk/outgoing haben. Gestartet wird der Wähvorgang mit (Beispiel): dial 123456
[featuremap] /* blindxfer => #1 ; Blind transfer */ disconnect => *0 ; Disconnect atxfer => *2 ; Attended transfer
Beispiel Simply-Connect.de
register => 100398976:SECRET@iax.simply-connect.de ... [100398976] type=user username=100398976 host=62.112.132.111 secret=SECRET
; rauswählen: exten => _0XXXXX.,n,Dial(IAX2/100398976:SECRET@iax.simply-connect.de/${EXTEN}) ... ; Anruf (aus iax.conf) an SIP-Account leiten: exten => 100398976,1,SetCallerID(IAX) exten => 100398976,n,Dial(SIP/7099) exten => 100398976,n,Hangup ; Anruf (aus iax.conf) an SIP-Account leiten: ; besser als 1. Bsp.: kein Ueberschrieben der CallerID, im dialplan so als wäre gleich der Account 1005 angerufen worden (Goto) exten => 10030811201,1,Goto(1005,1) exten => 10030811201,n,Hangup
iax2 set debug ... iax2 set debug off
Ziel: Abfrage über E-Mail Client und Telefon, ohne Verdoppelung der Voicemail.
Geht mit UW-IMAP Toolkit. nur mit UW-IMAP Server ?
In voicemail.conf
: imapserver=localhost
(und weitere…)
Links:
[default] mode=files directory=/var/lib/asterisk/mohnative random=yes
moh reload
Freie MP3s:
Wenn das folgende Script eine Ausgabe liefert, stimmt irgendwas mit der SIP- oder IAX-Registrierung beim VoIP-Provider nicht.
#!/bin/sh # checke dass registry-Einträge auch wirklich "Registered" sind SIPREG=`/usr/sbin/asterisk -rx "sip show registry"` IAXREG=`/usr/sbin/asterisk -rx "iax2 show registry"` echo "$SIPREG" | while read HOST USERNAME REFRESH STATE TIME; do if test $HOST = 'Host'; then continue fi if test $STATE = 'Registered'; then continue # OK fi echo "$HOST: $STATE" done echo "$IAXREG" | while read HOST DNSMGR USERNAME PERCEIVED REFRESH STATE; do if test $HOST = 'Host'; then continue fi if test $STATE = 'Registered'; then continue # OK fi echo "$HOST: $STATE" done
Das Script kann als Cronjob ausgeführt werden: /etc/cron.d/asterisk_check
MAILTO=support@meine_firma.deee */15 * * * * root /usr/local/bin/asterisk_check_registry