Dynamic Features keine DTMF erkennung [gelöst]

Alpha_23

Neuer User
Mitglied seit
28 Aug 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
1
Hallo Zusammen,

ich bin hier im Forum schon lange Zeit ein stiller (unregistrierter) Mitleser, habe aber jetzt ein Problem, zu dem ich bisher keine Antwort gefunden hab.

Zur Zeit baue ich ein SIP Relais auf Raspberry Pi Basis mit Asterisk.
Es soll folgendes können:
1. Ein Eingang wird getriggert -> Dies erzeugt ein Call File und wirft es in den Spooler, damit die entsprechende Nst. klingelt
2. Der Angerufene kann über DTMF (88) ein Relais schalten.

Mein Problem ist Punkt 2. Der Anruf kommt rein, ich höre meine definierte Ansage, drücke die DTMF und es passiert nichts...

Hier ein teil meiner extensions.conf:
Code:
[Outgoing]
exten => _XX,1,Set(__DYNAMIC_FEATURES=toggleR1)
same => n,Wait(2)
same => n,Playback(/home/pi/ansagen/klingel_betaetigt)
same => n,Wait(10)
same => n,Hangup()
Hier meine features.conf:
Code:
[applicationmap]
toggleR1 => 88,peer,System,bash /home/pi/config/toggleR1.sh
toggleR2 => 99,peer,System,bash /home/pi/config/toggleR2.sh
Und hier die Ausgabe der Console:
Code:
    -- Attempting call on SIP/sip1/81 for [email protected]:1 (Retry 1)
  == Using SIP RTP CoS mark 5
    -- Called sip1/81
    -- SIP/sip1-00000006 is ringing
    -- SIP/sip1-00000006 answered
    -- Executing [[email protected]:1] Set("SIP/sip1-00000006", "__DYNAMIC_FEATURES=toggleR1") in new stack
    -- Executing [[email protected]:2] Wait("SIP/sip1-00000006", "2") in new stack
    -- Executing [[email protected]:3] Playback("SIP/sip1-00000006", "/home/pi/ansagen/klingel_betaetigt") in new stack
    -- <SIP/sip1-00000006> Playing '/home/pi/ansagen/klingel_betaetigt.slin' (language 'de')
    -- Executing [[email protected]:4] Wait("SIP/sip1-00000006", "10") in new stack
    -- Executing [[email protected]:5] Hangup("SIP/sip1-00000006", "") in new stack
  == Spawn extension (Outgoing, 03, 5) exited non-zero on 'SIP/sip1-00000006'
[Aug 28 12:23:31] NOTICE[17838][C-00000009]: pbx_spool.c:463 attempt_thread: Call completed to SIP/sip1/81
Wo ist mein Fehler?
Ich hab das Gefühl, das die DYNAMIC_FEATURES ignoriert werden bzw. DTMF einfach nicht ankommt.
Vermutlich ist das für nen Asterisk Profi eine Kleinigkeit aber ich beiße mir da die Zähne aus.
Habe auch schon eine andere Lösung getestet, die nicht mit Call File arbeitet sondern via Shell ein "asterisk -rx 'console dial 81'" ausführt aber bei dieser Lösung lies sich keine Ansage abspielen, dafür funktionierte DTMF.
Zudem schien mir die Lösung mit dem Call File eleganter. Irgendwann hat Asterisk beim Aufruf von asterisk -rx den dienst verweigert und musste neu gestartet werden.

Hoffe jemand hat ne Idee.

Ich danke euch schon mal vorab.
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,499
Punkte für Reaktionen
323
Punkte
83
Moinsen


Zu DYNAMIC_FEATURES kann ich nichts beitragen, denn zum Abfangen von einstelligen Extensions nutz ich schon lange das Dial() Flag: d
...damit kann ich beliebige Wählversuche abbrechen und z.B. mit 0 ins Menü mit MoH ohne Gequatsche:
Code:
dialplan show [email protected]
[ Context 'osmc' created by 'pbx_config' ]
  '0' =>            1. answer(250)                                [pbx_config]
                    2. waitexten(7200,m(default))                 [pbx_config]
...um darüber jede beliebige Extension ( natürlich auch Mehrstellige ) zu erreichen.

Manche Applications, wie SayUnixTime, bieten auch die Option eines Abbruchs durch wählen einer ein-, oder mehrstelligen Extension.
...so als Zeitansagemenü ohne MoH...
Code:
dialplan show [email protected]
[ Context 'osmc' created by 'pbx_config' ]
  '100' =>          1. answer(500)                                [pbx_config]
                    2. sayunixtime(,CET,akMs,j)                   [pbx_config]
                    3. goto(2)
