Per Script einen automatischen Anruf tätigen und auf Interaktion reagieren

Hallo Zusammen,

ist es möglich über ein Script welches alle X min Läuft einen automatischen Anruf tätigen zu lassen?
Die Rufnummer die angerufen werden soll, spielt vier DTMF Töne ab (1,2,3,4), wenn diese korrekt ankommen soll das Script 5 DTMF töne (5,4,3,2,1) versenden.

Hintergrund ist der: Wir möchten einen Trunk auf Funktion testen. In dem wir alle X min einen Testanruf tätigen.

Jemand eine Idee?

Beste Grüße
Hannes

Hallo Hannes,

möglich sollte es sein, aber ein einfaches Unterfangen ist es definitv nicht. Leichter wäre es, wenn die andere Seite den Call triggert und du lediglich ein Script “abheben” lässt, welche das DMTF ausliest und bei Erfolg zurücksendet. Um DTMF überhaupt senden zu können musst du das senddtmf Modul im Asterisk mitladen, hierzu die Systemvariable sys.asterisk.modules.app_senddtmf.noload auf 0 setzen, und den Telefoniedienst neustarten (Gespräche brechen ab).
In einem Dialplanscript kannst du mittels Read() DTMF auslesen, anschließend prüfen und mittels SendDTMF(54321,3,3,${CHANNEL(Name)}) zurückschicken.

Sollte wirklich die(se) mobydick den Anruf initialisieren sollen, so gibt es verschiedene Wege den Call automatisiert zu triggern. Hier kann ich allerdings nur Ansätze liefern:
-mittels XMPP (evtl auch REST) den Call Triggern (Registrierter SIP Account benötigt)
-mittels CallFile den Anruf auslösen (cronjob kopiert callfilevorlage alle x Minuten nach /var/spool/asterisk/outgoing)

Bei diesem Vorgehen bin ich mir jedoch nicht sicher ob man wirklich mittels Dialplanscript o.g. Read funktionierend einbauen kann.

Vielleicht hilft dir das schon ein wenig, solltest du Erfolg haben würde ich mich über Rückmeldung und ggf. Umsetzung freuen.

Viele Grüße,
Steve

Hallo Steve,

vielen Dank die Ansätze!
Es soll schon so sein, dass diese Mobydick den Anruf tätigt. Da wir prüfen müssen ob ein Trunk Eingehend noch Erreichbar ist oder eben nicht.

Das Verzeichnis /var/spool/asterisk/outgoing existiert auf der Mobydick derzeit nicht. Kann ich das einfach anlegen oder ist auf der Mobydick das Verzeichnis ein anderes bzw muss ich etwas im Commander einstellen, damit das angelegt wird?

Beste Grüße
Hannes

Das Verzeichnis kann einfach angelegt werden, die Berechtigungen sollten dann noch angepasst werden: drwxrwx— asterisk astdata (chmod 770 und chown asterisk:astdata).
Ich kann mir vorstelllen das es einen wesentlich eleganteren Weg gibt, aber bisher hatte ich nur solche Callfiles erstellt (Beispielinhalt):
Channel: SIP/trunkname/089111222333
Application: Playback
Data: hello-world

Ob man hier als Application auch ein Skript angeben kann wage ich zu bezweifeln, aber evtl kann man ein Skript anrufen, welches wiederum den Dial nach extern ausführt und die Call-Legs splittet.

Hallo Steve,

ein Zwischenstand:
Der Ordner /var/spool/asterisk/outgoing wurde angelegt und die Berechtigungen so gesetzt wie von dir geschrieben.
Ich habe in der Mobydick folgende Werte angepasst:
sys.asterisk.modules.app_senddtmf.noload von 1 auf 0 geändert.
sys.asterisk.modules.pbx_spool.noload von 1 auf 0 geändert.
Und den Telefonie dienst neu gestartet.

Anschließend habe ich eine DummyCall datei erstellt unter /tmp/ diese Kopiere ich zur Zeit noch Händisch nach /var/spool/asterisk/outgoing

DummyCall:

Channel: SIP/UnserTrunk/Zielrufnummer
Context: autoanswer
Extension: 10

Im Mobydick Commander habe ich ein Script erstellt mit dem Context Namen autoanswer.
Das Script Ließt die 4 DTMF Töne, gibt sie zur Zeit noch aus und sendet 5 DTMF Töne.

exten => 10,1,Answer()
exten => 10,n,Wait(1)
exten => 10,n,Read(dtmf,4)
exten => 10,n,SayDigits(${DTMF})
exten => 10,n,Wait(1)
exten => 10,n,SendDTMF(54321,3,3,${CHANNEL(Name)})
exten => 10,n,Wait(5)
exten => 10,n,Hangup()

Jetzt fehlt “nur” noch, dass ich Prüfe, ob die Verbindung zustande kommt und die DTMF Töne richtig übersendet werden. Falls nicht, soll die Moby eine Mail versenden.

Kann ich mit dem GotoIf Befehl DTMF Töne vergleichen?

Beste Grüße
Hannes

Hallo Hannes,

wenn SayDigits bei dir schon funktioniert, dann stehen die 4 DTMF Digits in ${DTMF}:


exten => 10,n,Read(dtmf,4)
exten => 10,n,GoToIf($ “${DTMF}” = “1234” ]?auth:noauth)
exten => 10,n(auth),SayDigits(${DTMF})
exten => 10,n,Wait(1)
exten => 10,n,SendDTMF(54321,3,3,${CHANNEL(Name)})
exten => 10,n,Wait(5)
exten => 10,n(noauth),HangUp()

Grüße,
Steve