Zielrufnummer eines abgehenden Anrufs ändern

Hallo zusammen,

ich würde gerne für einen speziellen Teilnehmer (Türsprechstelle an Patton) die von der Türsprechtselle gewählte Rufnummer ändern.

Die Türsprechstelle wählt 3122232224, als Ziel soll jedoch eine interne Nummer der Mobydivk gerufen werden.

Da es ja ein interner Anruf ist, kommen die ausgehenden Regln am Amt ja nicht in Frage, so dass ich mir mit einem Skript helfen würde, doch was muss in das Skript.

BTW:
Gibt es irgendwo eine gute und allgemein gehaltene Doku / Anleitung zur Skripterstellung oder ein gar ein kostenpflichtiges Buch?

Ich habe mir einige Skripte angesehen, verstehe aber viele Dinge nicht, weil ich weder die verfügbaren Variablen als Referenzbgefunden habe noch wie, wo und wann die Skripte greifen und welche internen Funktionsaufrufe wie beispielsweise answer() etc. möglich sind.

Dank und Gruß
Michael

Hallo Michael,

in der Regel lassen sich die Türsprechstellen (meist via DTMF) konfigurieren, so dass die gewählte Nummer hier bestimmt werden kann. Ein anderer Versuch für deinen Anwendungsfall wäre eine Kurzwahlnummer, wobei ich mir hier nicht sicher bin ob * als Nummernbestandteil zulässig ist.

Das genau Skript kann ich dir hier leider nicht liefern, aber ein paar Anlaufstellen:
In der alten 7.12. Doku (PDF) findest du Informationen zum sub_pre-main Skript, welches bei jedem Call durchlaufen wird (5.5 Anrufablauf per Skript manipulieren, Seite 256 von 384). Die von uns verwendet Variablen findest du dort auch (6.5.3 MobyDick-Variablen, Seite 379 von 384). Das wandert natürlich alles nach und nach noch in das aktuelle Wiki.

Wirklich gute Asterisk Scripting Tutorials habe ich leider nicht gefunden, hier habe ich dankbarer weise sehr erfahrene Kollegen. Wenn du aber mit der Syntax an sich keine Probleme hast, kannst du in der Asterisk Wiki nach den einzelnen Applications suchen: https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+Command+Reference.

Im Groben müsstenst du im sub_pre-main dann prüfen ob die CALLERID(num) die Türsprechstelle ist und falls ja mittels goto main,{Wunschdurchwahl},1 auf das eigentlich gewollte Ziel abwerfen, ansonsten via Return() wieder zurück zum regulären Dialplanablauf gehen (wichtig!). Da das sub_pre-main wie gesagt immer ausgeführt wird, würde ich zunächst in einer community-vm testen.

Grüße,
Steve

Hallo Steve,

das habe ich in verschiedenen Konstellationen probiert. Aber es scheint so, als ob man sich dann automatisch eine Loop baut, da sub_pre_main ja immer aufgerufen wird, selbst wenn ich den Anruf dann mit Goto(main,{neues Ziel},1) abwerfe.

Ich gehe in meinem Skript davon aus, dass die Rufnummer “56” gewählt wird.

Im Moment sieht das so aus (die NoOps nur, damit ich ein wenig debuggen kann in der Console):


exten => s,1,Verbose(Rewrite Destinaton by MH)
same => n,NoOp(${HKN_TFS})
same => n,NoOp(${MDC_CALLEE_NUM})
same => n,NoOp(${DIALEDPEERNUMBER})
same => n,GoToIf($ "${MDC_CALLEE_NUM}" = "56" ] & $ "${HKN_TFS}" = "" ]?mod:ret)
same => n(mod),NoOp(${HKN_TFS})
same => n,Set(_HKN_TFS=1)
same => n,NoOp(${HKN_TFS})
same => n,GoTo(main,55,1)
same => n(ret),Return()

Um einen Loop zu verhindern, war mein Gedanke, dass ich mir in meiner Variablen HKN_TFS merke, ob das Skript bereits einmal aufgerufen wurde -> HKN_TFS=1 und so beim nächsten Aufruf die Bedingung falsch ist und das Skript verlassen wird.
Es ist mir jedoch nicht gelungen, einen Loop zu unterbinden. Vermutlich stimmt mit meiner logischen Verknüpfung in GoToIf(…) etwas nicht. Aufgefallen ist mir auch, dass MDC_CALLEE_NUM nicht neu gesetzt wird nach GoTo(main,55,1). Sollte in dem Fall ja dann eingentlich von “56” auf “55” geändert werden, oder verstehe ich da was falsch.

BTW: Klar kann ich die Türsprechstelle ändern, habe ich ja selbst eingebaut. Aber so ist die Umstellung einfacher, weil ich nur noch Kabel neu patchen müsste und zudem sind mir aus anderen TK-Systemen Funktionen bekannt, die sich “Baby- oder Seniorenruf” nennen und bei denen egal welche Nummer gewählt wird, immer ein festes Ziel gerufen wird. Das könnte ich mit einem solchen Skript dann auch gleich erschlagen - wenn es denn mal funktioniert …

Gruß
Michael

Guten Morgen Michael,

vermutlich muss mann mittels _$ oder __$ die Variable mehr “globalisieren”, aber hier bin ich auch nur eher Leihe. Was aber funktionieren sollte, ist das du anstelle deiner Variable “${EXTEN}” != “55” abprüfst. Alternativ müsste man im Dialplan spicken wie die Labels gesetzt werden, die bleiben als Channelvariablen ja auch den kompletten Dialplan existent. Sollte es mit ${EXTEN} nicht hinhauen (evtl auch ${EXT} kann man sich mit DumpChan() auch die Channelvariablen (in der CLI) ausgeben lassen.

Grüße,
Steve

Hallo Steve,

DumChan() hat Licht ins Dunkel gebracht. Es ist so, dass ${MDC_DIALCALLEENUM} immer das aktuell Ziel beinhaltet und ${MDC_CALLEE_NUM} offenbar die ursprünglich gewählte Nummer behält, sich also auch dann nicht ändert, wenn das sub_pre-main-Skript wieder verlassen wird über GoTo(main,NEUE-ZIELRUFNUMMER,1).

Somit sieht das funktionierende Skript nun so aus:


exten => s,1,Verbose(Rewrite Destinaton by MH)
same => n,GoToIf($ "${MDC_DIALCALLEENUM}" = "56*2223*2224" ]?mod:ret)
;same => n(mod),DumpChan()
same => n(mod),GoTo(main,55,1)
same => n(ret),Return()

Damit kann ich dann prima die urspünglich gewählte Nummer “manipulieren” und eine andere Zielrufnummer setzen.

Vielen Dank für die passenden Hinweise.

Lieben Gruß
Michael

1 Like

I have looked at some scripts, but I do not understand many things because I have neither the available variables as reference books nor how,university assignment writing Where and when the scripts are accessed and which internal function calls, such as answer () etc., are possible.