HELP! AGI AUTOHANGUP Does Not Seem To Hangup The Channel.

Home » Asterisk Users » HELP! AGI AUTOHANGUP Does Not Seem To Hangup The Channel.
Asterisk Users 5 Comments

https://wiki.asterisk.org/wiki/display/AST/Asterisk+18+AGICommand_set+autohangup

“Cause the channel to automatically hangup at time seconds in the future”

SET AUTOHANGUP TIME

Looks great. Except… it doesn’t. It just causes AGI to send “HANGUP”
and any audio to stop playing. It does NOT hangup the channel, or even send any SIP event. The line just goes silent.

It’s been an entire afternoon of profuse googling; I have tried adding and removing hangup handlers, I have even tried setting the AGIEXITONHANGUP flag to “1” as per https://wiki.asterisk.org/wiki/display/AST/Asterisk+Standard+Channel+Variables

But this is all that happens (5 seconds is ridiculous, it’s just to test). This is with “pjsip set logger on”

AGI Rx << SET AUTOHANGUP 5 AGI Tx >> 200 result=0
AGI Rx << SET VARIABLE AGIEXITONHANGUP "1" AGI Tx >> 200 result=1
AGI Tx >> HANGUP << AGI Rx << HANGUP AGI Tx >> 511 Command Not Permitted on a dead channel or intercept routine

basically, the next log event is whenever the next REGISTER would normally happen.

And of course, if I try and respond to the AGI again, it tells me the channel is dead. So WHY is the “hangup” event not sent to the phone?

I cannot use other methods like setting the absolute channel timeout variable, or using a local “dial” with a timeout message because:

1: the system tests whether the next file will push the listener over the 1 hour limit for included calls in UK packages, so the autohangup value has to be dynamic
2: It has to be over-ridable so that the listener can continue past the hour
3: The message that plays out is dynamically generated

Everything about it works fine… except the fact that it doesn’t actually hangup. Which leaves the possibility that an old person might fall asleep and end up with a large bill, which we don’t want!

