[Asterisk-Users] Busy Signals after hangup

Andrew Kohlsmith akohlsmith-asterisk at benshaw.com
Mon Jun 5 06:34:38 MST 2006


On Saturday 03 June 2006 14:06, Rick Smith wrote:
> The call gets made, I leave a voicemail, or complete the call in some
> manner, and the other side hangs up.  I hear a busy signal on the phone
> on my end.

I'll bet a donut it's not a busy signal but rather a "fast busy" which is 
known as a congestion signal.

Asterisk is giving that to you because it has nothing else to do in the 
dialplan.  This is what I do on all my installations to make it behave more 
like the phone company:

exten => 19999999999,1,Answer()
exten => 19999999999,n,Dial(SIP/100,20,g)
exten => 19999999999,n,Macro(handle-hangup)

(the trick is to make sure that 'g' is in the Dial() options, as it instructs 
Dial() to continue on in the dialplan after the channel is hung up.  An 
alternative would be to trap the 'h' (hangup) extension and call the macro as 
well.

The macro is pretty straightforward.  Don't be put off by its size.  It tries 
to do the right thing, and can handle PRI hangup causes:

-----------8<----------------------8<--------------------------8<-------------------
; handle hangup macro
; this macro attempts to go though and do something intelligent with the 
HANGUPCAUSE and DIALSTATUS
[macro-handle-hangup]
exten => s,1,NoOp(HANGUPCAUSE is ${HANGUPCAUSE} and DIALSTATUS is 
${DIALSTATUS})
exten => s,n,GotoIf($[${HANGUPCAUSE} = 0]?s,nohc)
exten => s,n,Goto(hc-${HANGUPCAUSE},1)
exten => s,n(nohc),GotoIf($[${DIALSTATUS} = ANSWER]?hc-16,1)
exten => s,n,GotoIf($[${DIALSTATUS} = BUSY]?hc-17,1)
exten => s,n,GotoIf($[${DIALSTATUS} = NOANSWER]?hc-19,1)
exten => s,n,GotoIf($[${DIALSTATUS} = CONGESTION]?hc-42,1)
exten => s,n,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?hc-44,1)
exten => s,n,GotoIf($[${DIALSTATUS} = CANCEL]?hc-0,1)
exten => s,n,Goto(hc-0,n)

