Problem: CIDName auslesen

Guard-X

Aktives Mitglied
Mitglied seit
14 Mai 2005
Beiträge
2,497
Punkte für Reaktionen
0
Punkte
36
Hallo,

normalerweise lese ich CIDNamen bei eingehenden Gesprächen z.B. so aus der Asterisk DB aus:

exten => _94X./_ZX.,1,Noop(${CALLERIDNUM})
exten => _94X./_ZX.,2,DBGet(name=cidname_area04/${CALLERIDNUM})
exten => _94X./_ZX.,3,SetCIDName(${name})
exten => _94X./_ZX.,4,Goto(area04,${EXTEN:2},1)

Funktioniert auch alles wunderbar. Jetzt möchte ich folgendes realisieren:
Anruf kommt in folgendem Kontext an und nur bei diesen Nummern soll der Name aus der Datenbank gelesen werden. Also Ruf auf 111, Lookup CIDName, Sprung auf exten => 111,.......

Natürlich kann ich bei jeder Nummer so etwas wie oben davorsetzen, jodoch habe über 100 Extension zur Zeit in der Liste stehen. Der CIDName soll auch nur ausgelesen werden, wenn die Anrufer mit /_9Z in dem Kontext landen und noch keinen CIDNamen haben!!!

[Kontext]
exten => 111,hint,SIP/92111
exten => 111,1,Dial(SIP/92111,60)
exten => 111,2,Hangup

exten => 222,hint,SIP/92222
exten => 222,1,Dial(SIP/92222,60)
exten => 222,2,Hangup

exten => 333,hint,SIP/92333
exten => 333,1,Dial(SIP/92333,60)
exten => 333,2,Hangup

Vielleicht habt ihr ja einen Vorschlag, Danke im voraus...

mfg Guard-X
 
Frage warum arbeitest Du überhaupt mit einem Goto ?
Code:
exten => _94X./_ZX.,1,Noop(${CALLERIDNUM})
exten => _94X./_ZX.,2,DBGet(name=cidname_area04/${CALLERIDNUM})
exten => _94X./_ZX.,3,SetCIDName(${name})
;exten => _94X./_ZX.,4,Goto(area04,${EXTEN:2},1) 
exten => _94X./_ZX.,4,hint,SIP/92${EXTEN:2}
exten => _94X./_ZX.,5,Dial,SIP/92${EXTEN:2}|60
exten => _94X./_ZX.,6,HangUp

würde das gleiche tun und wäre für beliebig viele extensions gültig. Den [KONTEXT] brauchst Du dann gar nicht mehr.

Die Abfrage ob jemand schon einen CIDName hat, kannst Du einfach mit einem Vergleich machen. Und die Datenbankabfrage machst Du nur, wenn es keinen CIDName gibt.
 
Hi Beta,

die "_94X." mit dem dazugehörigen Goto area04 ist nur zur Standortbestimmung da (mehrere SIP-Gateways). Davon gibt es noch 10 andere.

Eigentlich heißt der [Kontext] "area04", so ist es vielleicht besser zu verstehen. wenn z.B. die "_91X." kommt wird in den Kontext area05 gesprungen usw.

Die normalen Anrufer, also alle "nicht ISDN-Nummern" kommen natürlich direkt in dem Kontext an. Also wird ganz normal z.B. die 111 gerufen. Und da muß der Name ausgelesen werden.

Und wie sieht es jetzt aus?
 
Erstens heißt ich nicht "Beta" ...

und ich verstehe nicht so ganz, was Du genau vorhast. Vielleicht kannst Du mal einen "Logikplan" Deiner Anrufverteilung erstellen, mit Beispielen wer von wo anrufend nach wohin geschickt werden soll.

Wahrscheinlich wird das Ganze auf einen Macro rauslaufen. Aber man schreibt doch nicht für 100 extensions 100 mal den gleichen Käse in den Dialplan, der sich nur anhand der extension selbst unterscheidet.

Wie gesagt - wahrscheinlich sehr einfach lösbar, wenn man mal genau wüßte, was Du möchtest.
 
Hi beta"teilchen" ;-)

Also erstmal vorweg, die extensions sind natürlich nur ein Beispiel. Fast jede extension sieht anders aus. Fakt ist: jede extension hat 3 Stellen.

Anruf über SIP gelangt irgendwie in den Kontext, egal wie. Der Anrufer hat z.B. xxx gewählt. Jetzt wird die Nummer vom Anrufer aus der Datenbank gelesen und die exten => 111,4.... ausgeführt. Mehr nicht. Alles andere tut nichts zur Sache. Bei 222, 333 das Gleiche.

Ich könnte folgendes machen:
exten => 111,hint,SIP/92111
exten => 111,1,Noop(${CALLERIDNUM})
exten => 111,2,DBGet(name=cidname_area04/${CALLERIDNUM})
exten => 111,3,SetCIDName(${name})
exten => 111,4,Dial(SIP/92111,60)
exten => 111,5,Hangup

Wenn ein SIP-Teilnehmer anruft, soll natürlich nichts ausgelesen werden.

Wenn ich das für alle extensions machen müsste, wäre das ein Riesen Aufwand.
 
