[Frage] Anruf aktiv übernehmen / Bestätigung der Anrufannahme durch Tastendruck

palme

Neuer User
Mitglied seit
6 Jan 2005
Beiträge
25
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich suche eine Lösung, wie ich einen Anruf aktiv übernehmen kann (Bestätigung der Anrufannahme durch Tastendruck)

Hintergrund:
Ich leite eingehende Anrufe an ein Handy weiter. Aktuell kann ich nicht sicher sein, daß jemand persönlich abnimmt (Mailbox), deshalb suche ich eine Möglichkeit die Rufannahme durch einen Tastendruck zu verifizieren.

Beispiel:
Ein externer Anruf kommt auf die 0.....4711 an.
Der Anrufer wird geparkt oder ähnliches.
Ich werde auf dem Handy angerufen.
Wenn ich per Tonwahl eine Taste drücke, beispielsweise die "1", wird der Anrufer durchgestellt.
Anderenfalls wird das Gespräch beendet oder es erfolgt eine Ansage.

Lösungswege:
1. Die versuchte Lösung mit Park habe ich nicht hinbekommen.

2. ParkAndAnnounce() wäre optimal, unterstützt aber keine Eingaben (zb 1)

Hat jemand eine Idee, wie ich dies lösen kann oder evtl. sogar ein Beispielskript?

Gruß
Palme
 
Zuletzt bearbeitet:
Evtl. könnte mir bisher keiner helfen, da ich die gesuchte Funktion nicht gut genug beschrieben habe. Ich habe den Text deshalb nochmals überarbeitet und hoffe, daß mir jemand von euch weiterhelfen kann.

Gruß
Palme
 
Haste schonmal im Forum gesucht? Ich glaube ich hab da mal so nen ähnliches Problem gelesen. Mir würde jetzt nur der Befehl Read einfallen.
 
deshalb suche ich eine Möglichkeit die Rufannahme durch einen Tastendruck zu verifizieren.

ich verstehe das Problem nicht. Bei mir z.B. laeuten gesteuert ueber den zentralen Asterisk immer saemtliche Telefone parallel, also alle DECT Mobilteile, Handy, beliebige weltweit verteilte sonstige Telefone am Arbeitsplatz etc. Wenn ich jetzt z.B. am Mobiltelefon das Gespraech annehme, was muss dann noch verifiziert werden? Falls ich das Gespraech nicht bekomme, hat der Anrufer entweder schon aufgelegt oder es spricht bereits der Anrufbeantworter.

- sparkie
 
Es geht dem TE wohl darum sicherzustellen, dass ein Mitarbeiter wirklich persönlich dran geht und nicht die Handy-Mailbox.

Was mir einfällt wäre, den Parellelruf nicht über Dial(...&...), sondern mittels Originate getrennt aufzubauen. Das Ziel des Originate müsste ein Pickup bzw. ParkedCall im Fall von ParkAndAnnounce sein. Allerdings müsste man den Channel des Originate irgendwie auflegen, wenn der Anruf anderweitig angenommen oder abgebrochen wird. Dazu habe ich keine Idee.
 
Es geht dem TE wohl darum sicherzustellen, dass ein Mitarbeiter wirklich persönlich dran geht und nicht die Handy-Mailbox.

aber auch hier ist die Loesung doch einfach. Wenn ich nicht will, dass eine Mailbox hingeht, dann nutze ich halt meine eigene "Mailbox" statt die des Providers. Und meine eigene "Mailbox" besteht nur aus einer Rufnummer, die immer angerufen werden kann, aber es laeutet dort nicht wirklich ein Telefon noch nimmt dort jemals ein Anrufbeantworter ab.

- sparkie
 
@sparkie: Das ist glaube ich nicht das, was der TE wollte - schließlich kann er die Rufdauer des Mobiltelefons, das er ja anrufen will, nicht steuern.

@rentier-s: Auch mir war hier nur Originate eingefallen, das Problem mit "Channel ist von einem Menschen beantwortet" liese sich vermutlich sogar lösen, hier mal die Grundidee als AEL-Snippet:

Code:
context inbound {
   _X.  => {
               Originate(SIP/[I]myProvider[/I]/[I]myMobile[/I],exten,mobconnect,${CHANNEL(name)},1);
               Hangup;
              }
}

context mobconnect {

   _. => {
             Read(accept,[I]myAnnounceFile[/I],1,,1,5);
             if ("X${accept}"="X1"} {
                 Bridge(${EXTEN});
             } else {
                 SoftHangup(${EXTEN});
                 Hangup;
             }
}

Das ist ungetestet, sollte aber nach meinem Verständnis unter 1.8.x im Prinzip zum gewünschten Ergebnis führen können:
Ein in inbound auflaufender Call führt zu einem Originate an das Handy mit dem Ziel des Context mobconnect an der Extension Channel(name) des Anrufers und wird dort gebridget, sofern am Handy der Ruf angenommen und eeine 1 eingegeben wurde

Die kursiven Teile müssten natürlich durch die anwenderseits korrekten Daten ersetzt werden ;)
Bridge erlaubt auch noch Optionen, die habe ich hier mal weggelassen ... - was ich im Moment nicht zu sagen vermag ist, ob der SoftHangup funktioniert.

