Dieser Thread sammelt beantwortet einige Fragen, die ich in anderen gestellt habe (ich ihn dort jeweils entsprechend verlinkt):
Meine Ziel war es Sip-Telefone (11 und 22) und zwei ISDN-Telefone (11111 & 22222) an einen * anzuschliesen. Diese Einschränkung ist nur für diese Beispiel gemacht. In Wirklichkeit ist es egal. Die ISDN-Telefone hängen an einer NT-HFC-Karte und der * selbst verfügt den diversen benutzerspezifischen Sip-Provider-Accounts auch über eine weitere HFC-Karte (TE-Modus), die mit dem Telekom NTBA verbunden ist.
Wie diese konfiguriert sein sollten steht
http://www.ip-phone-forum.de/forum/viewtopic.php?t=3023
und
http://www.ip-phone-forum.de/forum/viewtopic.php?t=3235
Die extensions.conf erstmal komplett:
Jetzt die einzelnen Teile:
Das ist alles klar. VOIPMSN ist die NT-Karte für die Isdn-Telefone/TK, TCOM ist die TE-Karte zum NTBA. Sip2out wird später verwendet um ein "Amtsgespräch" von einem Sip-Telefon aus zu führen.
Als nächsten definiere ich Benuzter-Macro. Diese setzen diverse Variablen: Eigener Name, eigene MSN, Sip-User falls ein anruf reinkommt, bevorzugtes call-Macro (VOIP oder PSTN) und diverse Sip-Accounts. Die Endung -intl wird später noch wichtig,
Hier wurden die zwei Call-Macros definiert. Zuerst wird festgelegt mit welcher Absender-Kennung. Dann ausgewählt welche Nummer (evtl. ist ein CbC-Anbieter eingetragen, oder aber die Nummer muss im internationalen Format vorliegen? Nämlich genau dann, wenn ein Sip-Account auf -intl endet.
Diverse Variablen werden erst später gesetzt. Falls ein CbC oder Sip-Anbieter congested ist, wird auf PSTN zurückgefallen.
Jetzt wird es etwas durcheinander, aber nur wer nicht bis zum Schluss liest:
Wenn später (weiter unten) ein Nummer gewählt wurde, wird jetzt getestet, ob diese verboten ist (forbidden). Dann wird ein entsprechende Macro gestartet. Oder aber, ob es ein Notruf ist (110, 112, 19222). Dann geht das Gespräch auf jeden Fall über die Telekom. Oder ob diese Wahlregel über VOIP oder ISDN geroutet werden soll. Zum Beispiel werden alle Anrufe an die Uni Saarland über einen Uni-Saarland Sipaccount geroutet, oder alle 0800er Nummern immer über ISDN. Achso: Wenn jemand selbst einen Call-by-Call Anbieter mitwählt (010x), dann geht das Gespräch auch über ISDN raus, da die Sip-Provider mit 010x nichts anfangen können.
Achso: Im Grunde hat die Fritzboxfon auch dieses Verhalten. Aber hier kann man noch so witzige Sachen machen, wir nummern umschreiben, zum Beispiel weil ein Sip-Provider keine ENUM-Auflösung macht, man selbst aber einen entsprechende SipgateNummer des Anzurufenden kennt.
Jetzt wird es witzig: Call-By-Call
Für alle Nummern wird vorläufig ein bester CbC-Provider bestimmt - auch wenn das Gespräche später über VoIP geht. Aber sicher ist sicher. Die Liste hier ist sehr einfach. Die beachten momentan den Sonntags-XXL Tarif der Telekom und ansonsten diverse Dumping-Preise, die es momentan gibt (oder auch schon nicht mehr). Unterschieden wird nach local (bei mir jetzt als Beispiel 069), international (00x), long-distance (alles was nicht 0xxx, aber nicht 069) und Handies.
Wichtig ist die Reihenfolge. Sonst läuft alles in nocbc. Achtung!
So jetzt kommen wir langsam zum Kern:
Der Number-Preselection Kontext unterscheidet sich vom line-preselection nur um eine Zeile. Nämlich dem include von oben beschriebenen preselection Kontext. Wenn man nämlich gleich (einen Moment noch) bewusst eine bestimmt Leitung wählt (ISDN oder SIPx) dann braucht man kein preselection.
Noch zwei Makros:
Letzteres sagt dem Benutzer nur, dass er wohl eine falsche Leitung gewählt hat. Das erste schreibt die gewählte Nummer in zwei Formate: International mit +xx am Anfang, und eine wie man es am z.B. Handy wählen würde (ausser man wählt dort intl). Die Variablen heisen INTL und EWL. Wie ihr seht ,wird auch eine Ortzvorwahl automatisch ergänzt.
Was passiert wenn jetzt * eine "Wahl" reinbekommt:
Ganz einfach. Wenn die Nummer mit 1* beginnt, will ich über ISDN raustelefonieren. Wenn sie mit 2* beginnt soll der Anruf über den Default (1) Sipprovider gehen (und wie man mit etwas Code-anschauen erkennen kann ist das Benutzerabhängig, d.h. für jede MSN kann ich entsprechende Accounts einrichten). Mit 2Z* kann man einen bestimmten Sip-Provider wählen, der aber auch exitsieren muss.
Ansonsten geht das ganze nach Number-Preselection und die kümmert sich um eine nette und vor allem automatische Anwahl.
Fehlt nur noch eins:
Wie kommt man in den den callout Kontext? So:
Je nachdem ob man eine TK oder direkt ein Telefon dranhängt, will man im sip2out auch zunächst eine 0 wählen. Die kann man vor X. einfügen.
Und wer interne Sip-phones verwenden will ... muss aber in sip.conf konfiguriert sein. Man kann natuerlich auch andere Kontexte einbinden. Spielt mal rum...
allesOK!
p.s. Tipp und Rechtschreibfehler, verbessere ich aufgrund der Länge des Texte nicht!
Meine Ziel war es Sip-Telefone (11 und 22) und zwei ISDN-Telefone (11111 & 22222) an einen * anzuschliesen. Diese Einschränkung ist nur für diese Beispiel gemacht. In Wirklichkeit ist es egal. Die ISDN-Telefone hängen an einer NT-HFC-Karte und der * selbst verfügt den diversen benutzerspezifischen Sip-Provider-Accounts auch über eine weitere HFC-Karte (TE-Modus), die mit dem Telekom NTBA verbunden ist.
Wie diese konfiguriert sein sollten steht
http://www.ip-phone-forum.de/forum/viewtopic.php?t=3023
und
http://www.ip-phone-forum.de/forum/viewtopic.php?t=3235
Die extensions.conf erstmal komplett:
Code:
[general]
static=yes
writeprotect=no
[globals]
VOIPMSN=Zap/g1
TCOM=Zap/g2
[default]
include => sip2out
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;users ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[macro-user11111]
exten => s,1,SetVar(MYNAME=MSN11111)
exten => s,2,SetVar(MYMSN=11111)
exten => s,3,SetVar(MYSIPGROUP=SIP/11)
exten => s,4,SetVar(MYCALLMACRO=callwithpstn)
exten => s,5,SetVar(MYNUMSIP=1)
exten => s,6,SetVar(MYSIP1=sipgate11)
exten => s,6,SetVar(MYSIP1=unisaarland-intl)
[macro-user22222]
exten => s,1,SetVar(MYNAME=MSN22222)
exten => s,2,SetVar(MYMSN=22222)
exten => s,3,SetVar(MYSIPGROUP=SIP/22)
exten => s,4,SetVar(MYCALLMACRO=callwithpstn)
exten => s,5,SetVar(MYNUMSIP=3)
exten => s,6,SetVar(MYSIP1=sipgate22)
exten => s,7,SetVar(MYSIP2=unisaarland-intl)
exten => s,8,SetVar(MYSIP3=webde22)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; external ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; outgoing calls
[macro-callwithpstn]
; ARG1 = calleridnum
; ARG2 = calleridname
exten => s,1,SetCIDNum(${ARG1})
exten => s,2,SetCIDName(${ARG2})
exten => s,3,Dial(${TCOM}/${CBC}${EWL},60,Ttr)
exten => s,104,GotoIf($[${DIALSTATUS} = CONGESTION]?109:110)
exten => s,105,Dial(${TCOM}/${EWL},60,Ttr)
exten => s,106,Playtones(busy);
exten => s,107,Busy
[macro-callwithsip]
; ARG1 = calleridnum
; ARG2 = calleridname
; ARG3 = sipprovider
exten => s,1,SetCIDNum(${ARG1})
exten => s,2,SetCIDName(${ARG2})
exten => s,3,SetVar(NUMBER2DIAL=${EWL})
exten => s,4,GotoIf($[${ARG3:-5} = -intl]?5:6)
exten => s,5,SetVar(NUMBER2DIAL=${INTL})
exten => s,6,Dial(SIP/${NUMBER2DIAL}@${ARG3},60,Ttr)
exten => s,107,GotoIf($[${DIALSTATUS} = CONGESTION]?108:109)
exten => s,108,Macro(callwithpstn,${ARG1},${ARG2})
exten => s,109,Playtones(busy);
exten => s,110,Busy
[macro-notallowed]
exten => s,1,Answer
exten => s,2,Wait(0.5)
exten => s,3,Playback(ss-noservice)
exten => s,4,Hangup
[forbidden]
; 019x
exten => _019X.,1,Macro(notallowed)
; 0900
exten => _0900X.,1,Macro(notallowed)
; EMSAT
exten => _0088X.,1,Macro(notallowed)
[emergency]
; re-rewrite emergency call numbers
exten => _069110,1,SetVar(EWL=110)
exten => _069110,2,Macro(callwithpstn,${MYMSN},${MYNAME})
exten => _069112,1,SetVar(EWL=112)
exten => _069112,2,Macro(callwithpstn,${MYMSN},${MYNAME})
exten => _06919222,1,SetVar(EWL=19222)
exten => _06919222,2,Macro(callwithpstn,${MYMSN},${MYNAME})
[preselection]
; dial the following prefixes with a defined method
; university of saarland
exten => _0681302X.,1,Macro(callwithsip,${MYMSN},${MYNAME},eric-unisaarland-intl)
; freecall
exten => _0800X.,1,Macro(callwithpstn,${MYMSN},${MYNAME})
; user-defined call-by-call
exten => _010X.,1,Macro(callwithpstn,${MYMSN},${MYNAME})
; automatic call-by-call
[macro-cbc]
exten => s,1,SetVar(CBC=${ARG1})
exten => s,2,Macro(${CALLMACRO2USE},${MYMSN},${MYNAME},${SIP2USE})
exten => s,3,Hangup
[cbc-01071-international]
exten => _00ZX.,1,Macro(cbc,01071)
[cbc-01071-cellphones]
exten => _016X.,1,Macro(cbc,01071)
exten => _017X.,1,Macro(cbc,01071)
[cbc-01071-longdistance]
exten => _0ZX.,1,Macro(cbc,01071)
[cbc-01019-local]
exten => _069X.,1,Macro(cbc,01019)
[cbc-xxl]
exten => _0ZX.,1,Macro(cbc,01033)
[nocbc]
exten => _X.,1,Macro(cbc)
[cbc]
;exten => _069X.,1,Macro(cbc)
include => cbc-01019-local|*|mon-sat|*|*
include => cbc-01071-international
include => cbc-01071-cellphones
include => cbc-01071-longdistance|*|mon-sat|*|*
include => cbc-xxl|*|sun|*|*
include => nocbc;
[standard]
exten => h,1,NoOp
exten => t,1,Playtones(busy)
exten => t,2,Busy
[number-preselection]
include => emergency
include => forbidden
include => preselection
include => cbc
include => standard
[line-preselection]
include => emergency
include => forbidden
include => cbc
include => standard
[macro-numbers]
; ARG1 number to rewrite
; sets
; EWL (exten with local)
; INTL (international format)
exten => s,1,GotoIf($[${ARG1:0:2} = 00]?2:5)
exten => s,2,SetVar(EWL=${ARG1})
exten => s,3,SetVar(INTL=+${ARG1:2})
exten => s,4,Goto(11)
exten => s,5,GotoIf($[${ARG1:0:1} = 0]?6:9)
exten => s,6,SetVar(EWL=${ARG1})
exten => s,7,SetVar(INTL=+49${ARG1:1})
exten => s,8,Goto(11)
exten => s,9,SetVar(EWL=069${ARG1})
exten => s,10,SetVar(INTL=+4969${ARG1})
exten => s,11,NoOp
[macro-invalidline]
exten => s,1,Answer
exten => s,2,Wait(0.5)
exten => s,3,Playback(privacy-incorrect)
exten => s,4,Hangup
[callout]
; use pstn line (no sip provider needed)
exten => _1*X.,1,SetVar(CALLMACRO2USE=callwithpstn)
exten => _1*X.,2,Macro(numbers,${EXTEN:2})
exten => _1*X.,3,Goto(line-preselection,${EWL},1)
; use default sipline (MYSIP1)
; forbid CbX over sip
exten => _2*010X.,1,Macro(invalidline)
exten => _2*X.,1,SetVar(CALLMACRO2USE=callwithsip)
exten => _2*X.,2,SetVar(SIP2USE=${MYSIP1})
exten => _2*X.,3,Macro(numbers,${EXTEN:2})
exten => _2*X.,4,Goto(line-preselection,${EWL},1)
; use special sipline (MYSIPx)
;forbid CbC over sip
exten => _2Z*010X.,1,Macro(invalidline)
exten => _2Z*X.,1,SetVar(CALLMACRO2USE=callwithsip)
exten => _2Z*X.,2,GotoIf($[${EXTEN:1:1} <= ${MYNUMSIP}]?3:7)
exten => _2Z*X.,3,SetVar(SIP2USE=${MYSIP${EXTEN:1:1}})
exten => _2Z*X.,4,Macro(numbers,${EXTEN:3})
exten => _2Z*X.,5,Goto(line-preselection,${EWL},1)
exten => _2Z*X.,6,Goto(8)
exten => _2Z*X.,7,Macro(invalidline)
exten => _2Z*X.,8,NoOp
; choose best service by number (fallback is MYCALLMACRO)
exten => _XXX.,1,SetVar(CALLMACRO2USE=${MYCALLMACRO})
exten => _XXX.,2,SetVar(SIP2USE=${MYSIP1})
exten => _XXX.,3,Macro(numbers,${EXTEN})
exten => _XXX.,4,Goto(number-preselection,${EWL},1)
include => sipphones
; if the number does not start with three digits -> invalid
exten => i,1,Macro(invalidline)
[isdn2out]
exten => s,1,Wait(0.1)
exten => s,2,DigitTimeout(2)
exten => s,3,SetLanguage(de)
exten => s,4,Macro(user${PRI_NETWORK_CID})
exten => _X.,1,Wait(0.1)
exten => _X.,2,DigitTimeout(2)
exten => _X.,3,SetLanguage(de)
exten => _X.,4,Macro(user${PRI_NETWORK_CID})
exten => _X.,5,Goto(callout,${EXTEN},1)
[sip2out]
exten => _0X./11,1,Macro(user11111)
exten => _0X./11,2,Goto(callout,${EXTEN:1},1)
exten => _0X./22,1,Macro(user22222)
exten => _0X./22,2,Goto(callout,${EXTEN:1},1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; in-coming calls (isdn)
[macro-call-tk]
exten => s,1,Wait(0.1)
exten => s,2,Macro(user${MACRO_EXTEN})
exten => s,3,SetCIDNum(${CALLERIDNUM})
exten => s,4,Dial(${VOIPMSN}/${MYMSN},60,Ttr)
exten => s,105,Busy
[macro-call-sip]
exten => s,1,Wait(0.1)
exten => s,2,Macro(user${MACRO_EXTEN})
exten => s,3,SetCIDNum(0${CALLERIDNUM})
exten => s,4,Dial(${MYSIPGROUP},60,Ttr)
exten => s,105,Busy
[tcom-in]
exten => 11111,1,Macro(call-tk)
exten => 22222,1,Macro(call-sip)
exten => i,1,Congestion
exten => h,1,NoOp
exten => t,1,Busy
[macro-sip]
exten => s,1,Dial(SIP/${MACRO_EXTEN},60,Ttr)
exten => s,2,Goto(s-${DIALSTATUS},1)
exten => s,3,Hangup
exten => s-CANCEL,1,Goto(s,3)
exten => s-ANSWER,1,NoOp
exten => s-NOANSWER,1,Goto(s,3)
exten => s-BUSY,1,Busy
exten => s-BUSY,2,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CONGESTION,2,Hangup
exten => s-CHANUNAVAIL,1,Playback(vm-theperson)
exten => s-CHANUNAVAIL,2,SayDigits(${MACRO_EXTEN})
exten => s-CHANUNAVAIL,3,Playback(vm-isunavail)
exten => s-CHANUNAVAIL,4,Hangup
[sipphones] ; or other ínternal contexts which should be call-able
exten => 24,1,Macro(sip)
exten => 24,2,Hangup
exten => 32,1,Macro(sip)
exten => 32,2,Hangup
exten => h,1,Hangup
Jetzt die einzelnen Teile:
Code:
[general]
static=yes
writeprotect=no
[globals]
VOIPMSN=Zap/g1
TCOM=Zap/g2
[default]
include => sip2out
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;users ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[macro-user11111]
exten => s,1,SetVar(MYNAME=MSN11111)
exten => s,2,SetVar(MYMSN=11111)
exten => s,3,SetVar(MYSIPGROUP=SIP/11)
exten => s,4,SetVar(MYCALLMACRO=callwithpstn)
exten => s,5,SetVar(MYNUMSIP=1)
exten => s,6,SetVar(MYSIP1=sipgate11)
exten => s,6,SetVar(MYSIP1=unisaarland-intl)
[macro-user22222]
exten => s,1,SetVar(MYNAME=MSN22222)
exten => s,2,SetVar(MYMSN=22222)
exten => s,3,SetVar(MYSIPGROUP=SIP/22)
exten => s,4,SetVar(MYCALLMACRO=callwithpstn)
exten => s,5,SetVar(MYNUMSIP=3)
exten => s,6,SetVar(MYSIP1=sipgate22)
exten => s,7,SetVar(MYSIP2=unisaarland-intl)
exten => s,8,SetVar(MYSIP3=webde22)
Als nächsten definiere ich Benuzter-Macro. Diese setzen diverse Variablen: Eigener Name, eigene MSN, Sip-User falls ein anruf reinkommt, bevorzugtes call-Macro (VOIP oder PSTN) und diverse Sip-Accounts. Die Endung -intl wird später noch wichtig,
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; outgoing calls
[macro-callwithpstn]
; ARG1 = calleridnum
; ARG2 = calleridname
exten => s,1,SetCIDNum(${ARG1})
exten => s,2,SetCIDName(${ARG2})
exten => s,3,Dial(${TCOM}/${CBC}${EWL},60,Ttr)
exten => s,104,GotoIf($[${DIALSTATUS} = CONGESTION]?109:110)
exten => s,105,Dial(${TCOM}/${EWL},60,Ttr)
exten => s,106,Playtones(busy);
exten => s,107,Busy
[macro-callwithsip]
; ARG1 = calleridnum
; ARG2 = calleridname
; ARG3 = sipprovider
exten => s,1,SetCIDNum(${ARG1})
exten => s,2,SetCIDName(${ARG2})
exten => s,3,SetVar(NUMBER2DIAL=${EWL})
exten => s,4,GotoIf($[${ARG3:-5} = -intl]?5:6)
exten => s,5,SetVar(NUMBER2DIAL=${INTL})
exten => s,6,Dial(SIP/${NUMBER2DIAL}@${ARG3},60,Ttr)
exten => s,107,GotoIf($[${DIALSTATUS} = CONGESTION]?108:109)
exten => s,108,Macro(callwithpstn,${ARG1},${ARG2})
exten => s,109,Playtones(busy);
exten => s,110,Busy
Hier wurden die zwei Call-Macros definiert. Zuerst wird festgelegt mit welcher Absender-Kennung. Dann ausgewählt welche Nummer (evtl. ist ein CbC-Anbieter eingetragen, oder aber die Nummer muss im internationalen Format vorliegen? Nämlich genau dann, wenn ein Sip-Account auf -intl endet.
Diverse Variablen werden erst später gesetzt. Falls ein CbC oder Sip-Anbieter congested ist, wird auf PSTN zurückgefallen.
Jetzt wird es etwas durcheinander, aber nur wer nicht bis zum Schluss liest:
Code:
[macro-notallowed]
exten => s,1,Answer
exten => s,2,Wait(0.5)
exten => s,3,Playback(ss-noservice)
exten => s,4,Hangup
[forbidden]
; 019x
exten => _019X.,1,Macro(notallowed)
; 0900
exten => _0900X.,1,Macro(notallowed)
; EMSAT
exten => _0088X.,1,Macro(notallowed)
[emergency]
; re-rewrite emergency call numbers
exten => _069110,1,SetVar(EWL=110)
exten => _069110,2,Macro(callwithpstn,${MYMSN},${MYNAME})
exten => _069112,1,SetVar(EWL=112)
exten => _069112,2,Macro(callwithpstn,${MYMSN},${MYNAME})
exten => _06919222,1,SetVar(EWL=19222)
exten => _06919222,2,Macro(callwithpstn,${MYMSN},${MYNAME})
[preselection]
; dial the following prefixes with a defined method
; university of saarland
exten => _0681302X.,1,Macro(callwithsip,${MYMSN},${MYNAME},eric-unisaarland-intl)
; freecall
exten => _0800X.,1,Macro(callwithpstn,${MYMSN},${MYNAME})
; user-defined call-by-call
exten => _010X.,1,Macro(callwithpstn,${MYMSN},${MYNAME})
; automatic call-by-call
Wenn später (weiter unten) ein Nummer gewählt wurde, wird jetzt getestet, ob diese verboten ist (forbidden). Dann wird ein entsprechende Macro gestartet. Oder aber, ob es ein Notruf ist (110, 112, 19222). Dann geht das Gespräch auf jeden Fall über die Telekom. Oder ob diese Wahlregel über VOIP oder ISDN geroutet werden soll. Zum Beispiel werden alle Anrufe an die Uni Saarland über einen Uni-Saarland Sipaccount geroutet, oder alle 0800er Nummern immer über ISDN. Achso: Wenn jemand selbst einen Call-by-Call Anbieter mitwählt (010x), dann geht das Gespräch auch über ISDN raus, da die Sip-Provider mit 010x nichts anfangen können.
Achso: Im Grunde hat die Fritzboxfon auch dieses Verhalten. Aber hier kann man noch so witzige Sachen machen, wir nummern umschreiben, zum Beispiel weil ein Sip-Provider keine ENUM-Auflösung macht, man selbst aber einen entsprechende SipgateNummer des Anzurufenden kennt.
Jetzt wird es witzig: Call-By-Call
Für alle Nummern wird vorläufig ein bester CbC-Provider bestimmt - auch wenn das Gespräche später über VoIP geht. Aber sicher ist sicher. Die Liste hier ist sehr einfach. Die beachten momentan den Sonntags-XXL Tarif der Telekom und ansonsten diverse Dumping-Preise, die es momentan gibt (oder auch schon nicht mehr). Unterschieden wird nach local (bei mir jetzt als Beispiel 069), international (00x), long-distance (alles was nicht 0xxx, aber nicht 069) und Handies.
Code:
[macro-cbc]
exten => s,1,SetVar(CBC=${ARG1})
exten => s,2,Macro(${CALLMACRO2USE},${MYMSN},${MYNAME},${SIP2USE})
exten => s,3,Hangup
[cbc-01071-international]
exten => _00ZX.,1,Macro(cbc,01071)
[cbc-01071-cellphones]
exten => _016X.,1,Macro(cbc,01071)
exten => _017X.,1,Macro(cbc,01071)
[cbc-01071-longdistance]
exten => _0ZX.,1,Macro(cbc,01071)
[cbc-01019-local]
exten => _069X.,1,Macro(cbc,01019)
[cbc-xxl]
exten => _0ZX.,1,Macro(cbc,01033)
[nocbc]
exten => _X.,1,Macro(cbc)
[cbc]
;exten => _069X.,1,Macro(cbc)
include => cbc-01019-local|*|mon-sat|*|*
include => cbc-01071-international
include => cbc-01071-cellphones
include => cbc-01071-longdistance|*|mon-sat|*|*
include => cbc-xxl|*|sun|*|*
include => nocbc;
So jetzt kommen wir langsam zum Kern:
Code:
[standard]
exten => h,1,NoOp
exten => t,1,Playtones(busy)
exten => t,2,Busy
[number-preselection]
include => emergency
include => forbidden
include => preselection
include => cbc
include => standard
[line-preselection]
include => emergency
include => forbidden
include => cbc
include => standard
Der Number-Preselection Kontext unterscheidet sich vom line-preselection nur um eine Zeile. Nämlich dem include von oben beschriebenen preselection Kontext. Wenn man nämlich gleich (einen Moment noch) bewusst eine bestimmt Leitung wählt (ISDN oder SIPx) dann braucht man kein preselection.
Noch zwei Makros:
Code:
[macro-numbers]
; ARG1 number to rewrite
; sets
; EWL (exten with local)
; INTL (international format)
exten => s,1,GotoIf($[${ARG1:0:2} = 00]?2:5)
exten => s,2,SetVar(EWL=${ARG1})
exten => s,3,SetVar(INTL=+${ARG1:2})
exten => s,4,Goto(11)
exten => s,5,GotoIf($[${ARG1:0:1} = 0]?6:9)
exten => s,6,SetVar(EWL=${ARG1})
exten => s,7,SetVar(INTL=+49${ARG1:1})
exten => s,8,Goto(11)
exten => s,9,SetVar(EWL=069${ARG1})
exten => s,10,SetVar(INTL=+4969${ARG1})
exten => s,11,NoOp
[macro-invalidline]
exten => s,1,Answer
exten => s,2,Wait(0.5)
exten => s,3,Playback(privacy-incorrect)
exten => s,4,Hangup
Letzteres sagt dem Benutzer nur, dass er wohl eine falsche Leitung gewählt hat. Das erste schreibt die gewählte Nummer in zwei Formate: International mit +xx am Anfang, und eine wie man es am z.B. Handy wählen würde (ausser man wählt dort intl). Die Variablen heisen INTL und EWL. Wie ihr seht ,wird auch eine Ortzvorwahl automatisch ergänzt.
Was passiert wenn jetzt * eine "Wahl" reinbekommt:
Code:
[callout]
; use pstn line (no sip provider needed)
exten => _1*X.,1,SetVar(CALLMACRO2USE=callwithpstn)
exten => _1*X.,2,Macro(numbers,${EXTEN:2})
exten => _1*X.,3,Goto(line-preselection,${EWL},1)
; use default sipline (MYSIP1)
; forbid CbC over sip
exten => _2*010X.,1,Macro(invalidline)
exten => _2*X.,1,SetVar(CALLMACRO2USE=callwithsip)
exten => _2*X.,2,SetVar(SIP2USE=${MYSIP1})
exten => _2*X.,3,Macro(numbers,${EXTEN:2})
exten => _2*X.,4,Goto(line-preselection,${EWL},1)
; use special sipline (MYSIPx)
; forbid CbC over sip
exten => _2Z*010X.,1,Macro(invalidline)
exten => _2Z*X.,1,SetVar(CALLMACRO2USE=callwithsip)
exten => _2Z*X.,2,GotoIf($[${EXTEN:1:1} <= ${MYNUMSIP}]?3:7)
exten => _2Z*X.,3,SetVar(SIP2USE=${MYSIP${EXTEN:1:1}})
exten => _2Z*X.,4,Macro(numbers,${EXTEN:3})
exten => _2Z*X.,5,Goto(line-preselection,${EWL},1)
exten => _2Z*X.,6,Goto(8)
exten => _2Z*X.,7,Macro(invalidline)
exten => _2Z*X.,8,NoOp
; choose best service by number (fallback is MYCALLMACRO)
exten => _XXX.,1,SetVar(CALLMACRO2USE=${MYCALLMACRO})
exten => _XXX.,2,SetVar(SIP2USE=${MYSIP1})
exten => _XXX.,3,Macro(numbers,${EXTEN})
exten => _XXX.,4,Goto(number-preselection,${EWL},1)
; if the number does not start with three digits -> invalid
exten => i,1,Macro(invalidline)
Ganz einfach. Wenn die Nummer mit 1* beginnt, will ich über ISDN raustelefonieren. Wenn sie mit 2* beginnt soll der Anruf über den Default (1) Sipprovider gehen (und wie man mit etwas Code-anschauen erkennen kann ist das Benutzerabhängig, d.h. für jede MSN kann ich entsprechende Accounts einrichten). Mit 2Z* kann man einen bestimmten Sip-Provider wählen, der aber auch exitsieren muss.
Ansonsten geht das ganze nach Number-Preselection und die kümmert sich um eine nette und vor allem automatische Anwahl.
Fehlt nur noch eins:
Wie kommt man in den den callout Kontext? So:
Code:
[isdn2out]
exten => s,1,Wait(0.1)
exten => s,2,DigitTimeout(2)
exten => s,3,SetLanguage(de)
exten => s,4,Macro(user${PRI_NETWORK_CID})
exten => _X.,1,Wait(0.1)
exten => _X.,2,DigitTimeout(2)
exten => _X.,3,SetLanguage(de)
exten => _X.,4,Macro(user${PRI_NETWORK_CID})
exten => _X.,5,Goto(callout,${EXTEN},1)
[sip2out]
exten => _X./11,1,Macro(user11111)
exten => _X./11,2,Goto(callout,${EXTEN:1},1)
exten => _X./22,1,Macro(user22222)
exten => _X./22,2,Goto(callout,${EXTEN:1},1)
Je nachdem ob man eine TK oder direkt ein Telefon dranhängt, will man im sip2out auch zunächst eine 0 wählen. Die kann man vor X. einfügen.
Und wer interne Sip-phones verwenden will ... muss aber in sip.conf konfiguriert sein. Man kann natuerlich auch andere Kontexte einbinden. Spielt mal rum...
Code:
[macro-sip]
exten => s,1,Dial(SIP/${MACRO_EXTEN},60,Ttr)
exten => s,2,Goto(s-${DIALSTATUS},1)
exten => s,3,Hangup
exten => s-CANCEL,1,Goto(s,3)
exten => s-ANSWER,1,NoOp
exten => s-NOANSWER,1,Goto(s,3)
exten => s-BUSY,1,Busy
exten => s-BUSY,2,Hangup
exten => s-CONGESTION,1,Congestion
exten => s-CONGESTION,2,Hangup
exten => s-CHANUNAVAIL,1,Playback(vm-theperson)
exten => s-CHANUNAVAIL,2,SayDigits(${MACRO_EXTEN})
exten => s-CHANUNAVAIL,3,Playback(vm-isunavail)
exten => s-CHANUNAVAIL,4,Hangup
[sipphones] ; or other ínternal contexts which should be call-able
exten => 24,1,Macro(sip)
exten => 24,2,Hangup
exten => 32,1,Macro(sip)
exten => 32,2,Hangup
exten => h,1,Hangup
allesOK!
p.s. Tipp und Rechtschreibfehler, verbessere ich aufgrund der Länge des Texte nicht!