5 thoughts on - HELP! AGI AUTOHANGUP Does Not Seem To Hangup The Channel.

  • I have also tried configuring pjsip wizard like this.

    endpoint/rtp_timeout=5

    And I see this shortly after the “hangup” command has been sent, so that part is working:

    [May 26 17:36:37] NOTICE[1276]: res_pjsip_sdp_rtp.c:150
    rtp_check_timeout: Disconnecting channel
    ‘PJSIP/fromvoipfone-206-0000000b’ for lack of audio RTP activity in 5
    seconds

    But, again, it doesn’t disconnect. The line stays open. And yes, my fallthrough after agi is

    same => n, Hangup()

    Also, apparently I now have a load of channels, which won’t even hangup with

    channel request hangup all

    Requested Hangup on channel ‘PJSIP/fromvoipfone-206-0000000b’
    Requested Hangup on channel ‘PJSIP/fromvoipfone-206-0000000a’
    Requested Hangup on channel ‘PJSIP/fromvoipfone-206-00000009’

    …and wait.. and then…

    Channel Location State Application(Data)
    PJSIP/fromvoipfone-2 s@test:2 Up AGI(agi://localhost:3456)
    PJSIP/fromvoipfone-2 s@test:2 Up AGI(agi://localhost:3456)
    PJSIP/fromvoipfone-2 s@test:2 Up AGI(agi://localhost:3456)
    3 active channels
    3 active calls

    So they just won’t die.

    Asterisk 18.4.0 – worth filing a bug?

  • Is your AGI closing the connection or are you expecting Asterisk to drop it? (I’m not that familiar with FastAGI or AGI these days, just wondering what happens if you drop the connection)

  • I think I can confidently say, after most of a day and reading the following….

    https://stackoverflow.com/questions/66768885/why-doesnt-asterisk-17-catch-hangup-request-from-pjsip-client-solved https://wiki.asterisk.org/wiki/display/AST/Asterisk+18+AGICommand_set+autohangup https://community.freepbx.org/t/inbound-calls-dont-hang-up/53612
    https://community.freepbx.org/t/pjsip-problem-channel-not-closing/65311/7
    https://wiki.asterisk.org/wiki/display/AST/Asterisk+18+Function_PJSIP_ENDPOINT
    https://wiki.asterisk.org/wiki/display/AST/Asterisk+18+Configuration_res_pjsip

    … that Asterisk doesn’t like mixing autoHangup with AGI, and there appears to be no way of the ts-agi library I’m using knowing that it has autoHungup, so it can’t close the AGI connection which seems to release Asterisk to hangup properly.

    I had thought that the AGIEXITONHANGUP variable might help, but it appears to do nothing, although I’m unsure if I’m setting it correctly as:

    Here it says the flag is “1”
    https://wiki.asterisk.org/wiki/display/AST/Asterisk+Standard+Channel+Variables

    And here it says the flag is “yes”
    https://wiki.asterisk.org/wiki/display/AST/Asterisk+18+Application_AGI

    That said, I wish I could use ARI not AGI but without the current media offset available on ARI, I need AGI 🙂

    So for now, the workaround is to forget about setting autohangup, and just hangup the caller manually at the point they don’t over-ride the timeout.

    Thanks!

  • I wouldn’t expect the AGI() application to send a SIP event. The AGI()
    application does not care what technology you use.

    Receiving ‘HANGUP’ as text from Asterisk appears to be a FastAGI thing which kind of makes sense — if your FastAGI server is not localhost, how could Asterisk send it a signal?

    Are you supposed to close your TCP connection and exit your AGI when you receive the HANGUP text?

    When I set autohangup in a ‘normal’ AGI, it looks like this:

    AGI Tx >> agi_request: null-agi.php
    AGI Tx >> agi_channel: SIP/poly-77a1-000002a2
    AGI Tx >> agi_language: en
    AGI Tx >> agi_type: SIP
    AGI Tx >> agi_uniqueid: 1622093977.1168
    AGI Tx >> agi_version: 13.14.1~dfsg-2+deb9u4
    AGI Tx >> agi_callerid: 5555555555
    AGI Tx >> agi_calleridname: Steve Edwards
    AGI Tx >> agi_callingpres: 0
    AGI Tx >> agi_callingani2: 0
    AGI Tx >> agi_callington: 0
    AGI Tx >> agi_callingtns: 0
    AGI Tx >> agi_dnid: *
    AGI Tx >> agi_rdnis: unknown
    AGI Tx >> agi_context: newline
    AGI Tx >> agi_extension: *
    AGI Tx >> agi_priority: 6
    AGI Tx >> agi_enhanced: 0.0
    AGI Tx >> agi_accountcode:
    AGI Tx >> agi_threadid: 1945654064
    AGI Tx >>
    AGI Rx << set autohangup 5 AGI Tx >> 200 result=0
    > 0x73c3dba0 — Strict RTP learning complete – Locking on source address 192.168.0.139:2254
    (and then after 5 seconds)
    AGI Script null-agi.php completed, returning 4


    Thanks in advance,
    ————————————————————————-
    Steve Edwards sedwards@sedwards.com Voice: +1-760-468-3867 PST
    https://www.linkedin.com/in/steve-edwards-4244281

  • This does raise a question in my mind…

    The AGI protocol is: your AGI sends a request (the Rx line) and receives a response (the Tx line). 1 line out, 1 line in.

    If the ‘HANGUP’ text can arrive asynchronously, how are you supposed to know it has arrived? Poll (or select) on the file pointer?

    I don’t understand why you can’t use the absolute channel timeout. Wherever you ‘set autohangup x’ just set ‘TIMEOUT(absolute)=${EPOCH}+x.’


    Thanks in advance,
    ————————————————————————-
    Steve Edwards sedwards@sedwards.com Voice: +1-760-468-3867 PST
    https://www.linkedin.com/in/steve-edwards-4244281