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_ > 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,,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/2be03a08/attachment.html>
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 ,,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 ,,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/11e7de3c/attachment.html>
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 at 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 at 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>
My suggestion is to stop trying to do this in the dialplan. Let asterisk dialplan do it?s job and process the call. Manage this either through the AMI events and call your scripts from there or if you are using an asterisk version that has ARI then allow it to do your call set up and tear down. Either way don?t over complicate your dialplan. Nathan Kirk> On Dec 27, 2017, at 4: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,,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,,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_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,,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-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.digium.com/pipermail/asterisk-users/attachments/20171227/52ee258a/attachment.html>