Asterisk auf Fritzbox Phone
Asterisk 1.4 - Quick & Dirty
Mittwoch, den 27. Februar 2008 um 17:27 Uhr

Einleitung

Dieser Artikel beschreibt die Installation und Konfiguration von Asterisk 1.4 auf einer Fritzbox Phone. Die Installation erfolgt auf einen angeschlossenen USB Stick. Zum besseren Verständniss werden im Beispiel Rufnummern verwendet die frei erfunden sind.


Die Fritzbox ist über einen ISDN Mehrgeräteanschluß (PtMP) an das öffentliche ISDN Netz mit den fiktiven MSNs 701230, 701231 und 701232 angeschlossen.

 

Desweiteren verfügt sie über einen DSL Anschhluß und Zugangsdaten zu einem VoIP-SIP Provider. Die Voip Rufnummerm lauten im Beipiel 651230 und 651231.

 

Als interne Nebenstellen werden zwei Softphones verwendet, die sich als SIP Clients an den Asterisk der Fritzbox anmelden. Die internen Rufnummern Softphones lauten 10 und 11.

 

Die analogen Nebenstellen der Fritzbox werden gegenüber den Asterisk auch als SIP Clients konfiguriert. Die internen Rufnummern lauten 20, 21 und 22.

 

Der interne S0 Bus an der Fritzbox wird von Asterisk auch konfiguriert und genutzt. An diesem ist ein ISDN Telefon mit der internen MSN 30 angeschlossen.

Die Fritzbox hat die IP Adresse 192.168.255.202.

 

Die folgende Skizze soll das Beispiel veranschaulichen:

 

Installation

Bevor man mit der Installation beginnen kann muß der Telnetzugang zur Fritzbox geöffnet werden. Dazu schließt man ein analoges Telefon an die Fritzbox an und aktiviert den Zugang über folgende Eingabe auf dem Tastaturfeld: #96*7*

 

Als nächstes verbindet man sich mit der Fritzbox via Telnet und startet die Installation von Asterisk auf den USB Stick über folgende Befehle:

cd /var
wget http://www.spblinux.de/fbox.new/cfg_asterisk14
chmod 775 ./cfg_asterisk14
./cfg_asterisk14 usb_install

 

 

Ich installiere gerne noch den Midnight Commander zur besseren Administration (optional):

cd /var
wget http://www.spblinux.de/fbox.new/cfg_mc
chmod 755 cfg_mc
./cfg_mc usb_install

 

 

Damit Asterisk nach einem Neustart der Fritzbox automatisch startet muß die Datei /var/flash/debug.cfg angepasst werden. Diese sollte auf einer "jungfräulichen Fritzbox leer sein, und kann mit den Editor nvi bearbeitet werden:

nvi /var/flash/debug.cfg

 

 

Erhält man eine Fehlermeldung "Datei oder Verzeichnis nicht gefunden" liegt das daran daß die Datei noch nicht existiert (obwohl sie mit ls angezeigt wird). In diesem Fall hilft ein Neuanlegen mit folgendem Befehl:

echo > /var/flash/debug.cfg

 

 

Folgende Zeilen fügt man in die Datei /var/flash/debug.cfg ein:


# USB Stick zuweisen
USB=/var/media/ftp/name-des-usb-stick

# Asterisk automatisch starten
let i=0
while ! [ -f $USB/addons/cfg_asterisk14 ]; do
sleep 10
let i +=1
[ $i -lt 18 ] && continue
echo "KEIN asterisk"
break
done

cd $USB/addons
./cfg_asterisk14 usb_install
./cfg_asterisk14 start

# mc automatisch starten
./cfg_mc usb_install


# Startdateien nach /var/bin/verlinken
# so kann man Asterisk und mc aud dem Verzeichnis /var/bin/ starten (optional)
mkdir /var/bin
sleep 2
ln -s $USB/addons/cfg_asterisk14 /var/bin/cfg_asterisk14
ln -s $USB/addons/cfg_mc /var/bin/cfg_mc


Bitte daruf achten den Namen des USB Sticks entsprechend anzupassen.

Für Leute die mit den nvi Editor nicht so konform sind hier mal ein paar Tastaturkürzel:

 

i einfügen
x löschen
v markieren
y kopieren
p einfügen
dd zeile löschen