Na ? - Wie dynamisch ist das denn ?

PS: Welcome aboard ;)
PPS: Schau dir auch mal die Application SHELL() an, mit der kannst du auch Rückgabewerte bekommen, wenn du im Script am Ende mit "echo" was ausgibst und in Asterisk verwenden willst
Beispiel:
Code:
dialplan show [email protected]
[ Context 'osmc' created by 'pbx_config' ]
  '911' =>          1. SET(POL=${SHELL(echo 'Ei, Ei, Ei, Jetzt kommt die Polizei')}) [pbx_config]
                    2. verbose(1,${POL})                          [pbx_config]
:cool:
 
Zuletzt bearbeitet:

Alpha_23

Neuer User
Mitglied seit
28 Aug 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
1
Hey koyaanisqatsi,
erstmal danke für deine Antwort. Aber in wie weit hilft mir das bei meinem Problem?
Hier geht es um DTMF Erkennung und die wird in den meisten Anleitungen nun mal via Dynamic Features gelöst.
Bei deiner Lösung sehe ich leider nicht, wie mir das hilft. Vielleicht stehe ich aber auch einfach auf dem Schlauch.

Hier nochmal kurz zum Ablauf:
Das SIP Relais auf dem Asterisk läuft, bekommt ein Signal. Darauf hin wird via Bash Script eine Call Datei angelegt und in den Spool Ordner kopiert.
Dadurch ruft das Relais eine definierte Nebenstelle auf der Haupt TK Anlage an (Hier 3CX mit Nst. 81). Der Angerufene nimmt das Gespräch entgegen und hört eine Ansage. [Bis hierher klappt auch alles]
Jetzt müsste der Angerufene lediglich 2x die 8 drücken, um das Relais zu schalten.
Nutze ich eine andere Konfiguration und löse das ganze via "console dial" klappt das auch sehr gut, das Relais schaltet bei 88, nur mag Asterisk das auf dauer nicht und PlayFile klappt in dieser Version auch nicht.
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,499
Punkte für Reaktionen
323
Punkte
83
Hier geht es um DTMF Erkennung
Wie geschrieben, DYNAMIC_FEATURES brauch ich nicht. Ich nutze die Alternative die ich beschrieben habe, und...
Was denkst du denn was übertragen wird wenn ich eine Taste* auf irgendeinen SIP Klienten drücke ?

Hab auch überhaupt keine Hemmungen mich hier wieder zurückzuziehen und mein Geschreibsel nach /dev/null zu schicken.
...damit der Thread hier wieder schön leer wird.
...sag einfach Bescheid.

* Auf deutsch heisst das: Mehrfrequenzwahlverfahren
 

Alpha_23

Neuer User
Mitglied seit
28 Aug 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
1
Zuerst vorweg, ich bin dankbar für jede Hilfe und es war nicht meine Absicht dich irgendwie anzupöbeln.
Sollte das so rüber gekommen sein, tut mir das leid.

Nun mal zu deinem "Geschreibsel" ;)

Kannst du es mir erklären? Also was genau ich tun muss, damit deine Methode klappt?
Ich vergehe mich grade zum ersten mal an Asterisk. Habe da vorher nie Berührung mit gehabt.
Beruflich habe ich mit 3CX, Auerswald und AGFEO zu tun.
Bei allen läuft die Konfiguration deutlich einfacher und weniger, sagen wir, Textlastig.
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,499
Punkte für Reaktionen
323
Punkte
83
Gerne, das sollte auch kein Problem sein über ein Callfile abzuwickeln, denn beide Extensions ( 0 und 100 ) Applikationen sind durch ihre Optionen für eine DTMF Erkennung "scharf" gestellt.

Vorbereitung
Deine features.conf Einträge kommen in den Kontext [Outgoing] deiner extensions.conf.
Also aus...
Code:
[applicationmap]
toggleR1 => 88,peer,System,bash /home/pi/config/toggleR1.sh
toggleR2 => 99,peer,System,bash /home/pi/config/toggleR2.sh
...wird...
extensions.conf
Code:
[Outgoing]
exten => 88,1,System('bash /home/pi/config/toggleR1.sh')
same => n,Hangup()

exten => 99,1,System('bash /home/pi/config/toggleR2.sh')
same => n,Hangup()

