[Problem] Durchstellen verursacht Sprung in h-Extension im falschen Kontext

Freakhouse

Neuer User
Mitglied seit
22 Mai 2015
Beiträge
53
Punkte für Reaktionen
1
Punkte
8
Hier mein kurzes Setup im Dialplan:

[Eingehende_Anrufe]
exten = 03012345678,1,Dial(SIP/1001&SIP/1002,10,t)
exten = 03012345678,2,Voicmail(1001,u)
exten = h,1,AKTION1

[Ausgehende_Anrufe]
exten = _0[1-9].,Dial(SIP/{EXTEN}@meintrunk,,T)
exten = h,1,AKTION2

Bei folgendem Szenario passiert folgender Fehler (?): Ein externer Anruf kommt auf der Nummer 03012345678 rein. Telefon 1 nimmt den Anruf an und stellt ihn dann mittels attended transfer (*21002) an Telefon 2 durch. Sobald Telefon 1 den Hörer auflegt, springt die h-extension im Kontext [Ausgehende_Anrufe] an und es wird Aktion2 ausgeführt. Keine Ahnung warum plötzlich in die h-Extension in [Ausgehende_Anrufe] gesprungen wird. Wenn Telefon 2 dann auch auflegt, wird ordnungsgemäß Aktion1 ausgeführt.

Bei einem ausgehenden Anruf ist es nachvollziehbarer: Telefon 1 ruft die externe Nummer 08008003800 an. Das Gespräch wird entgegengenommen. Nun stellt Telefon 1 das Gespräch mittels attended transfer (*21002) an Telefon 2 durch. Wenn Telefon 1 auflegt, wird Aktion2 ausgeführt. Legt dann irgendwann Telefon 2 auf, wird auch Aktion2 ausgeführt.

Warum kommt es bei eingehenden Anrufen zu dem Sprung in die h-extension im Kontext [Ausgehende_Anrufe]?
 
[Eingehende_Anrufe]
exten = 03012345678,1,Dial(SIP/1001&SIP/1002,10,t)
exten = 03012345678,2,Voicmail(1001,u)

exten = h,1,AKTION1
Was soll den AKTION1 bewirken?

Wenn ich's recht erinnere, dann wird eine h-Extension immer angesprungen so sie denn im Dialplan existiert. Insofern waere das Verhalten vom Asterisk hier korrekt.

h: Hangup. Used to clean up a call. Could be used to play a goodbye message before hanging up. Also seemingly used by the calling card people to record end of call for billing purposes.
 
Asterisk behandelt das Verbinden erst mal als vollkommen eigenes Gespräch. Der Anruf von Telefon1 an Telefon 2 läuft über den Context, den Telefon 1 in der sip.conf gesetzt bekommen hat. Deshalb wird, wenn einer der beiden auflegt, auch die h-extension dieses Contextes aufgerufen. Vermutlich gibt es dort keine, aber ein include=>Ausgehende_Anrufe.

Wenn Du AKTION1 wirklich nur dann ausführen willst, wenn dieser Channel aufgelegt wird, solltest Du einen Hangup Handler verwenden.

Gehört die Frage nicht eigentlich hier mit rein?
 
Was soll den AKTION1 bewirken?

AKTION1 und AKTION2 rufen einen Konsolenbefehl auf. Da dieser aber recht lang ist und für die Lösung des hiesigen Problems eher verwirrend sein dürfte, habe ich ihn nicht hier gepostet.

Asterisk behandelt das Verbinden erst mal als vollkommen eigenes Gespräch. Der Anruf von Telefon1 an Telefon 2 läuft über den Context, den Telefon 1 in der sip.conf gesetzt bekommen hat. Deshalb wird, wenn einer der beiden auflegt, auch die h-extension dieses Contextes aufgerufen. Vermutlich gibt es dort keine, aber ein include=>Ausgehende_Anrufe.

Danke schon mal für den Tipp. In dem Moment, in dem ich auf den "Attended Transfer"-Button an Telefon1 drücke, wird dann eine weiterer (neuer) Kanal aufgebaut. Dieser verbindet Telefon1 mit Telefon2. Ich hatte natürlich vergessen, den entsprechenden Kontext für interne Gespräche zu posten. Daher hole ich dies hier schnell nach (Für Telefon1 und Telefon2 gelten alle 3 Kontexte gleichermaßen):

[Eingehende_Anrufe]
exten = 03012345678,1,Dial(SIP/1001&SIP/1002,10,t)
exten = 03012345678,2,Voicmail(1001,u)
exten = h,1,AKTION1