mit ESC Editiermodus verlassen und mit:

:wq speichern und beenden
:q! beenden ohne speichern

 

Manuell wird Asterisk über folgenden Befehl gestartet:

 

/var/bin/cfg_asterisk14 start

 

Über eine Remote Shell kann man sich auf einen laufenden Asterisk mit folgendem Befehl verbinden:

 

/var/chroot /var/asterisk14 bin/asterisk -rvvv

 

Konfiguration des Asterisk

Die Konfiguration von Asterisk erfolgt über die Konfigurationsdateien im Verzeichnis /var/asterisk14_usb/etc/asterisk. Entweder editiert man diese direkt über Telnet mittels nvi oder mit Hilfe des Editors vom Midnight Commander (/var/bin/cfg_mc start)

In bevorzuge die Methode mich mit einem lokalen Editor per FTP mit der Fritzbox zu verbinden und so die Konfigurationsdatein zu ändern.

 

capi.conf

Über die capi.conf wird der externe S0 Bus der Fritzbox (Anschluß ans öffentliche ISDN Netz) und der interne S0 Bus (Anschluß interner ISDN Nebenstellen) konfiguriert. Der Kontext ISDN-TE konfiguriert den externen S0 Bus und der Kontext ISDN_NT den internen. Auf die einzelnen Parameter möchte ich in diesem Howto (vorerst) nicht weiter eingehen.

 

[general]
nationalprefix=0
internationalprefix=00
rxgain=1.0
txgain=1.0
language=de


; externer S0 Bus
[ISDN-TE]
ntmode=no
isdnmode=msn
incomingmsn=*
defaultcid=701230
controller=1
group=1
softdtmf=off
relaxdtmf=off
bridge=no
devices=2
context=from-extern

; interner So Bus
[ISDN-NT]
ntmode=yes
isdnmode=msn
incomingmsn=*
controller=3
group=3
softdtmf=off
relaxdtmf=off
accountcode=
bridge=no
devices=2
context=from-intern

 

 

sip.conf

In der sip.conf werden die lokalen SIP Nebenstellen konfiguriert. Außerdem existieren zwei Kontexte für die Rauswahl über den SIP Provider. Im Kontext general werden allgemeine Einstellungen vorgenommen. Wichtig ist hier, daß Asterisk nicht auf dem Standard SIP Port 5060 lauscht sondern 5061, da die Fritzbox selber Port 5060 verwendet. Über die register Anweisung meldet man sich beim externen SIP Povider an um Anrufe aus dem öffentlichen Netz entgenzunehmen. Die Kontexte sipgate-1 und sipgate-2 stehen für zwei ausgehende Leitungen. Die Kontexte 10 und 20 für lokale SIP Clients (x-lite) und 20, 21 und 22 für die analogen Nebenstellen der Fritzbox.

 

[general]
language=de
bindport=5061
disallow=all
allow=alaw
allow=ulaw
allow=GSM
nat=yes
canreinvite=yes
context=from-extern

; Notwendig um Anrufe vom SIP provider anzunehmen
register => SIP-ID-XXX: Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann. /SIP-ID-XXX
register => SIP-ID-YYY: Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann. /SIP-ID-YYY

; ausgehende Sipgate Leitung
[sipgate-1]
host = sipgate.de
username = SIP-ID-XXX
secret = xxxxx
fromuser = SIP-ID-XXX
fromdomain = sipgate.de
canreinvite = no
qualify = yes
nat = yes
insecure = very
type = friend


; ausgehende Sipgate Leitung
[sipgate-2]
host = sipgate.de
username = SIP-ID-YYY
secret = xxxxx
fromuser = SIP-ID-YYY
fromdomain = sipgate.de
canreinvite = no
qualify = yes
nat = yes
insecure = very
type = friend


; SIP Client im Netzwerk
[10]
host=dynamic
type=friend
user=10
secret=10
call-limit=1
context=from-intern

; SIP Client im Netzwerk
[11]
host=dynamic
type=friend
user=11
secret=11
call-limit=1
context=from-intern


; Analoge Nebestelle auf der Fritzbox
[20]
host=dynamic
type=friend
user=20
secret=20
call-limit=1
context=from-intern



; Analoge Nebestelle auf der Fritzbox
[21]
host=dynamic
type=friend
user=21
secret=21
call-limit=1
context=from-intern


