Wenn Nummer als SIP existiert -> SIP, ansonsten CAPI

sted

Neuer User
Mitglied seit
21 Apr 2005
Beiträge
94
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

ich betreibe einen Asterisk Server an einer größeren Telefonanlage. Es werden Nummern aus dem eigentlichen Kreis der Telefonanlage an den Asterisk Server gegeben (S0 Schnitstelle, blabla).

Die verwendeten SIP Accounts haben als Username eben diese Nummern.
Nun möchte ich meinen DialPlan natürlich möglichst flexibel gestalten, daher wäre es toll, wenn Asterisk on the fly herausfinden (wissen) kann, ob es eine bestimmte Nummer als SIP Account gibt bzw einen Account mit der Nummer.

Momentan macht mein "from-SIP" Kontext einfach alles an CAPI, wenn ich dann eine Nummer eines SIP Accounts anrufe, so geht diese erst über CAPI raus und kommt dann über die Anlage rein. Bullshit.
Ich könnte für jeden SIP Account noch eine extension in der extensions.conf anlegen, dadurch aber bloß der Aufwand beim Anlegen eines neuen SIP Accounts.

Wie lässt sich sowas flexibel einrichten?

Momentan sieht meine Config so aus:

Code:
[general]
static=yes
writeprotect=no

[globals]


[from-ISDN]

exten => _XXX,1,Wait(1)
exten => _XXX,2,Dial(SIP/${EXTEN})
exten => _XXX,3,Hangup



[from-SIP]

;; Softphones

;exten => 599,1,Dial(SIP/${EXTEN})
;exten => 599,2,Hangup

;exten => 598,1,Dial(SIP/${EXTEN})
;exten => 598,2,Hangup

;exten => 592,1,Dial(SIP/${EXTEN})
;exten => 592,2,Hangup

;exten => 590,1,Dial(SIP/${EXTEN})
;exten => 590,2,Hangup



exten => _00.,1,Wait(1)
exten => _00.,2,Dial(CAPI/${CALLERIDNUM}:${EXTEN},60)
exten => _00.,3,Hangup

; Andere 3stellige Nebenstellen
exten => _XXX,1,Wait(1)
exten => _XXX,2,Dial(CAPI/${CALLERIDNUM}:${EXTEN},40)
exten => _XXX,3,Hangup

; Andere 4stellige Nebenstellen
exten => _XXXX,1,Wait(1)
exten => _XXXX,2,Dial(CAPI/${CALLERIDNUM}:${EXTEN},40)
exten => _XXXX,3,Hangup


;exten => s,1,Answer
 ;exten => s,2,Playback(de/invalid)
 ;exten => s,2,Dial(CAPI/599:001784728123,60)
;exten => s,2,Dial(SIP/9124)
;exten => s,3,Hangup

Danke und Gruß,
stephan
 
Zwei möglichkeiten:
a) Du speicherst zu jeder Nummer in der AstDB den entsprechenden Channel. Kommt ein Anruf rein, dann siehst Du nach, ob es einen eintrag in der AstDB gibt. Wenn ja, dann wählst Du den entsprechenden eintrag. Bei nein besetzt.

b) Ein anruf kommt rein. Du testest zuerst mit "ChanISAvail", ob man einen channel aufbauen kann:
exten => XXX,1,ChanIsAvail(SIP/${EXTEN}).
Wenn ein solcher Channel aufgebaut werden kann (Account existiert, und Client ist angemeldet), dann geht es einfach in der Liste weiter (dann müsste der Dial-Befehl zum Sip-Client folgen). Wenn nicht, geht es bei Priorität n+1 weiter. Dort könnte man dann mit Capi versuchen, ob es eben ein ISDN-Telefon gibt, was auf die Nummer reagiert. Wenn nicht, dann müsste dem Anrufer eigentlich ein Besetzt-Zeichen vorgespielt werden.
 
Hupe schrieb:
b) Ein anruf kommt rein. Du testest zuerst mit "ChanISAvail", ob man einen channel aufbauen kann:
exten => XXX,1,ChanIsAvail(SIP/${EXTEN}).
Wenn ein solcher Channel aufgebaut werden kann (Account existiert, und Client ist angemeldet), dann geht es einfach in der Liste weiter (dann müsste der Dial-Befehl zum Sip-Client folgen). Wenn nicht, geht es bei Priorität n+1 weiter. Dort könnte man dann mit Capi versuchen, ob es eben ein ISDN-Telefon gibt, was auf die Nummer reagiert. Wenn nicht, dann müsste dem Anrufer eigentlich ein Besetzt-Zeichen vorgespielt werden.

Da man wahrscheinlich nicht besonders gut testen kann, ob es im ISDN ein entsprechendes Telefon gibt, wird das vermutlich zu ner Schleife fuehren, die alle ISDN-Kanaele belegt und dann ein Besetzt generiert. Kann aber natuerlich sein, dass man die ISDN-Anlage so konfigurieren kann, dass sie einen ankommenden Anruf nicht auf der gleichen Leitung zurueckroutet. Dann wuerde es funktionieren.
 
