Dial() After The H Extension Has Been Invoked?

Home » Asterisk Users » Dial() After The H Extension Has Been Invoked?
Asterisk Users 13 Comments

Hi.

I have a setup which comprises some “front-end” Asterisk servers which have SIP trunks to external providers, and very simple dial plans, and some “back-
end” servers which only talk to the front-end machines, and have the majority of my dialplan logic on them.

I use Dial() commands with custom SIP headers to pass information (eg: about the current state of a call) between the front-end and back-end machines, and this works very well.

However, I can’t use a Dial() command in the h extension to notify the other machines that a call has ended and they can now delete their state information about that call. If I try to, I get the error:

app_dial.c:2245 in dial_exec_full: Caller hung up before dial.

I guess i can see why Asterisk complains about being asked to Dial() after the inbound call leg has ended, but in this case I have a reason for doing so.

Can anyone suggest how I might be able to do this? I need to perform a Dial()
command after an inbound channel has hung up. I do not expect the Dial() to bridge to anything (the context being dialled simply does some database manipulation and then hangs up without even bothering to answer).

Any suggestions welcome 🙂

Antony.


90% of networking problems are routing problems.
9 of the remaining 10% are routing problems in the other direction. The remaining 1% might be something else, but check the routing anyway.

Please reply to the list;
please *don’t* CC me.

13 thoughts on - Dial() After The H Extension Has Been Invoked?

  • Maybe you can use the “g” option in the first Dial(…) and proceed in the dial plan with the second Dial(…)

    g – Proceed with dialplan execution at the next priority in the current extension if the destination channel hangs up.

    Example:

    exten => 1234,1,Dial(SIP/deskphone,120,g)
    same => n,Dial(SIP/cordlessphone)
    same => n,Hangup()

    Extension 1234 dials a deskphone. If “deskphone” answer… bla bla bla… and after “deskphone” hangs up, the “cordlessphone” is dialed.

  • Hm, in fact I am already using the g option, because I want to detect channel states such as Unavailable and Congestion (in which case I try an alternative route to dial out with).

    I suppose if I detect the DIALSTATUS is ANSWER then I know the call got answered and has now ended.

    Sounds good – thank you 🙂

    Antony.


    I wasn’t sure about having a beard at first, but then it grew on me.

    Please reply to the list;
    please *don’t* CC me.

  • Yes, I thought of that, but it somehow feels a bit clunky, and was hoping for a neater solution 🙂

    Antony.


    Software development can be quick, high quality, or low cost.

    The customer gets to pick any two out of three.

    Please reply to the list;
    please *don’t* CC me.

  • Dialing post call to update a database is clunky. The solutions will be clunky too.

    I use a hangup handler with an AGI script. The script makes a database connection to close out the call. Much cleaner.


    http://help.nyigc.net/

  • Would you care to give a little more in the way of detail?

    I’ve never used AGI, so what would your suggested solution involve?

    Antony.


    She did not swoon, but she did get a look on her face that said ‘This conversation is over’, which Jack took as a sign he was going in the right direction.

    – Neal Stephenson, Quicksilver

    Please reply to the list;
    please *don’t* CC me.

  • Originate() does not support special SIP headers 🙁

    Antony.


    Wanted: telepath. You know where to apply.

    Please reply to the list;
    please *don’t* CC me.

  • If all you need is to update/insert/delete some rows in a database, ODBC
    could be a solution.

    I prefer to do database work in an AGI. I find quoting within the database to be obtuse and fragile. Also, I find error handling better in an AGI
    with a real programming language. Also, also, things start with ‘I just need to do x’ and frequently grow to 2SLGBTQQIA+x and you will wish you started with a real programming language.


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

  • And neither do call files. Originate supports arbitrary data, so why not pass the header info as variables and then set them in the dialplan, then do what’s necessary?

  • I already use ODBC for that purpose, and it works well.

    However, in this case it’s the Asterisk internal database, purely local to the machine, which needs manipulating.

    Antony.


    #define SIX 1+5
    #define NINE 8+1

    int main() {
    printf(“%d\n”, SIX * NINE);
    }
    – thanks to ECB for bringing this to my attention

    Please reply to the list;
    please *don’t* CC me.