; Analoge Nebestelle auf der Fritzbox
[22]
host=dynamic
type=friend
user=22
secret=22
call-limit=1
context=from-intern

 

extensions.conf

Die extensions.conf könnte man als Herzstück des Asterisk bezeichnen. Sie stellt den Dialplan dar und entscheidet wie ankommende und gehende Rufe geroutet werden.

Der Kontext lokal regelt das Anrufverhalten der lokalen Nebenstellen untereinander.

In den Kontext from-extern gelangen alle eingehenden Rufe aus den öffentlichen Netz. Diese werden per Goto Anweisung an die lokalen Nebenstellen weitergeleitet. Wird beispielsweise die 701230 angerufen, klingelt die lokale Nebenstelle 10.

Über den Kontext outbound-SIP werden Rufe in das öffentliche Netz über den SIP Provider geroutet. Dabei wird das Macro dialout-trunk verwendet. Sollte die erste Sipgate Leitung schon belegt sein wird automatisch die zweite Leitung verwendet. Ist diese auch nicht verfügbar wird aufgelegt. Um die Sipgate Leitungen für die Rauswahl zu verwenden, muß die Amtsvorwahl 0 gefolgt von der eigentlichen Rufnummer gewählt werden.

 

Zur Rauswahl über das ISDN Netz wird der Kontext outbound-ISDN verwendet. Möchte man diesen verwendet muß die 8 gefolgt von der eigentlichen Rufnummer gewählt werden.

 

[globals]


[general]
static=yes
writeprotect=no


[default]


; Kontext fuer eingehende Rufe aus dem öffentlichen Netz
[from-extern]
exten = _X.,1,Wait
exten = _X.,2,NoOP(Anruf von ${CALLERID(num)} fuer ${EXTEN})
exten = _X.,3,Macro(hangupcall)

; Rufzuordnung
exten = 701230,3,Goto(local,10,1)
exten = 701231,3,Goto(local,11,1)
exten = 701232,3,Goto(local,12,1)

exten = SIP-ID-XXX,3,Goto(local,20,1)
exten = SIP-ID-YYY,3,Goto(local,30,1)


; Kontext fuer Rufe von intern
[from-intern]
include => local
include => outbound-calls



; Kontext zum Rufen der lokale Nebenstellen
[local]
exten = 10,1,MACRO(local-dial,SIP,10)
exten = 11,1,MACRO(local-dial,SIP,11)
exten = 12,1,MACRO(local-dial,SIP,12)
exten = 20,1,MACRO(local-dial,SIP,20)
exten = 21,1,MACRO(local-dial,SIP,21)
exten = 30,1,MACRO(local-dial,CAPI/ISDN-NT,30)


; Kontext fuer ausgehende Rufe
[outbound-calls]
include = outbound-ISDN
include = outbound-SIP


; ausgehende Rufe ueber ISDN
[outbound-ISDN]
exten = _8XXX.,1,Macro(dialout-trunk,ISDN-TE|CAPI|${EXTEN:1}|)
exten = _8XXX.,n,Macro(hangupcall)



; ausgehende Rufe ueber SIP
[outbound-SIP]
exten = _0XXX.,1,Macro(dialout-trunk,sipgate-1|SIP|${EXTEN:1}|)
exten = _0XXX.,n,Macro(dialout-trunk,sipgate-2|SIP|${EXTEN:1}|)
exten = _0XXX.,n,Macro(hangupcall)




;############# BEGIN MACROS #########################


[macro-hangupcall]
exten => s,1,Hangup


; Macro zum wählen der lokalen Nebenstellen
[macro-local-dial]
exten => s,1,Set(CHANNEL(LANGUAGE)=de)
exten => s,n,Dial(${ARG1}/${ARG2},60,tT)
exten => s,n,Goto(s-${DIALSTATUS},1)

exten => s-NOANSWER,1,Playback(vm-theperson)
exten => s-NOANSWER,n,Playback(vm-isunavail)
exten => s-NOANSWER,n,Hangup

exten => s-BUSY,1,Playback(vm-theperson)
exten => s-BUSY,n,Playback(vm-isonphone)
exten => s-BUSY,n,Hangup

exten => s-CHANUNAVAIL,1,Playback(pbx-invalid)
exten => s-CHANUNAVAIL,n,Hangup



