Problem mit Variablen für ein GotoIf

MET

Mitglied
Mitglied seit
27 Okt 2004
Beiträge
682
Punkte für Reaktionen
0
Punkte
16
Bin dabei eine Anrufweierleitung einzurichten. Aktivierung und Deaktivierung funktionieren. Der GotoIf-Befehl hingegen, der auf die Weiterleitung verzweigen sollte, funktioniert noch nicht.

Mit der Aktivierung (mit Nr. 900) sollen Anrufe für die Extension ABC auf die Nummer 00112223334444 weitergeleitet werden. Dafür wird eine Variable definiert. Die CLI zeigt:
Code:
vs8709*CLI>
    -- Executing [90000112223334444@app30:1] Answer("SIP/ABC-0000057a", "") in new stack
    -- Executing [90000112223334444@app30:2] Set("SIP/ABC-0000057a", "DB(CF/30)=00112223334444") in new stack
    -- Executing [90000112223334444@app30:3] SayDigits("SIP/ABC-0000057a", "00112223334444") in new stack
    -- <SIP/ABC-0000057a> Playing 'digits/0' (language 'en')
....etc.

Eingehende Anrufe von einem Provider werden an einen Makro "ruf" weitergeleitet:
Code:
exten => sipcall1,1,macro,ruf|SIP|ABC

Im Makro "ruf" wird als erstes überprüft, ob eine Weiterleitung besteht oder nicht. Dies erfolgt in einem weiteren Makro "callforwarding":
Code:
[macro-ruf]
exten => s,1,NoOp(Wir sind im Macro ruf gelandet)
exten => s,n,macro,callforwarding|${EXTEN}
exten => s,n,Dial,${ARG1}/${ARG2}|43|r
exten => s,n,Goto,s-${DIALSTATUS}|1
.... etc.
Hier bahnt sich das Problem an. Die an Makro "callforwarding" übergebene Variable scheint nicht richtig zu sein; ${ARG1} anstelle von ${EXTEN}ändert nichts. Der im Makro "callforwarding" befindliche GotoIf-Befehl verzweigt dann immer auf nocfi:
Code:
[macro-callforwarding]
exten => s,1,Set(temp=${DB(CFI/${ARG1})})
exten => s,n,GotoIf(${temp}?cfi:nocfi)
exten => s,n(cfi),Dial(SIP/${temp}@Mein-Provider-für-Weiterleitung)
exten => s,n(nocfi),NoOp

Nachträgliche Anmerkung: Habe folgende 3 Varianten geprüft:
exten => s,n,macro,callforwarding|${EXTEN}
exten => s,n,macro,callforwarding|${ARG1}
exten => s,n,macro,callforwarding|${ARG2}
aber alle liefern, entsprechend dem Provider über den der weiterzuleitende Anruf rein kommt z.B: "SIP/Netvoip2_in-000.."

Was ist hier zu ändern, dass es mit den Variablen richtig funktioniert?
 
Zuletzt bearbeitet:
Hallo kombjuder
Bisher hatte ich in meinem Asterik diesen GotoIf Befehl noch nie gebraucht. Vergleich scheint nicht korrekt zu sein, ist wohl eher eine Bedingung für eine Verzweigung.

Es ist mir übrigens erst im Nachhinein aufgefallen, dass ich die Angaben zu viel anonymisiert hatte, vermutlich bis zur Unkenntlichkeit. In der Zwischenzeit habe ich es zum Funktionieren gebracht. Das Problem hatte wohl damit zu tun, dass der Kontext einer Extension aus Sicherheitsgründen nicht (mehr) rein numerisch ist, bspw. also [30a] anstatt [30]. Ich versuche im Moment zu verstehen was vorher fälschlicherweise passierte und weshalb es jetzt mit der vorgenommenen Änderung geht. Vielleicht kann mir jemand anhand der nachfolgenden CLI-Auszüge erklären weshalb im 1. Fall (falsch) "temp=" undefiniert ist und im 2. Fall (richtig) temp richtigerweise die Nummer enthält an die der Anruf weiterzuleiten ist.

Hinweis:
Angerufene Nummer ist 0999999999
Nummer an die weiterzuleiten wäre: 00112223334444

1. Fall (falsch):
Jede dieser 3 Varianten (im Makro "ruf"):
exten => s,n,macro,callforwarding|${EXTEN}
exten => s,n,macro,callforwarding|${ARG1}
exten => s,n,macro,callforwarding|${ARG2}

