[asterisk-users] Answering machine detection after Dial()
Johannes Zweng
zweng.johannes at gmx.net
Tue Jun 12 13:50:10 CDT 2007
Hi people!
Sorry for bringing up some annoying issue.. yes, it's AMD again...
But I was searching the last days for a solution for my problem and
didn't really find anything. Now I'm hoping that someone of you has
maybe an idea for me. :)
My setup:
---------
I use the Asterik Manager API to generate outgoing calls (by using
"Originate" messages).
These outgoing calls are placed to a SIP IVR-Server (dialog system
with speech recognition) and are then connected out to real-world
users via the dialplan using "Dial()" (see context below).
(The reason why the first call-leg goes to the voice-server and not to
the user is for reliability reasons. I don't want to annoy users with
calls which cannot be established, when the voice-server is down for
example.)
My problem:
-----------
Somehow I should be able to detect, if an answering machine answers on
the second outgoing call leg (caused by the Dial(), going out to the
real-life person) and I should somehow be able to inform the
voice-server about this fact.
My naive first idea:
--------------------
I thought I could use the dialplan application AMD() and if it detects
an answering machine, I could play a pre-defined text, or
DTMF-sequence, which in fact will be recognized by the voice-server
which should interrupt its "human" dialog and restart with the
"machine" dialog.
BUT: I found out that my AMD() command in the dialplan after the
Dial() never gets executed. :( As far as I understood, it's not
possible to execute further commands after the Dial(). (Maybe I'm
wrong. Please correct me, if so..).
Hmm.. And here I'm stuck. Has anybody some idea for me where I can
start looking for further solutions? Any help would be appreciated!!
:)
Thanks in advance!!!
Best regards and greetings from Austria!
johnny
P.S.:
Some detail infos:
I'm using Asterisk 1.2.9.1.
I installed app_amd from http://www.freedomphones.net/files/app_amd2.c
My dialplan context for generating the outgoing calls looks like this
(I use AEL):
context 1000_amd_tests {
_0043[1-9]. => {
// be verbose.. :)
Verbose(0,InfoInfo ${CONTEXT} - ${EXTEN} called on
${CHANNEL}.);
// set our callerId to the correct id
Set(CALLERID(number)=xxxxxxxxxx);
// absolute call timeout
Set(TIMEOUT(absolute)=3600;
// debug
Verbose(0,DebugDebug Will execute Dial on ${CHANNEL}.);
// now dial to reallife user, timeout 300 because, we will
abort
// via manager API if we decide it takes too long
Dial(Zap/r1/${EXTEN:4,0},300);
// debug
Verbose(0,DebugDebug we are now after Dial on ${CHANNEL}.);
// try AMD (configured through amd.conf)
AMD();
// debug
Verbose(0,DebugDebug AMD ${AMDSTATUS} - ${AMDCAUSE}.);
Hangup();
};
T => {
Verbose(0,WARN timeout - ${CONTEXT} ${EXTEN} on ${CHANNEL}.);
Hangup();
};
};
An exmplaric Originate message for generating a call looks like this:
action: Originate
actionid: 25326212_156#20070531_193654_987_0043650xxxxxxx
timeout: 15000
exten: 0043650xxxxxxx
account: 8594
async: true
callerid: 6437
context: 1000_amd_tests
priority: 1
channel: SIP/voice-application at voiceserver01
Note: "callerid" is what the voice-server sees, not the real-life
person.
More information about the asterisk-users
mailing list