Maik schrieb:
Da man wahrscheinlich nicht besonders gut testen kann, ob es im ISDN ein entsprechendes Telefon gibt, wird das vermutlich zu ner Schleife fuehren, die alle ISDN-Kanaele belegt und dann ein Besetzt generiert. Kann aber natuerlich sein, dass man die ISDN-Anlage so konfigurieren kann, dass sie einen ankommenden Anruf nicht auf der gleichen Leitung zurueckroutet. Dann wuerde es funktionieren.

Gehe mal nicht davon aus, dass irgendeine Schleife entstehen kann (sehe da ehrlich gesagt auchnicht, was Du meinst). Wenn ausgeschlossen wurde, dass ein Sip-Channel aufgebaut werden kann, und eine ISDN-Nummer gewählt wird, die nicht existiert, so würde die Tk-Anlage einfach einen eingehenden Anruf, auf besagter Nummer, über die D-Kanäle signalisieren. So sich kein Telefon, was auf diese Nummer reagiert, zurückmeldet (es können auch mehrere sein), bekommt der Anrufer ein Besetztzeichen. Wo soll das ne Schleife erzeugen? Ich könnte mir nur eine Schleife vorstellen, wenn jemand die interen-ISDN-Nummer von Asterisk anruft. Das sollte man vorher durch entsprechnede Extensions ausschliessen.
 
Wenn ich es richtig verstanden habe, wird ein Block auf den Asterisk-Server geleitet aber es sind wohl nicht alle Rufnummern davon an SIP-Clients vergeben. Folglich wuerden bei deiner Variante Anrufe auf nicht vergebene Nummern an die TK-Anlage zureckgeschickt werden und dann wieder zum * kommen usw. ......

Wenn nur bestimmte Nummern zum * geleitet werden, besteht die Gefahr uebrigens auch, wenn der Client gerade nicht angemeldet ist.
 
Naja, anrufe, die Über den From-ISDN-Kontext (also über die TK-Anlage reinkommen, darf man natürlich nicht so behandeln. Nur die, die im From Sip-Context stehen.
Im from-isdn-context könnte man es so machen:
Testen, ob ein Sip-Channel erzeugt werden kann, und wenn nicht, einfach garnichts tun. Wenn es ein ISDN-Telefon gibt, welches auch auf die gewählte interen Nummer reagiert. Asterisk braucht da ja nichts zu tun.
 
Tag,
erstmal danke für eure Antworten!

ChanIsAvail scheint ganz interessant - für SIP klappts.

Allerdings versucht er auch über SIP rauszugehen, wenn ChanIsAvail eigentlich sagen sollte das es nicht geht...
Hab ich das mit der exten falsch gemacht?

Code:
exten => _XXX,1,Wait(1)
exten => _XXX,2,ChanIsAvail(SIP/${CALLERIDNUM}:${EXTEN},30)
exten => _XXX,3,Dial(SIP/${EXTEN})
exten => _XXX,103,Dial(CAPI/${CALLERIDNUM}:${EXTEN},40)
exten => _XXX,4,Hangup

Mir fällt aber auch grad ein, dass das wirklich nicht so glücklich ist wenn das SIP phone einfach nur nicht an ist.
Dann wird ja trotzdem CAPI probiert, und die Nummer gibts da nicht (bzw zeigt auf den Asterisk, der wieder SIP machen will, was aber dann auch fehlschlägt. Zwar gibts dann IMHO keine Schleife, aber doof ist das trotzdem.

Hupe,
wie ist das denn mit Lösung 1? Da kann ich leider nicht so viel mit anfangen, kannst du mir da noch ein oder zwei Sätze zu sagen?

Danke,
stephan
 
Der sip Channel sieht anders aus, als der Capi-Cahnnel. Das mit dem Caleridnum kannst Du dir klemmen. Und da es sich nicht um einen Dial-Befehl bei ChanIsAvail handelt, brauchst Du auch keinen timeout:
exten => _XXX,2,ChanIsAvail(SIP/${EXTEN})

Asterisk hat einen eigene kleine Datenbank. Wenn Du dort zu jeder einzelne Nummer, die Verfügbar ist den, den entsprechenden Channels speicherst, dann kannst Du durch ne einfache Abfrage elegant wählen. Also so:

Extension -> Datenbankeintrag:
111 => CAPI/${CALLERIDNUM}:${EXTEN}
112 => SIP/${EXTEN}
113 => SIP/${EXTEN}
.....

Dann sollte eigentlich immer der richtge Channel erzeugt werden. Wenn Du mehr über die AstDB wissen willst, dann sieh einfach in der Wiki nach.


PS.: Mit einen ChanIsAvail-Bafrage im from-isdn-Kontext könntest Du schleifen vermeiden:

Code:
[from-ISDN]

exten => _XXX,1,Wait(1)
exten => _XXX,2,ChanIsAvail(SIP/${EXTEN})
exten => _XXX,3,Dial(SIP/${EXTEN})
exten => _XXX,4,Hangup
exten => _XXX,103,Wait(500)
exten => _XXX,104,Hangup
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.