Voicebox per Anruf an- und ausschalten

ltrotzki

Neuer User
Mitglied seit
22 Okt 2015
Beiträge
25
Punkte für Reaktionen
0
Punkte
0
Usecase: Anrufbeantworter soll für alle eingehenden Nummern eingeschaltet werden, wenn Anruf an eine bestimmte interne Nummer erfolgt (+ Pin eingeben?) bzw. wieder abegschaltet werden.
Ich würde es mit einer globalen Variable lösen. Ist das sinnvoll oder geht es vielleicht sogar einfacher?
Pseudocode Dialplan:
Code:
[globals]
VOICEBOX=OFF

[phones]
exten => 201,1,IF VOICEBOX == ON VoiceMail(600) ELSE Dial(SIP/phn02)

;voicebox number
exten => 666,1, AUTH("check for valid PIN")
same => n,Set(GLOBAL(VOICEBOX)=ON)
same => n,Play("voicebox on")

exten => 667,1, AUTH("check for valid PIN")
same => n,Set(GLOBAL(VOICEBOX)=OFF)
same => n,Play("voicebox off")
 
Grundsätzlich geht das so, allerdings hättest Du mit der Lösung ggf. Probleme bei einem reload/restart des Asterisk.

Alternativ kann man es etwa über die Asterisk-DB lösen ( Set(DB(VOICEBOX/GLOBAL)=[On|Off]) bzw. if $[${DB(VOICEBOX/GLOBAL)} = On] ). Eine weitere Variante wäre die Nutzung einer externen Datenbank (falls man die ohnehin schon für Realtime oder CDRs verwedet. Bei diesen Ansätzen hast Du das Problem mit dem reload/restart nicht.

Viele Wege führen zum Ziel ...
 
Gute Eingabe. Da ich (noch) im T-Com Netz hinter einer dynamischen IP und NAT hänge, muss ich Asterisk kurioserweise nach jeder netzseitigen Trennung neustarten (cronjob erkennt IP Veränderung)
Dazu habe ich das hier gefunden:
http://www.voip-info.org/wiki/view/Asterisk+cmd+SetGlobalVar

; If clearglobalvars is not set, then global variables will persist
; through reloads, and even if deleted from the extensions.conf or
; one if its included files, will remain set to the previous value.
;
clearglobalvars=no

Dann müsste die Variable doch ein Neustart überleben?!
Alternativ: Die DB wird automatisch angelegt, wenn ich Set(DB(VOICEBOX/GLOBAL)=[On|Off]) aufrufe?
 
Theoretisch klappt das mit clearglobalvars=no, ist aber nicht sehr schlau: Spätestens, wenn Du auch globale Variablen hättest, die bei Neustart dediziert zurückgesetzt werden sollen, hast Du ein Problem ...

Die Asterisk-DB selbst ist von vornherein da. Der Wert, den Du abfragen willst, muß aber naturgemäß initialissiert werden. Das geht auch per cli mit database set VOICEBOX GLOBAL Off
 
Okay, dann nutze ich die DB.
Noch ein wenig Input zur Authentifizierung. Ich möchte nicht, dass jeder im "Telefonnetz" den AB de/aktiviert:
Code:
exten => 600,1,Authenticate(VOICEBOX/KEY,d)
same => n, doSomethingIfSuccessfullyAuthed()

Wie ich von dir gelernt habe, die DB ist auch hier nützlich ;)

Ist es möglich irgendwas auszuführen wenn die Authentifizierung fehlschägt?
 
Zuletzt bearbeitet:
Yepp, geht auch mit Authenticate, ich würde es aber anders machen:

Code:
exten => 600,1,Read(PASS,agent-pass,,,1,10)
exten => 600,n,GotoIf($[${PASS}==${DB(VOICEBOX/KEY)}]?end:allowed)
exten => 600,n(allowed),ExecIf($[${DB(VOICEBOX/GLOBAL)}==On]?Set(DB(VOICEBOX/GLOBAL)=Off):Set(DB(VOICEBOX/GLOBAL)=On))
exten => 600,n(end),Hangup

Natürlich kann man auf Wunsch auch im Fall "unberechtigt" noch extra-code ausführen ...
Zu Read und seinen Optionen einfach nachlesen ...
 
Danke, Read ist natürlich sehr elegant. Ich hab es jetzt so:
Code:
same => n,Read(PASS,agent-pass,,,1,10)
same => n,GotoIf($[${PASS}==${DB(VOICEBOX/SECRET)}]?allowed:end)
same => n(allowed),ExecIf($[${DB(VOICEBOX/STATE)}==ON]?Playback(vb ist eingeschaltet):Playback(vb ist ausgeschaltet))
same  => n,ExecIf($[${DB(VOICEBOX/STATE)}==ON]?Playback(vb jetzt  ausschalten? 1 drücken):Playback(vb jetzt einschalten? 1 drücken))
same => n,Read(OPTION,agent-pass,,,1,10)
same => n,GotoIf($[${OPTION}==1]?flipvbstate:allowed)
same => n(flipvbstate),ExecIf($[${DB(VOICEBOX/STATE)}==ON]?Set(DB(VOICEBOX/STATE)=OFF):Set(DB(VOICEBOX/STATE)=ON))
same => n,ExecIf($[${DB(VOICEBOX/STATE)}==ON]?Playback(vb ist eingeschaltet):Playback(vb ist ausgeschaltet))
same => n,Playback(Es wird jetzt aufgelegt)
same => n(end),Hangup
Hier nicht ganz so interessant, aber interessehalber: Wenn Playback(vb jetzt einschalten? 1 drücken) läuft, wie kann man das Playback unterbrechen, wenn der Benutzer die Aufforderung schon kennt (1 drücken) und mitten im Playback bereits die 1 drückt?
 
Zuletzt bearbeitet:
Statt Playback Background verwenden ...
 
Besten Dank für die Hilfe, funktioniert wie erwartet, nur Read zickt ein wenig rum. Es ist egal wieviele Versuche ich angebe, er legt willkürlich, mal nach einem, mal erst nach sieben Versuchen, auf. Musste eine "Zählvariable" einfügen.
 
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.