; Macro zum rauswählen in das öffentliche Netz
[macro-dialout-trunk]
exten => s,1,Set(TRUNK_NAME=${ARG1})
exten => s,n,Set(CHANNELTYP=${ARG2})
exten => s,n,Set(DIALNUMBER=${ARG3})

exten => s,n,Goto(d-${CHANNELTYP},1)

exten => d-SIP,1,Dial(SIP/${TRUNK_NAME}/${DIALNUMBER}|60|tT)
exten => d-SIP,n,Goto(s-${DIALSTATUS},1)

exten => d-IAX,1,Dial(IAX/${TRUNK_NAME}/${DIALNUMBER}|60|tT)
exten => d-IAX,n,Goto(s-${DIALSTATUS},1)

exten => d-CAPI,1,Dial(CAPI/${TRUNK_NAME}/792700:${DIALNUMBER}|60|tT/bd)
exten => d-CAPI,n,Goto(s-${DIALSTATUS},1)

exten => s-BUSY,1,NoOp(Anwahl fehlgeschlagen Leitung meldet BUSY - giving up)
exten => s-BUSY,2,Busy(20)

exten => s-NOANSWER,1,NoOp(Anwahl fehlgeschlagen Leitung meldet NOANSWER - giving up)
exten => s-NOANSWER,2,Playtones(congestion)
exten => s-NOANSWER,3,Congestion(20)

exten => s-CANCEL,1,NoOp(Anwahl fehlgeschlagen Leitung meldet CANCEL - giving up)
exten => s-CANCEL,2,Playtones(congestion)
exten => s-CANCEL,3,Congestion(20)

exten => _s-.,1,Noop(Anwahl fehlgeschlagen Leitung meldet ${DIALSTATUS} - verwende andere Leitung)
exten => h,1,Macro(hangupcall)



;################ ENDE MACROS #####################

 

Konfiguration der Fritzbox

Auf der Fritzbox werden als erstes über den Punkt Telefonie --> Internettelefonie drei SIP Anmeldungen für die Nebenstellen 20, 21 und 22 eingerichtet:

Fritzbox Internettelefonie

 

 

Diese SIP Anmeldungen werden danach über den Menupunkt Telefonie --> Nebenstellen den analogen Nebenstellen der Fritzbox zugeordnet:

 

analoge Nebenstellen

 

analoge Nebenstellen

 

 

Konfiguration von X-Lite

Die Konfiguration von X-Lite für die SIP Peers 10 und 11 gestaltet sich recht einfach. Es ist darau zu achten daß bei der Angabe des SIP Proxys die Portnummer 5061 anzugeben ist.

 

xlite

 

 

Weitere Quellen

Folgende Quellen wurden bei der Esrtellung diese Artikels genutzt.

http://www.ip-phone-forum.de/showthread.php?t=146132
http://www.wehavemorefun.de/fritzbox/Hilfsprogramme_/_Tipps_&_Tricks

 

 

Offene Fragen

Das Routen der eingehenden Rufe über SIP oder ISDN zu den Nebenstellen funktioniert.

Das Routen ins öffentliche Telefonnetz über SIP oder ISDN funktioniert von allen Nebenstellen aus.

 

Ich kann über die SIP Nebenstellen 10 und 11 die analogen Nebenstellen 20 21 und 22 und das ISDN Telefon 30 anrufen.

 

Ich kann nicht von den analogen Nebenstellen 20 21 und 22 und vom ISDN Telefon 30 die SIP Nebenstelle 10 und 11 anrufen.

 

Die analogen Nebenstellen an der Fritzbox und das ISDN Telefon können sich nur über **1 **2 **3 und **9 (ISDN Telefon) untereinander anrufen.
Besser wäre über die tatsächlichen Nebenstellenrufnummern über den Asterisk Dialplan.

 

Wahle ich die ISDN Hauptrufnummer 701230 von extern an, klingelt kurz die SIP Nebenstelle 10 und danach wird sofort wieder aufgelegt. Schaltet sich da die Fritzbox kurz dazwischen? wie kann ich das verhindern?

 

Füer Tipps, Hinweise und Verbesserungen bin ich sehr dankbar. Einen Diskussionshreat zu diesem Howto gibt es auf

 

http://www.ip-phone-forum.de/showthread.php?t=160966

 

Fortsetzung folgt...