[asterisk-users] Answered time on channel

Dovid Bender dovid at telecurve.com
Wed Dec 27 04:07:08 CST 2017


Seems I hit this: https://issues.asterisk.org/jira/browse/ASTERISK-23133

On Wed, Dec 27, 2017 at 5:03 AM, Dovid Bender <dovid at telecurve.com> wrote:

> My issue seems to be that I am using local channels. So for instance if I
> have:
>
> [incoming]
> Exten => _X.,1,NooP()
> Exten => _X.,n,Dial(Local/${EXTEN}@out1/n)
> Exten => _X.,n,Dial(Local/${EXTEN}@out2/n)
>
> Exten => h,1,DumpChan()
>
>
> [out1]
> 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,Dial(SIP/1111${EXTEN}@1.1.1.1:5063
> <http://EXTEN%7D@1.1.1.1:5063>,,U(answer_handler)b(pre_dial_handler^s^1))
>
> Exten => h,1,DumpChan()
> [out2]
> 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,Dial(SIP/2222${EXTEN}@1.1.1.1:5063
> <http://EXTEN%7D@1.1.1.1:5063>,,U(answer_handler)b(pre_dial_handler^s^1))
>
> Exten => h,1,DumpChan()
>
> [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,Return
>
>
>
>
> When using MASTER_CHANNEL it sets it on the channel that created the local
> channel (so it ends up in context incoming and NOT in out1). Not sure if
> this is a bug since the context incoming is generating the channel that
> calls out1 that then calls the answer_handler.
>
>
>
>
>
>
> On Wed, Dec 27, 2017 at 4:50 AM, Dovid Bender <dovid at telecurve.com> wrote:
>
>> It seems that what ever I set in my answer handler does not show up in
>> the hangup handler. In order to do billing I can't rely on the g option
>> where the caller hangs up the call. Looks like I can either use h or a
>> hangup handler along with the shared function.
>>
>>
>>
>> On Tue, Dec 26, 2017 at 4:40 PM, Eric Wieling <ewieling at nyigc.com> wrote:
>>
>>> 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,,U(answer_handler)b(pre_dial_han
>>> dler^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,,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
>>>
>>>
>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-users/attachments/20171227/0700fbdc/attachment.html>


More information about the asterisk-users mailing list