und im Makro "callforwarding":
exten => s,1,Set(temp=${DB(CFI/${ARG1})})
führt zu "temp=",

hier was die CLI mit der 2. Variante anzeigt:
Code:
vs8709*CLI>
    -- Executing [0999999999@incoming:1] Macro("SIP/30_netvoip2_in-00000595", "ruf|SIP|30a") in new stack
    -- Executing [s@macro-ruf:1] NoOp("SIP/30_netvoip2_in-00000595", "Wir sind im Macro ruf gelandet") in new stack
    -- Executing [s@macro-ruf:2] Macro("SIP/30_netvoip2_in-00000595", "callforwarding|30a") in new stack
    -- Executing [s@macro-callforwarding:1] Set("SIP/30_netvoip2_in-00000595", [COLOR="Red"]"temp="[/COLOR]) in new stack
    -- Executing [s@macro-callforwarding:2] GotoIf("SIP/30_netvoip2_in-00000595", "?cfi:nocfi") in new stack
    -- Goto (macro-callforwarding,s,4)
    -- Executing [s@macro-callforwarding:4] NoOp("SIP/30_netvoip2_in-00000595", "") in new stack
    -- Executing [s@macro-ruf:3] Dial("SIP/30_netvoip2_in-00000595", "SIP/30a|43|r") in new stack
    -- Called 30a
    -- SIP/30a-00000596 is ringing
  == Spawn extension (macro-ruf, s, 3) exited non-zero on 'SIP/30_netvoip2_in-00000595' in macro 'ruf'
  == Spawn extension (incoming, 0999999999, 1) exited non-zero on 'SIP/30_netvoip2_in-00000595'
vs8709*CLI>

2. Fall (richtig):
Im Makro "ruf" wird der Makro callforwarding so aufgerufen:
exten => s,n,macro,callforwarding|${ARG1}

und im Makro "callforwarding":
exten => s,1,Set(temp=${DB(CFI/${ARG1:0:2})})

führt zu dieser CLI-Ausgabe:
Code:
vs8709*CLI>
    -- Executing [0999999999@incoming:1] Macro("SIP/30_netvoip2_in-00000590", "ruf|SIP|30a") in new stack
    -- Executing [s@macro-ruf:1] NoOp("SIP/30_netvoip2_in-00000590", "Wir sind im Macro ruf gelandet") in new stack
    -- Executing [s@macro-ruf:2] Macro("SIP/30_netvoip2_in-00000590", "callforwarding|30a") in new stack
    -- Executing [s@macro-callforwarding:1] Set("SIP/30_netvoip2_in-00000590", [COLOR="Red"]"temp=00112223334444"[/COLOR]) in new stack
    -- Executing [s@macro-callforwarding:2] GotoIf("SIP/30_netvoip2_in-00000590", "00112223334444?cfi:nocfi") in new stack
    -- Goto (macro-callforwarding,s,3)
    -- Executing [s@macro-callforwarding:3] Dial("SIP/30_netvoip2_in-00000590", "SIP/00112223334444@30_intervoip1") in new stack
    -- Called 00112223334444@30_intervoip1
    -- SIP/30_intervoip1-00000591 is making progress passing it to SIP/30_netvoip2_in-00000590
  == Spawn extension (macro-callforwarding, s, 3) exited non-zero on 'SIP/30_netvoip2_in-00000590' in macro 'callforwarding'
  == Spawn extension (macro-ruf, s, 2) exited non-zero on 'SIP/30_netvoip2_in-00000590' in macro 'ruf'
  == Spawn extension (incoming, 0999999999, 1) exited non-zero on 'SIP/30_netvoip2_in-00000590'
vs8709*CLI>
Aus diesen CLI-Auszügen kann man erkennen, dass ich die Provider für Extension 30 mit 30_Provider bezeichne, also bspw. 30_netvoip2 oder 30_intervoip1 etc. Meine Absicht war nun mit ${ARG1:0:2} die Extension für die der Anruf bestimmt ist aus dem Provider zu entnehmen. Das Ergebnis funktioniert, aber ich bin mir nicht sicher, ob meine Überlegungen richtig sind und, ob dies nicht anders, einfacher möglich ist.
 
Zuletzt bearbeitet:
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.