[Ausgehende_Anrufe]
exten = _0[1-9].,Dial(SIP/{EXTEN}@meintrunk,,T)
exten = h,1,AKTION2

[Interne_Telefonate]
exten = 1001,hint,SIP/1001
exten = 1001,1,Dial(SIP/1001,30)
exten = 1001,n,Voicemail(1001,u)

exten = 1002,hint,SIP/1002
exten = 1002,1,Dial(SIP/1002,30)
exten = 1002,n,Voicemail(1002,u)

Wenn also durch das Durchstell-Anwählen ein neuer Kanal zu Telefon2 aufgebaut wird, erfolgt dies über den Kontext [Interne_Telefonate]. Dieser Kontext hat keine h-Extension. Der externe Anrufer hängt derweil in einer Warteschleife. Legt nun Telefon1 auf, wird der externe Anrufer mit Telefon2 verbunden. Ich habe aber keinen Schimmer, weshalb bei diesem Auflegen dann die h-Extension im Kontext [Ausgehende_Anrufe] ausgelöst wird. Selbst wenn das Auflegen am Telefon1 einmal den Kanal zwischen eingehendem Anruf und Telefon1 sowie den Kanal zwischen Telefon1 und Telefon2 beendet, dürfte doch allenfalls nur die h-Extension im Kontext [Eingehende_Anrufe] ausgelöst werden? Oder habe ich da irgendwo einen Denkfehler drin?
 
Zuletzt bearbeitet:
Dieser Kontext hat keine h-Extension.
Die h-Extension ist nicht auf einen Kontext beschraenkt.

In deinem Falle weiss Asterisk ja bereits dass eine h-Extension existiert und ruft diese dann auch auf; Stichwort 'Cleanup'!
 
Kann man denn eine h-extension auf einen bestimmten Kontext beschränken?
 
Meines Wissens nicht, aber wie rentier-s hier schon geschrieben hat, schau dir mal Hangup Handlers an ...
 
Ich werde das gleich mal mit den Hangup Handlers probieren. Aber eigentlich müsste eine h-extension doch immer nur in dem Kontext gültig sein, in dem sie gesetzt wurde.

[Kontext_1]
exten = 1001,1,Dial(SIP/1001)
exten = h,1,NoOp(Ich bin eine h-Extension)

[Kontext_2]
exten = _0[1-9].,1,Dial(SIP/1001)

In dem Beispiel kann die h-extension doch nur ausgelöst werden, wenn Asterisk sich in Kontext_1 befindet. Sobald Asterisk sich im Kontext_2 befindet, passiert beim Auflegen nichts mehr, da dieser Kontext_2 ja keine h-extension hat. Wenn das so stimmt (?), müsste mein Problem dadurch verursacht werden, dass Asterisk beim Durchstellen aus irgendeinem Grund in den Kontext [Ausgehende_Anrufe] springt?
 
Irgendwie musst Du den Telefonen ja sowohl das interne, als auch das externe Telefonieren ermöglichen. Vermutlich hast Du deshalb in der sip.conf einen Context stehen, in dem Interne_Telefonate und Ausgehende_Anrufe per include eingebunden sind, richtig?

Code:
[Kontext_1]
exten => 1001,1,Dial(SIP/1001)
exten => h,1,NoOp(Ich bin eine h-Extension)

[Kontext_2]
exten => _0[1-9].,1,Dial(SIP/1001)
include => Kontext_1

In Kontext_2 gibt es keine h-extension, aber in Kontext_1. Asterisk arbeitet auf der Suche nach einer passenden extension immer erst den Original-Context ab, gibt es dort nichts, werden die includierten der Reihe nach durchsucht. In diesem Fall wird er in Kontext_1 fündig, deshalb wird auch nach einem Gespräch mit externem Ziel die h-extension aus Kontext_1 ausgeführt.

Verhindern kann man das nicht. Du könntest, neben Hangup Handlern, eine (vererbbare?) Channelvariable setzen und diese in der h-extension auswerten.

Code:
[Telefone]
include => Ausgehende_Anrufe
include => Interne_Telefonate

[Ausgehende_Anrufe]
exten => _0Z.,1,Set(_lassgutsein=1)
exten => _0Z.,n,Dial(SIP/{EXTEN}@meintrunk,,T)
exten => h,1,ExecIf($["${lassgutsein}"!=""]?machwas)  ; wird nur bei abgehenden Anrufen ausgeführt

[Interne_Telefonate]
exten => 1001,hint,SIP/1001
exten => 1001,1,Dial(SIP/1001,30)
exten => 1001,n,Voicemail(1001,u)
 
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.