[Problem] Dial(SIP/123&LOCAL/456) - Abfrage welcher Teilnehmer hat angenommen (in h).

Mathias-R

Neuer User
Mitglied seit
20 Jul 2005
Beiträge
165
Punkte für Reaktionen
1
Punkte
18
Hallo,
ich werte nach dem Auflegen (im h) die Gesprächskosten aus.
Ein Problem gibt es dabei bei parallelen Rufen mehrerer Teilnehmer:
Bei einem Ruf Dial(SIP/123&LOCAL/456) wird im LOCAL Context "h" schon beim Verbindungsaufbau abgearbeitet, so dass ${ANSWEREDTIME} noch Null ist.
Natürlich kann ich die notwendigen Variablen mit set(MASTER_CHANNEL(variablenname)=...) an den ersten Wählbefehl übergeben.
Wie kann ich aber nun nach dem Auflegen (im "h") noch erkennen, welcher Teilnehmer das Gespräch letztlich beantwortet hat?
Derzeit prüfe ich im "h" nach dem Dial/LOCAL den CHANNEL(status) (Up = dieser Ruf wurde beantwortet), aber gibt es keinen einfacheren Weg?

Gruß,
Mathias
 
Zuletzt bearbeitet:
Ich mach das mit dem U Flag im Dial, die Subroutine wird für den Channel ausgeführt, der das Gespräch angenommen hat. Da kann man zB. den Channel oder Sippeer auslesen. Allerdings bin ich in letzter Zeit auch vermehrt drüber gestolpert, dass sich Local Channel da manchmal nicht nachvollziehbar seltsam verhalten.

Vielleicht hilfts auch, statt der h-extension einen Hangup Handler (ab Asterisk 11 verfügbar) zu verwenden, der wird dann nur an den ursprünglichen Channel gebunden und somit nur aufgerufen, wenn dieser beendet wird.
 
Danke!

Zumindest der Hangup Handler wird in diesem Falle ebenfalls schon zu früh ausgeführt (unmittelbar nach der h-Extension).
Das U-Flag unterbindet laut Doku die Timeouts (L-Flag und/oder Ringtime?), daher werde ich es eher nicht nutzen.

Vermutlich wird der lokale Channel abgebaut, sobald der anrufende mit dem annehmenden Channel verbunden wird.
 
Zuletzt bearbeitet:
Zumindest der Hangup Handler wird in diesem Falle ebenfalls schon zu früh ausgeführt (unmittelbar nach der h-Extension).

Da hast Du natürlich Recht, ich hatte einen Denkfehler. Der Hangup Handler müsste in der U (oder besser b? *kann grad nicht denken*) Subroutine an den antwortenden Channel gebunden werden, damit er nur ausgeführt wird, wenn dieser beendet wird.

Das U-Flag unterbindet laut Doku die Timeouts (L-Flag und/oder Ringtime?)

Ehrlich? Wäre mir noch nie aufgefallen. Also L nutze ich nicht, aber ich wäre der Meinung meine Dialtimeouts funktionieren auch mit U. Rein logisch hat das eine mit dem anderen eigentlich nichts zu tun. Aber das lässt sich ja leicht ausprobieren.

Jedenfalls sind M und U die einzigen Möglichkeiten, die ich kenne, um ohne AMI oder CEL an den antwortenden Channel zu kommen.

Vermutlich wird der lokale Channel abgebaut, sobald der anrufende mit dem annehmenden Channel verbunden wird.

Ja, aber nur, so meine Beobachtung, wenn der Local Channel nur ein "echtes" Ziel hat, also Dial(SIP/123). Wenn man im Local Dial(SIP/123&SIP/456) macht, wird alles weitere immer noch als Local/... ausgeführt.
 
Meine Konfiguration: Teilnehmer richten sich Parallelrufe auf externe Mobil-Rufnummern, Festnetz oder in's Ausland ein.
1. Zuerst wähle ich Dial(SIP/123&LOCAL/0171234567&LOCAL/06912345).
2. Die externen Rufe führen zu einem Dial(SIP/0171234567@provider1) sowie Dial(SIP/06912345@provider2).
3. Wenn einer der gerufenen Teilnehmer das Gespräch annimmt (intern oder extern) werden in den unter 2. aufgebauten verbunden die h-Extensions ausgeführt.
4. Am Gesprächsende wird die h-Extension im ersten Wählbefehl ausgeführt.

Derzeitige Lösung: Ich prüfe in der h-Extension der Verbindungen unter 2. den Channel-Status. Sofern dieser "Up" ist übergebe ich die Informationen dieses Channels mit set(MASTER_CHANNEL(variablenname)=...) an die Verbindung unter 1.
Am Gesprächsende (4.) verarbeite ich die unter (3.) übergebenen Werte für die Abrechnung.

Allerdings scheint er die 2. gesetzten Timeouts (Ringtime und L) zu ignorieren. Damit läuft der Ruf auf die Mobilbox, auch wenn die Ringtime für Mobilnummern kürzer ist.

Ja, aber nur, so meine Beobachtung, wenn der Local Channel nur ein "echtes" Ziel hat, also Dial(SIP/123). Wenn man im Local Dial(SIP/123&SIP/456) macht, wird alles weitere immer noch als Local/... ausgeführt.

Auch wenn ich im Schritt (2.) ein Dial(SIP/0171234567@provider1&SIP/Telefon1) ausführe wird der Channel beim Verbindungsaufbau sofort abgebaut.
Beim Verbindungsaufbau werden beide SIP-Channels jeweils mit dem LOCAL-Channel verbunden (joined 'simple_bridge' - 2 Bridges), dann wird der ausgehende SIP-Channel direkt mit dem eingehenden verbunden (swapped with LOCAL/...) und die zweite Bridge abgebaut (Channel LOCAL/... left simple_bridge). Sicher eine gute Optimierung wenn es um die Performance des Asterisk geht, nur hier mit ein wenig Zusatzaufwand bei der Variablenübergabe verbunden.
 
Zuletzt bearbeitet:

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,375
Beiträge
2,251,051
Mitglieder
374,029
Neuestes Mitglied
hgt41807
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.