exten => hc-0,1,NoOp(${HANGUPCAUSE} - Not Defined)
exten => hc-0,n,Goto(ind-congestion,1)
exten => hc-1,1,NoOp(${HANGUPCAUSE} - Unallocated)
exten => hc-1,n,Goto(ind-outofservice,1)
exten => hc-2,1,NoOp(${HANGUPCAUSE} - No Route to Transit Network)
exten => hc-2,n,Goto(ind-congestion,1)
exten => hc-3,1,NoOp(${HANGUPCAUSE} - No Route to Destination)
exten => hc-3,n,Goto(ind-congestion,1)
exten => hc-6,1,NoOp(${HANGUPCAUSE} - Channel Unacceptable)
exten => hc-6,n,Goto(ind-congestion,1)
exten => hc-7,1,NoOp(${HANGUPCAUSE} - Call Awarded Delivered)
exten => hc-7,n,Goto(ind-hangup,1)
exten => hc-16,1,NoOp(${HANGUPCAUSE} - Normal Clearing)
exten => hc-16,n,Goto(ind-hangup,1)
exten => hc-17,1,NoOp(${HANGUPCAUSE} - User Busy)
exten => hc-17,n,Goto(ind-busy,1)
exten => hc-18,1,NoOp(${HANGUPCAUSE} - No User Response)
exten => hc-18,n,Goto(ind-hangup,1)
exten => hc-19,1,NoOp(${HANGUPCAUSE} - No Answer)
exten => hc-19,n,Goto(ind-hangup,1)
exten => hc-21,1,NoOp(${HANGUPCAUSE} - Call Rejected)
exten => hc-21,n,Goto(ind-outofservice,1)
exten => hc-22,1,NoOp(${HANGUPCAUSE} - Number Changed)
exten => hc-22,n,Goto(ind-outofservice,1)
exten => hc-27,1,NoOp(${HANGUPCAUSE} - Destination Out-of-Order)
exten => hc-27,n,Goto(ind-outofservice,1)
exten => hc-28,1,NoOp(${HANGUPCAUSE} - Invalid Number Format)
exten => hc-28,n,Goto(ind-congestion,1)
exten => hc-29,1,NoOp(${HANGUPCAUSE} - Facility Rejected)
exten => hc-29,n,Goto(ind-congestion,1)
exten => hc-30,1,NoOp(${HANGUPCAUSE} - Response to Status Enquiry)
exten => hc-30,n,Goto(ind-hangup,1)
exten => hc-31,1,NoOp(${HANGUPCAUSE} - Normal Unspecified)
exten => hc-31,n,Goto(ind-hangup,1)
exten => hc-34,1,NoOp(${HANGUPCAUSE} - Normal Circuit Congestion)
exten => hc-34,n,Goto(ind-congestion,1)
exten => hc-38,1,NoOp(${HANGUPCAUSE} - Network Out-of-Order)
exten => hc-38,n,Goto(ind-congestion,1)
exten => hc-41,1,NoOp(${HANGUPCAUSE} - Normal Temporary Failure)
exten => hc-41,n,Goto(ind-congestion,1)
exten => hc-42,1,NoOp(${HANGUPCAUSE} - Switch Congestion)
exten => hc-42,n,Goto(ind-congestion,1)
exten => hc-43,1,NoOp(${HANGUPCAUSE} - Access Information Discarded)
exten => hc-43,n,Goto(ind-hangup,1)
exten => hc-44,1,NoOp(${HANGUPCAUSE} - Requested Channel Unavailable)
exten => hc-44,n,Goto(ind-congestion,1)
exten => hc-45,1,NoOp(${HANGUPCAUSE} - Pre-Empted)
exten => hc-45,n,Goto(ind-congestion,1)
exten => hc-50,1,NoOp(${HANGUPCAUSE} - Facility Not Subscribed)
exten => hc-50,n,Goto(ind-congestion,1)
exten => hc-52,1,NoOp(${HANGUPCAUSE} - Outgoing Call Barred)
exten => hc-52,n,Goto(ind-congestion,1)
exten => hc-54,1,NoOp(${HANGUPCAUSE} - Incoming Call Barred)
exten => hc-54,n,Goto(ind-congestion,1)
exten => hc-57,1,NoOp(${HANGUPCAUSE} - Bearer Capability Not Authorized)
exten => hc-57,n,Goto(ind-congestion,1)
exten => hc-58,1,NoOp(${HANGUPCAUSE} - Bearer Capability Not Available)
exten => hc-58,n,Goto(ind-congestion,1)
exten => hc-65,1,NoOp(${HANGUPCAUSE} - Bearer Capability Not Implemented)
exten => hc-65,n,Goto(ind-congestion,1)
exten => hc-66,1,NoOp(${HANGUPCAUSE} - Channel Not Implemented)
exten => hc-66,n,Goto(ind-congestion,1)
exten => hc-69,1,NoOp(${HANGUPCAUSE} - Facility Not Implemented)
exten => hc-69,n,Goto(ind-congestion,1)
exten => hc-81,1,NoOp(${HANGUPCAUSE} - Invalid Call Reference)
exten => hc-81,n,Goto(ind-congestion,1)
exten => hc-88,1,NoOp(${HANGUPCAUSE} - Incompatible Destination)
exten => hc-88,n,Goto(ind-congestion,1)
exten => hc-95,1,NoOp(${HANGUPCAUSE} - Invalid Message - Unspecified)
exten => hc-95,n,Goto(ind-congestion,1)
exten => hc-96,1,NoOp(${HANGUPCAUSE} - Mandatory IE Missing)
exten => hc-96,n,Goto(ind-congestion,1)
exten => hc-97,1,NoOp(${HANGUPCAUSE} - Message Type Nonexistant)
exten => hc-97,n,Goto(ind-congestion,1)
exten => hc-98,1,NoOp(${HANGUPCAUSE} - Wrong Message)
exten => hc-98,n,Goto(ind-congestion,1)
exten => hc-99,1,NoOp(${HANGUPCAUSE} - IE Nonexistant)
exten => hc-99,n,Goto(ind-congestion,1)
exten => hc-100,1,NoOp(${HANGUPCAUSE} - Invalid IE Contents)
exten => hc-100,n,Goto(ind-congestion,1)
exten => hc-101,1,NoOp(${HANGUPCAUSE} - Wrong Call State)
exten => hc-101,n,Goto(ind-congestion,1)
exten => hc-102,1,NoOp(${HANGUPCAUSE} - Recovery on Timer Expire)
exten => hc-102,n,Goto(ind-congestion,1)
exten => hc-103,1,NoOp(${HANGUPCAUSE} - Mandatory IE Length Error)
exten => hc-103,n,Goto(ind-congestion,1)
exten => hc-111,1,NoOp(${HANGUPCAUSE} - Protocol Error)
exten => hc-111,n,Goto(ind-congestion,1)
exten => hc-127,1,NoOp(${HANGUPCAUSE} - Internetworking)
exten => hc-127,n,Goto(ind-congestion,1)

exten => ind-hangup,1,Wait(30)
exten => ind-hangup,n,Hangup
exten => ind-busy,1,Busy
exten => ind-congestion,1,Congestion
exten => ind-outofservice,1,Zapateller
-----------8<----------------------8<--------------------------8<-------------------

You can simplify that macro considerably if you want, but honestly it's not 
going to hurt anything to leave it as is.  As you can see, it first checks to 
see if there is a specific hangupcause and tries to parse it.  Failing that, 
it will look at the ${DIALSTATUS} variable (which is what Dial() sets) and 
does the right thing based on that, by mapping the dial status to the closest 
PRI hangup cause.  The hangup cause is then printed to the screen and the 
correct action is taken: indicating busy, congestion, SIT or simply hanging 
up.  Hanging up waits 30 seconds to provide lots of "dead air" like the 
telephone company does.  

For bonus marks you could change the ind-hangup to provide dialtone and read 
the next extension to dial after 30 seconds, and after timing out to play 
"please hang up and try your call again", and after saying that a few times 
to play some really loud and annoying tone to wake you up... just like the 
telco.

I find this macro works very well.

-A.





More information about the asterisk-users mailing list