Dial() After The H Extension Has Been Invoked?
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.
—
Create a spool file from the ‘h’ extension to generate the call.
—
http://help.nyigc.net/
—
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.
—
Use Originate() instead of spooling a call file, so it’s a single line of dialplan. Much less clunky 🙂
—
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/
—
How about creating a call file in the h extension?
—
Thanks in advance,
————————————————————————-
Steve Edwards sedwards@sedwards.com Voice: +1-760-468-3867 PST
https://www.linkedin.com/in/steve-edwards-4244281
—
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
—
s/database/dialplan/g
—
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.
—