Also erstmal vorweg, die extensions sind natürlich nur ein Beispiel.
Alles andere tut nichts zur Sache.

Mit solch höchst genauen Problembeschreibungen bleibt Dir eigentlich nur, eine

kugel.jpg


zu befragen. Qualifizierte Antworten sind bei solch unqualifizierter Fragestellung nahezu unmöglich zu geben.
 
Ok, ich verkürze die Fragestellung noch weiter...

exten => 111,hint,SIP/92111
exten => 111,1,Noop(${CALLERIDNUM})
exten => 111,2,DBGet(name=cidname_area04/${CALLERIDNUM})
exten => 111,3,SetCIDName(${name})
exten => 111,4,Dial(SIP/92111,60)
exten => 111,5,Hangup

Wie kann ich diesen Konstrukt auf möglichst viele extensions erweitern,
z.B für exten => 111 und 222. Ich möchte nicht jedesmal alles wiederholen.
 
Mach einen Makro draus.
 
Wegen der hohen Nachfrage, hier das Macro mit 2 DB Tabellen für interne und extern Nummern. Funktioniert soweit alles.

exten => 111,hint,SIP/94111
exten => 111,1,Macro(cidname_lookup)
exten => 111,2,Dial(SIP/94111,60)
exten => 111,3,Hangup

[macro-cidname_lookup]
exten => s/_0X.,1,Noop(${CALLERIDNUM})
exten => s/_0X.,2,DBGet(name=cidname/${CALLERIDNUM})
exten => s/_0X.,3,SetCIDName(${name})
exten => s/_ZX.,1,Noop(${CALLERIDNUM})
exten => s/_ZX.,2,DBGet(name=cidname_area04/${CALLERIDNUM})
exten => s/_ZX.,3,SetCIDName(${name})

So, jetzt noch das letzte Problem: Falls der Anrufer schon einen Namen mitsendet (sip.conf -> callerid="xxx" <222>) wird natürlich nur die Nummer angezeigt. @betateilchen: du sprachst von einem Vergleich, kannst du das bitte näher erörtern?

Danke im voraus...
 
Du kannst mit GotoIf() einen Vergleich durchführen und entsprechend dem Ergebnis in Deinem Dialplan verzweigen.

Das sieht zum Beispiel so aus:

exten => s,108,GotoIf($[${status} > 8]?191)

Hier wird geprüft, ob in der Variablen ${status} ein Wert größer als 8 steht, wenn ja, geht es bei exten 191 weiter, ansonsten ganz normal bei 109.

Du müßtest jetzt einfach mal rausfinden, was in der CallerID steht, wenn KEIN Name gesetzt ist, und dann einen entsprechenden Vergleich basteln.
 
Hi betateilchen,

ich habe noch einmal alles miteinander kombiniert, die internen Gespräche sind jetzt außen vor. Extern wird der Name aufgelöst, intern wird die SIP callerid benutzt.

exten => _94X.,1,Macro(cidname_area04)
exten => _94X.,2,Goto(area04,${EXTEN:2},1)

[macro-cidname_area04]
exten => s,1,Noop(${CALLERIDNUM})
exten => s,2,DBGet(name=cidname_internal/94${CALLERIDNUM})
exten => s,3,SetCIDName(${name})
exten => s/_0X.,1,Noop(${CALLERIDNUM})
exten => s/_0X.,2,DBGet(name=cidname_external/${CALLERIDNUM})
exten => s/_0X.,3,SetCIDName(${name})

Jetzt noch ein klitzekleines Problem: Wenn ein Anrufer die Nummer unterdrückt hat, steht "asterisk" im Display. Wo könnte das noch wegkommen?
 
@betateilchen

So, funktioniert jetzt alles.

Deine Abfrage auf die interne Datenbank gibt es übrigens auch als "fertige" Funktion standardmäßig im Asterisk: http://voip-info.org/tiki-index.php?page=Asterisk+cmd+LookupCIDName

So einfach geht das natürlich nicht bei mir. Ich arbeite bei jedem Standort mit 3-stelligen Nebenstellen. Da es jedoch diese Nummern an allen Standorten gibt, nutze ich Kennzahlen. Die stehen in der Asterisk Datenbank z.B. so drin (Bsp. 100): 92100, 93100, 94-00 usw. Damit kann ich die Nummern unterscheiden. Als CIDName kommt nur der 3-stelligen Name rein. Wird z.B. mit diesem Eintrag angepasst "94${CALLERIDNUM})" und dann ausgewertet. Dies darf natürlich nicht mit externen Nummern passieren!

Jetzt noch das zweite Problem:
Wenn ein Anrufer die Nummer unterdrückt, kannst Du doch die ID auf "leer" abfragen. Das sollte Dir weiterhelfen.

Die ID war halt eigentlich nie "leer", sondern es steht "anonymous" drin. Dieses liefern die ISDN/SIP Gateways. Danach habe ich jetzt abgefragt. Diese Anrufe werden an der Namens-Abfrage vorbeigeleitet und der CIDName duch "unbekannt" ersetzt.

Trotzdem danke für deine Hilfe!

mfg Guard-X
 
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.