.titleBar { margin-bottom: 5px!important; }

Wenn Nummer als SIP existiert -> SIP, ansonsten CAPI

Dieses Thema im Forum "Asterisk Rufnummernplan" wurde erstellt von sted, 16 Aug. 2005.

  1. sted

    sted Neuer User

    Registriert seit:
    21 Apr. 2005
    Beiträge:
    94
    Zustimmungen:
    0
    Punkte für Erfolge:
    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
     
  2. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  3. Maik

    Maik Gesperrt

    Registriert seit:
    1 Apr. 2004
    Beiträge:
    1,778
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  4. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  5. Maik

    Maik Gesperrt

    Registriert seit:
    1 Apr. 2004
    Beiträge:
    1,778
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  6. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  7. sted

    sted Neuer User

    Registriert seit:
    21 Apr. 2005
    Beiträge:
    94
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  8. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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