; Vor einer Audioausgabe immer ein Answer() damit SDP/RTP aufgebaut ist...
exten => _XX,1,Answer(250)
same => n,Wait(2)
same => n,Playback(/home/pi/ansagen/klingel_betaetigt)
; Auf Wahl von 88 oder 99 30 Sekunden lang warten...
same => n,Waitexten(30)
...speichern, in der Asteriskkonsole dialplan reload und ausprobieren.

Das ist auch ein hübsches "Prioritätenbeispiel" ;)
...gib mal ein in die Asteriskkonsole:
dialplan show [email protected] dann dialplan show [email protected]
...und jetzt mal: dialplan show [email protected] :cool:
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Alpha_23

Alpha_23

Neuer User
Mitglied seit
28 Aug 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
1
Hey,
danke dir. Habs soweit umgeschrieben, erstmal nur mit der 88. Die 99 ist für die zweite Leitung. Können das also erstmal ignorieren.

Meine extensions.conf sieht im ganzen so aus (Ich hab dir die eingehenden und funktionierenden mal mit rein gepackt):
Code:
[Outgoing]
exten => 88,1,TrySystem(/bin/bash /home/pi/config/toggleR1.sh)
same => n,Hangup()

exten => _XX,1,Answer(250)
same => n,Wait(2)
same => n,Playback(/home/pi/ansagen/klingel_betaetigt)
same => n,Wait(30)
same => n,Hangup()

[incoming]
exten => 03,1,Answer()
same => n,Wait(1)
same => n,Playback(/home/pi/ansagen/tuer_1_geoeffnet)
same => n,TrySystem(/bin/bash /home/pi/config/toggleR1.sh)
same => n,Hangup()

exten => 04,1,Answer()
same => n,Wait(2)
same => n,Playback(/home/pi/ansagen/relais_2_geschaltet)
same => n,TrySystem(/bin/bash /home/pi/config/toggleR2.sh)
same => n,Hangup()
Es bleibt leider beim gleichen, wie vorher auch. Der Anruf kommt, ich höre die Ansage, wähle die 88 und es passiert nichts.
Hier nochmal die Konsole:
Code:
    -- Attempting call on SIP/sip1/81 for [email protected]:1 (Retry 1)
  == Using SIP RTP CoS mark 5
    -- Called sip1/81
    -- SIP/sip1-0000000a is ringing
    -- SIP/sip1-0000000a answered
    -- Executing [[email protected]:1] Answer("SIP/sip1-0000000a", "250") in new stack
    -- Executing [[email protected]going:2] Wait("SIP/sip1-0000000a", "2") in new stack
    -- Executing [[email protected]:3] Playback("SIP/sip1-0000000a", "/home/pi/ansagen/klingel_betaetigt") in new stack
    -- <SIP/sip1-0000000a> Playing '/home/pi/ansagen/klingel_betaetigt.slin' (language 'de')
    -- Executing [[email protected]:4] Wait("SIP/sip1-0000000a", "30") in new stack
    -- Executing [[email protected]:5] Hangup("SIP/sip1-0000000a", "") in new stack
  == Spawn extension (Outgoing, 03, 5) exited non-zero on 'SIP/sip1-0000000a'
[Aug 28 21:28:21] NOTICE[20379][C-0000000d]: pbx_spool.c:463 attempt_thread: Call completed to SIP/sip1/81
So sieht übrigens die alte funktionierende Konfiguration aus, die via "console dial" arbeitet.
Code:
[input1]
exten => _XX,1,Set(__DYNAMIC_FEATURES=toggleR1)
same => n,Dial(SIP/sip1/${EXTEN})
same => n,Hangup()
Siehst du noch irgendwo nen Fehler?
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,499
Punkte für Reaktionen
323
Punkte
83
OK, dann mit Taschenlampe in den Keller :)

Die Applikation Wait(30) hat so gut wie aber auch rein gar Nichts mit der Applikation WaitExten() zu tun ;)
Eigentlich kannst du aus _XX alle Wait`s entfernen, mit Answer(250) warteste ja auch schon 250ms.
 
Zuletzt bearbeitet:

Alpha_23

Neuer User
Mitglied seit
28 Aug 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
1
Ok wer lesen kann ist klar im vorteil :rolleyes:

Es funktioniert!!!! Danke dir. Dafür hast du dir echt mindestens ein kühles Blondes verdient. :cool:
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
12,499
Punkte für Reaktionen
323
Punkte
83
Nun, [gelöst] ist dein ursprüngliches Problem damit noch nicht.
Vielleicht kommt ja noch Jemand vorbei und erklärt wie das geht.
Wenn Jemand vorbei kommt der eine Lösung dafür ( DYNAMIC_FEATURES ) sucht, wird enttäuscht :oops: