[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