Don't use an 'h' extension, use a hangup handler.
Use the MASTER_CHANNEL() function to set variables to ensure they are always set in the "top most" channel.  Below is an untested example, but is inspired by dialplan code I use in production.  Maybe it will help.

[outbound] ; this is called on the incoming (caller) channel
exten => _X.,1,Noop
 same => n,Set(MASTER_CHANNEL(start_timestamp)=${STRFTIME(,,%s.%3q)})
 same => n,Set(CHANNEL(hangup_handler_push)=hangup_handler,s,1)
 same => n,Set(MASTER_CHANNEL(callid_ingress)=${SIPCALLID})
same => n, *** unrelated dialplan, AGIs, etc. ***
 same => n,Dial(SIP/${EXTEN}@1.1.1.1 <mailto:EXTEN%7D@1.1.1.1>,,U(answer_handler)b(pre_dial_handler^s^1)g  same => n, *** dialplan for the caller when the callee hangs up first, not run when caller hangs up first.  use it to try dialing another destination, play intercept to caller, etc. ***


[pre_dial_handler] ; this is called on the outgoing (callee) channel
exten => s,1,Noop
 same => n,Set(MASTER_CHANNEL(callid_egress)=${SIPCALLID})
 same => n,Set(MASTER_CHANNEL(dial_timestamp)=${STRFTIME(,,%s.%3q)})
 same => n,Return


[answer_handler] ; run on outgoing (callee) channel, but sets answer_timestamp in the caller channel
exten => s,1,Noop
 same => n,Set(MASTER_CHANNEL(answer_timestamp)=${STRFTIME(,,%s.%3q)})
 same => n,Return


[hangup_handler]  ; run on incoming (caller) channel, use to do final post call cleanup
exten => s,1,Noop
same => n,Set(MASTER_CHANNEL(hangup_timestamp)=${STRFTIME(,,%s.%3q)})
  same => n, ***post call cleanup AGIs, dialplan, etc.***
same => n,Return



On 12/26/2017 03:28 PM, Dovid Bender wrote:
Hi,

I have a dial plan where I need to notify an external system when a call was answered and when the call hung up. In both requests the start time needs to be the same. My Dialplan looks something like this:


[outbound]
Exten => _X.,1,Dial(SIP/${EXTEN}@1.1.1.1 <mailto:EXTEN%7D@1.1.1.1>,,U(call-answer-from-carrier))

Exten => h,1,NoOp(ANSWERED_TIME: ${ANSWEREDTIME} >>> DIAL_TIME: ${DIALEDTIME} >>> HANGUP_TIME: ${EPOCH} >>> ANSWERED TIME ${MATH(${EPOCH}-${ANSWEREDTIME},int)})

[call-answer-from-carrier]
Exten => s,1,Noop(CALL WAS ANSWERED AT ${EPOCH}
Exten => s,n,Agi(some_script.py)

Now in theory the hangup time of the call (${EPOCH} in the h extension) minus the answered time should be the same as the noop from my subroutine. I am finding that some times they match and some times they are off by a second. My issue is that the external system expects the answered time to the same for when we call it from the SubRoutine as well as from the h extension. I assume the difference is based on the microsecond of when we look at EPOCH how DIALEDTIME is rounded.

Any tips on how I can get the same answered time across the board?

TIA.

Dovid




-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

Check out the new Asterisk community forum at: https://community.asterisk.org/

New to Asterisk? Start here:
      https://wiki.asterisk.org/wiki/display/AST/Getting+Started

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to