Macro Ersatz

Mansaylon

Neuer User
Mitglied seit
7 Mai 2007
Beiträge
158
Punkte für Reaktionen
1
Punkte
18
Hallo Zusammen

Irgendwo wurde mir mal gesagt (finde es nicht mehr), dass man Macros nicht mehr einsetzen solle und dafür Gosub Routinen verwenden soll.

Da ich an einem neuen Asterisk 13.x am aufsetzen bin, wollte ich mich nochmals vergewissern, dass diese Aussage auch wirklich stimmt.
Wenn ja, wo findet man gute Beispiele für Gosub Routinen? Über die Verwendung von Macros findet man unzählige Beispiele und Beschreibungen. ;)
Und ja... ich habe die Suche verwendet.... aber eben nichts wirklich brauchbares gefunden oder übersehen.
 
Danke... über die beiden Links bin ich sebstverständlich auch schon gestolpert ;)
Aber so richtig den Durchblick habe ich da nicht.
Irgendwie fand ich die Macro() Funktion einfacher.... oder man hat bei den Macros eben einfach mehr Beispiele und nicht nur so trockene Beschreibungen zur Verfügung.

Vielleicht mal ein Beispiel mit Macro, was ich nun neu mit Gosub realisieren möchte:
Code:
;Eingehender Anruf
exten => 4144*******,1,Macro(anruf,SIP/201&SIP/202&SIP/206,200,0,firma)

[macro-anruf]
exten => s,1,NoOp(Caller-ID: ${CALLERID(num)})
exten => s,n,GotoIf($["${SHELL(cat /etc/asterisk/black.list | grep ${CALLERID(num)})}" = ""]?GO_ON:GO_OUT)
exten => s,n(GO_OUT),TrySystem(echo $(date)'von:${CALLERID(all)} an:${ARG4}' >> /var/log/asterisk/black.log)
exten => s,n,System( echo $(date) 'von:${CALLERID(all)} an:${ARG4}' | mailx -s 'Blacklist Anrufversuch' [email protected])
exten => s,n,Hangup()
exten => s,n(GO_ON),GotoIf($["${CALLERID(num)}" = "Anonymous"]?CHECK2:OK)
exten => s,n,GotoIf($["${CALLERID(num)}" = "076***."]?CHECK2:OK)
exten => s,n(CHECK2),GotoIf($["${ARG3}" = "1"]?s-NOANSWER,1)
exten => s,n(OK),Dial(${ARG1},20,Ttr)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,VoiceMail(${ARG2},u)
exten => s-BUSY,1,VoiceMail(${ARG2},b)
exten => s-ANSWER,1,Hangup()
exten => _s-.,1,Goto(s-NOANSWER,1)
 
Zuletzt bearbeitet:
Wahrscheinlich war ich es, die auf die deprecation von Macro hingewiesen hat :doktor:

Gosub funktioniert im Prinzip genau so wie Macro, selbst der Aufruf und die Verwendung von Parametern ist fast gleich. Lediglich wie koy schon richtig angemerkt hat muss überall dort, wo Du zurück an den Ausgangspunkt willst, ein Return() stehen.

https://wiki.asterisk.org/wiki/display/AST/GoSub

Dein Beispiel lässt sich daher ganz einfach umschreiben:

Code:
exten => 4144*******,1,[COLOR=#ff0000]Gosub[/COLOR](anruf[COLOR=#ff0000],s,1[B]([/B][/COLOR]SIP/201&SIP/202&SIP/206,200,0,firma[B][COLOR=#ff0000])[/COLOR][/B])
 ...

[COLOR=#ff0000][anruf][/COLOR]
exten => s,1,NoOp(Caller-ID: ${CALLERID(num)})
 ...
 same => n,Return()

Oder mit Label statt getrenntem Context

Code:
exten => 4144*******,1,[COLOR=#ff0000]Gosub[/COLOR](anruf[COLOR=#ff0000][B]([/B][/COLOR]SIP/201&SIP/202&SIP/206,200,0,firma[B][COLOR=#ff0000])[/COLOR][/B])
 ...

[COLOR=#ff0000] same => n(anruf)[/COLOR],NoOp(Caller-ID: ${CALLERID(num)})
 ...
 same => n,Return()

Die neuen Funktionen wie Hangup Handler oder Predial Hooks arbeiten alle mit Gosub, deshalb finde ich es sinnvoll, auch anderweitig Gosub für Routinen zu verwenden, selbst wenn Macro immer noch funktioniert obwohl es schon lange als deprecated gilt.
 
Super..... genau das suchte ich. Danke für das Beispiel.
Wie Du sagst.... es ist 'fast gleich' wie der Macro-Befehl... und genau um die kleinigkeit 'fast', kann es dann eben sein, dass man verzweifelt. ;-)

Aber das bringt mich nun wirklich weiter.

Wobei ein Return() nach einem Hangup() auch entfallen kann ?!?

Nochmals eine kurze Frage zum Gosub, resp. zum Return.
Code:
[subAnruf]
exten => s,1,NoOp(Caller-ID: ${CALLERID(num)})
same => n,Dial(${ARG1},10,Ttr)
same => n,Gosubif(${ARG2}=50?go50)
same => n,Hangup()
same => n(go50),NoOp("***** auf 50er *****")
same => n,[B](go50)[/B]Return()
same => n(go51),NoOp("***** auf 51er *****")
same => n,[B](go51)[/B]Return()

Braucht es beim Return auch die Zugehörigkeit (hier go50 und go51) oder reicht es jeweils n,Return()?
 
Moins

Nee/Ja, weil du den Rückgabewert (go50, go51) im Aufrufenden Kontext aus der Variable ${GOSUB_RETVAL} auszuwerten hast.
...normalerweise sollte da nur 0/1 geliefert werden...
0 = hat geklappt, alles gut
1 = irgendwas hat nicht hingehauen :gruebel:

:rolleyes:

Nach einem Dial() kann dies ja im Gosub-Kontext anhand von ${DIALSTATUS} entschieden werden, ob 0 oder 1.
 
Zuletzt bearbeitet:
n,(go50)Return() ist syntaktisch falsch, ein Label wird immer direkt nach dem n geschrieben, wie bei Deinen n(go50),Noop. Das Label dienst als Sprungmarke, die unabhängig von der Priorität sozusagen namentlich angesprungen werden kann, weil man bei n ja die tatsächliche Priorität nicht kennt. Deshalb muss es eindeutig sein und muss/darf in den folgenden Zeilen nicht mehr wiederholt werden, same=>n,Return() ist somit richtig.

Ich würde auf jeden Fall immer ein Return dahinter schreiben, auch nach einem Hangup, auf die eine Zeile kommts ja wohl nicht an ;-)

koy, mit Rückgabewerten hat das gar nichts zu tun, ein solcher müsste in den Klammern nach dem Return stehen, und kann (Predial-Hooks ausgenommen) beliebige Werte haben.
 
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.