[gelöst] %23 gegen # austauschen; EXTEN-Problem

www.keng.de

Mitglied
Mitglied seit
11 Jan 2006
Beiträge
224
Punkte für Reaktionen
0
Punkte
16
Ein freundliches HALLO zuerst einmal an alle Experten hier!
Ich habe folgendes Problem: Sowohl mein ISDN- als auch VoIP-Provider unterstützen das #-Zeichen in diversen Wählstrings. Z.B. *31#... für Rufnummernunterdrückung oder *121#... etc.. Sowohl mein Grandstream- als auch mein Snom-Telefon senden jedoch anstelle des #-Zeichens "%23", wie ich im SIP-Debug sehen kann. Dummerweise steht das Raute-Zeichen an beliebigen Stellen im Rufnummernstring und ich habe bisher keine Lösung gefunden, wie man %23 in der EXTEN-Variable am Anfang des Dialplans generell ersetzen kann, ohne einen riesigen Dialplan für alle möglichen *#-Codes zu erstellen.

Hat einer der Experten hierzu vielleicht eine Idee oder einen Lösungsansatz?
 
Zuletzt bearbeitet:
Hier mal in Kurzform mit einer Testvariable (test):

Code:
[test]
exten => 15,1,Set(test=01%2387%233)  
exten => 15,2,Set(erg=)
exten => 15,3,Set(IT=-1)
exten => 15,4,Set(add=0)
exten => 15,5,Set(IT=$[${IT} + 1])
exten => 15,6,Set(test1=${test:$[${IT}+${add}]:3})
exten => 15,7,GotoIf($["${test1}" = ""]?8:10)
exten => 15,8,NoOp(${erg})
exten => 15,9,Hangup()
exten => 15,10,GotoIf($[${REGEX("^%23$" ${test1})} = 1]?11:14)
exten => 15,11,Set(erg=${erg}#)
exten => 15,12,Set(add=$[${add}+2])
exten => 15,13,Goto(15)
exten => 15,14,Set(erg=${erg}${test1:0:1})
exten => 15,15,Goto(5)

Binde es mal ein und mach ein auf der Console ein dial 15@test. Im Ergebnis siehst Du die Umwandlung der test-Variable in die Variable erg.
Das ganze kannst Du dann für Deinen Wählstring (also ${EXTEN}) entsprechend nutzen und vor der Wahl ausführen lassen
Viel Erfolg!
 
Vielen Dank, werde ich direkt mal ausprobieren! Hatte mir bis eben so geholfen:
(Raute an 1. bis 3. Stelle der Nummer).

Code:
[grandstreamraute]
exten => _%23.,1,Dial(sip/#${EXTEN:3}@FB_Keng_187910621,60,TW)
exten => _%23.,2,Congestion
exten => _%23.,102,Busy
exten => _*X%23.,1,Dial(sip/${EXTEN:0:2}#${EXTEN:5}@FB_Keng_187910621,60,TW)
exten => _*X%23.,2,Congestion
exten => _*X%23.,102,Busy
exten => _*XX%23.,1,Dial(sip/${EXTEN:0:3}#${EXTEN:6}@FB_Keng_187910621,60,TW)
exten => _*XX%23.,2,Congestion
exten => _*XX%23.,102,Busy
exten => _*XXX%23.,1,Dial(sip/${EXTEN:0:4}#${EXTEN:7}@FB_Keng_187910621,60,TW)
exten => _*XXX%23.,2,Congestion
exten => _*XXX%23.,102,Busy

Es ist aber noch nicht die perfekte Lösung. Es könnte ja auch mehrmals das Raute-Zeichen (also %23) im Dialstring vorkommen. Ich versuche jetzt mal, Deine obige Lösung umzusetzen...
 
Bekommt man denn die Variable "EXTEN" überhaupt geändert? Mit Set habe ich es nicht geschafft. Anschließend steht immer noch derselbe Wert drinn.
 
${EXTEN} ist READ_ONLY.
Das bedeutet: Du speicherst das Ergebnis z.B. wie in meinem Schnipsel in ${erg}, anschließend wählst Du mit

Code:
Dial(SIP/${erg}...

statt mit ${EXTEN}.
 
Ich habe das mal wie folgt versucht:
Code:
[grandstreamraute]
exten => _1.,1,Set(test=${EXTEN})  
exten => _1.,2,Set(erg=)
exten => _1.,3,Set(IT=-1)
exten => _1.,4,Set(add=0)
exten => _1.,5,Set(IT=$[${IT} + 1])
exten => _1.,6,Set(test1=${test:$[${IT}+${add}]:3})
exten => _1.,7,GotoIf($["${test1}" = ""]?8:10)
exten => _1.,8,Dial(sip/${erg}@FB_Keng_187910621,60,TW)
exten => _1.,9,Hangup()
exten => _1.,10,GotoIf($[${REGEX("^%23$" ${test1})} = 1]?11:14)
exten => _1.,11,Set(erg=${erg}#)
exten => _1.,12,Set(add=$[${add}+2])
exten => _1.,13,Goto(15)
exten => _1.,14,Set(erg=${erg}${test1:0:1})
exten => _1.,15,Goto(5)
Wobei ich noch ein bisschen Probleme mit der Syntax habe. Allerdings funktioniert es so auch nicht. Was habe ich falsch gemacht?
 
Wenn Du mit _1. arbeitest, werden auch nur Rufnummern, die mit 1 beginnenm behandelt, wählst Du also irgendetaws anderes als erste Ziffer, funktioniert das nicht.
Sollen alle Anrufe vom Telefon über diesen Kontext laufen, wmpfiehlt sich _X., das trifft auf alle gewählten Nummern zu.
Klappt es trotz dieser Änderungen nicht, poste mal die Ausgabe von asterisk -rvvvv, dann sehen wir weiter.
 
Dank Deines Schnipsels, den ich (z.B. beim Befehl REGEX, der bei mir zuerst nicht ging) noch etwas angepasst habe, ist das Problem gelöst:
Code:
[grandstreamraute]
exten => _[*%]X.,1,Set(extenneu=${EXTEN})
exten => _[*%]X.,2,Set(erg=)
exten => _[*%]X.,3,Set(IT=-1)
exten => _[*%]X.,4,Set(IT=$[${IT}+1])
exten => _[*%]X.,5,Set(dreidig=${extenneu:$[${IT}]:3})
exten => _[*%]X.,6,GotoIf($["${dreidig}"=""]?7:9)
exten => _[*%]X.,7,Dial(sip/${erg}@FB_Keng_187910621,60,TW)
exten => _[*%]X.,8,Hangup()
exten => _[*%]X.,9,GotoIf($[${REGEX("%23" ${dreidig})}=1]?10:13)
exten => _[*%]X.,10,Set(erg=${erg}#)
exten => _[*%]X.,11,Set(IT=$[${IT}+2])
exten => _[*%]X.,12,Goto(4)
exten => _[*%]X.,13,Set(erg=${erg}${dreidig:0:1})
exten => _[*%]X.,14,Goto(4)
_[*%]X. sorgt dafür, dass dieser Context nur aufgerufen wird, wenn ein String mit * und einer Ziffer oder mit % und einer Ziffer beginnt. Auf die Variable "add" konnte ich verzichten, da die Variable "IT" entsprechend aufaddiert genügt. Die anderen Variablen hatte ich zu meinem besseren Verständnis umbenannt. Ich finde es eine sehr schöne Lösung und bedanke mich recht herzlich hierfür!!!! :groesste:
 
Bitte gern geschehen ;)
Deine Verkürzung ist vollkommen korrekt, ich hatte die Variablen bewußt "feinstmöglich" aufgeteilt, da ich annahm, dass sich dann die Logik besser erschließt. "Zusammendampfen" kann man natürlich immer ...
 
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.