Edit: Es kann auch seein, dass nach dem Originate noch ein Wait(60) rein muss, da vermutlich der Anrufende direkt zum Hangup kommt, der Trick dieses Ansatzes besteht ja eben darin, den eingehenden Anrruf nicht anzunehmen, solange das Mobile nicht geantwortet hat...
 
Zuletzt bearbeitet:
Das schaut soweit gut aus, ich hätte es vermutlich etwas umständlicher gemacht. ;-)

Der SoftHangup an der Stelle bringt aber IMHO nichts. Wenn der Anruf anderweitig beantwortet wird, würde das Originate trotzdem bis zum Timeout durchläuten. Den SoftHangup in einem Makro mittels Dial(...,,M(cancel-originate)) auszuführen, wäre grundsätzlich kein Problem, wenn man dort den Channelname wüsste.
 
Das wiederum könnte klappen, wenn man ihn

a) in die DB schreibt
b) über eine vererbte Variable __VarName zugänglich macht.
 
Originate() erzeugt aber doch wie alles einen Channel "Tech/Data-uniqueid", oder? Und an diese uniqueid müsste man erst mal ran kommen. :noidea:
Egal bei welcher Variante, Dialplan, AMI oder CLI, man bekommt nur den Status, aber nicht den generierten Channelnamen zurück. Zumindest habe ich es noch nicht geschafft. Erst wenn der erzeugte Channel beantwortet wird, könnte man diesen im Zielcontext auslesen.
 
Ach so, Du meinst den Channel, den Originate erzeugt. Da gibt's (derzeit) tatsächlich nichts mir bekanntes. Für Dial gibt es das im Moment nach Callannahme (mit Dial(..U(routine)) und dann in routine auslesbar. Es gibt aber auch eine Implementierung für eine PreDial-Routine, mit der man bei Dial u.a. den/die generierten Channelnames vor dem eigentlichen Dial bekommen würde, siehe hier: PreDial. Ist allerdings eben nur ein Patch, der vermutlich nicht (so schnell) integriert werden wird und es funktioniert bei Dial, nicht bei Originate.
Ansonsten: Der Channel steckt im AMI-Dial-Event, ich weiß allerdings nicht genau, wann das geworfen wird:

Code:
'Dial' Event
Description:
[derived from app_dial.c]

Data Sample:
Event: Dial
Privilege: call,all
Source: Local/900@default-2dbf,2
Destination: SIP/900-4c21
CallerID: <unknown>
CallerIDName: default
SrcUniqueID: 1149161705.2
DestUniqueID: 1149161705.4
 
Lesen bildet :p

Deshalb für das Originalproblem hier noch mal ein anderer Ansatz, der tatsächlich auch der Intention von Asterisk entspricht und ohne die bislang diskutierten "Verrenkungen" auskommt:

Code:
context inbound {
   _X.  => {
               Dial(SIP/myProvider/myMobile,,U(mobconnect));
               //Hier könnte für den Abgewiesen/AB-Fall eine Ansage stehen
               Hangup;
              }
}

context mobconnect {

   s => {
             Set(GOSUB_RESULT=);         
             Read(accept,myAnnounceFile,1,,1,5);
             if ("X${accept}"="X1"} {
                 Return;
             } else {
                 Set(GOSUB_RESULT=CONTINUE);
             }
}

siehe auch (zum Lesen :) ): voip-info.org für die Dialoption U (hier benutzt) oder alternativ M (mit geringen Anpassungen)
 

... und macht das Leben leichter. Example 2 wäre es gewesen. :oops:

Ich bin gerade am Grübeln, wie das als Parallelruf aussehen könnte. Am besten vermutlich über Local, damit der Rufversuch auf das heimische Telefon unberührt bleibt.
Code:
context inbound {
   _X.  => {
               Dial(SIP/myPhone&Local/myMobile@inbound);

   myMobile  => {
               Dial(SIP/myProvider/myMobile,,U(mobconnect));
               Wait(30);
              }
}
Was meinst Du dazu?
 
Im Prinzip ja, ich würde es aber ein wenig anders machen (und damit auch dem Wait eine "nachvollziehbarere" Bedeutung geben wollen:

Code:
context inbound {
   _X.  => {
               Dial(Local/myPhone@inbound&Local/myMobile@inbound);
               }

   myMobile  => {
               Dial(SIP/myProvider/myMobile,30,U(mobconnect));
               Wait(30);
              }

   myPhone => {
              Dial(SIP/myPhone,30);
             }
}

Hintergrund: die 30 Sekunden Wait machen jetzt Sinn, wenn wir CONTINUE zurückliefern, damit kein Hangup erfolgt solange (theoretisch) noch das andere Telefon den Anruf annehmen könnte.
 
:nemma::rock:
Genial. Nach so einer Lösung habe ich schon mindestens 6 Jahre gesucht. Ich habe zu hause keinen Handyempfang, wenn das Telefon klingelt und ich den Parallelruf mal wieder vergessen habe abzustellen, klingelte es immer nur 2 Mal, dann war der Anruf weg und der Anrufer bekam die Ansage, dass ich nicht erreichbar sei. Nachdem mir das zu oft passiert war, habe ich auf RUL verzichtet. Jetzt kann ich das endlich vernünftig lösen.
 
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.