Hi. Has anyone had any success in implementing a callback or ringback function in Asterisk? I've had a look at the callback-voicemail example on voip-info.org http://www.voip-info.org/wiki/view/Asterisk+tips+callback However it won't quite work for me. I need it for local SIP users which most of them don't have voicemail. If one SIP user calls another SIP user and the second user is busy or unavailable then Asterisk should inform the first user that the number they dialed is busy and hangup the call. Once the second caller is available again then Asterisk should initiate a call back to both the users and connect them. Any ideas on how to achieve this will be appreciated. Thanks, Richard .
Richard Soderblom wrote:> Hi. > > Has anyone had any success in implementing a callback or ringback > function in Asterisk? > > I've had a look at the callback-voicemail example on voip-info.org > http://www.voip-info.org/wiki/view/Asterisk+tips+callback > However it won't quite work for me. > > I need it for local SIP users which most of them don't have voicemail. > If one SIP user calls another SIP user and the second user is busy or > unavailable then Asterisk should inform the first user that the number > they dialed is busy and hangup the call. > > Once the second caller is available again then Asterisk should initiate > a call back to both the users and connect them. > > Any ideas on how to achieve this will be appreciated.Richard, That shouldn't be too difficult to do. I recently wrote an agi binary that does nag calling for me which I think is related to what you want to do except that I am doing more calling out of the system. Maybe deadagi could work? Here is it's use in a AEL macro I'm working on: http://www.datatrakpos.com/pos/datatalk/images/nagcall.htm The AGI (nagcall) simply takes some parameters and uses them to create a .call file. See: http://www.voip-info.org/tiki-index.php?page=Asterisk+auto-dial+out There is even an example on the page above that shows using the linux "touch" command to schedule the call to take place at a later time, although I have not successfully done this yet...still trying. The biggest difference is that you will need a way to monitor the called extension to trigger a call back to the original caller using maybe deadagi or .call files? http://www.voip-info.org/wiki/index.php?page=Asterisk+manager+API I'm pretty new to asterisk myself so there may be (probably are) other ways to do this, but this is where I would start poking around. -- Warm Regards, Lee
Enclosed bellow is the fragment from extenstions.conf which does two things:
*41 - Does the ring-back staff.
*42 - Calls back the last one who called you.
Regards, __Yehavi:
; regular local extensions:
; The flow is: If not available or no answer send to mailbox if exists,
; send busy if no mailbox. Same for busy.
; We try to avoid the n+101 rule whenever possible, but it is not always
; possible as HasVoiceMailbox() does only n+101 jump.
exten => _999XX,1,Set(_To=${EXTEN}) ; Save the original extension dialled.
exten => _999XX,n,Set(_From=${CALLERID(num)}) ; Save the caller.
; Save the caller number at the called extension for *42 usage.
exten => _999XX,n,Set(DB(${To}/LastCaller)=${From})
; Where we called for *41
exten => _999XX,n,Set(DB(${From}/LastCalled)=${To})
; Now dial the extension.
exten => _999XX,n,Dial(SIP/${EXTEN},20,) ; Dial the phone for 20 seconds.
; No answer or busy
exten => _999XX,n,GoTo(s-${DIALSTATUS},1) ; Jump according to the failure
mode
exten => _999XX,n,Hangup() ; Just to be sure...
; No answer:
exten => s-NOANSWER,1,MailboxExists(${To}|j); Has a mailbox?
exten => s-NOANSWER,n,Busy() ; No maibox = play busy.
exten => s-NOANSWER,102,VoiceMail(u${To}) ; Has mailbox - send the call to
there
; Busy:
exten => s-BUSY,1,MailboxExists(${To}|j); Has a mailbox?
exten => s-BUSY,n,Busy() ; No maibox = play busy.
exten => s-BUSY,102,VoiceMail(b${To}) ; Has mailbox - send the call to there
; Unavailable channel - act as busy:
exten => s-CHANUNAVAIL,1,Goto(s-BUSY,1);
; Called here when the call is successfull and the user hanged the phone.
; Check whether the user has a waiting callback queued on him/her
exten => h,1,NoOp(${From} ${To} ${EXTEN})
exten => h,2,Set(tmp=${DB(${From}/CallBack)}) ; Get who is waiting for us
exten => h,3,NoOp(${From} ${tmp})
exten => h,4,GotoIf($[ ${tmp} ]?5:103) ; Anyone waiting for us?
exten => h,5,DBdel(${From}/CallBack) ; And delete it...
; Create the callfile and then move it to the spool directory to make the call.
exten => h,6,System(echo Channel: SIP/${tmp} > /tmp/test.tmp${To})
exten => h,7,System(echo WaitTime: 20 >> /tmp/test.tmp${To})
exten => h,8,System(echo Extension: ${From} >> /tmp/test.tmp${To})
exten => h,9,System(echo CallerID: Callback \\\<${tmp}\\\> >>
/tmp/test.tmp${To})
exten => h,10,System(mv /tmp/test.tmp${To} /var/spool/asterisk/outgoing/)
exten => h,103,NoOp(Nothing to call)
; *42: Get the last number who called us, say it and call it.
exten => *42,1,Set(tmp=${DB(${CALLERID(num)}/LastCaller})
exten => *42,n,SayDigits(${tmp})
exten => *42,n,Goto(${tmp},1)
; *41: Camp on the last extension dialled
exten => *41,1,Set(tmp=${DB(${CALLERID(num)}/LastCalled)})
exten => *41,n,SayDigits(${tmp})
; Save it so when the other side hangs it will see it and dial us.
exten => *41,n,Set(DB(${tmp}/CallBack)=${CALLERID(num)})
exten => *41,n,Hangup()
Network Configurations
Block D, Surrey Park, Barham Road, Westville, 3610
Helpdesk: (086) 163-8266
Tel: (031) 266-1563
Fax: (031) 266-4206
Excellent little script. Thanks, Yehavi.
Best Regards
Richard Soderblom
Network Configurations
Cell:
E-Mail: Richard@netconfig.co.za
--------------------------------------------------------
Number of Attachments: 0
This message (and any associated files) is intended only for the use of the
individual or entity to which it is addressed and may contain information that
is confidential, subject to copyright or constitutes a trade secret. If you are
not the intended recipient you are hereby notified that any dissemination,
copying or distribution of this message, or files associated with this message,
is strictly prohibited. If you have received this message in error, please
notify us immediately by replying to the message and deleting it from your
computer. Messages sent to and from us may be monitored. Any views or opinions
presented are solely those of the author and do not necessarily represent those
of the company.
-----Original Message-----
From: Yehavi Bourvine +972-8-9489444 [mailto:YEHAVI@VMS.HUJI.AC.IL]
Sent: 18 January 2007 07:40 AM
To: asterisk-users@lists.digium.com
Subject: Re: [asterisk-users] Callback/ringback
Enclosed bellow is the fragment from extenstions.conf which does two
things:
*41 - Does the ring-back staff.
*42 - Calls back the last one who called you.
Regards, __Yehavi:
; regular local extensions:
; The flow is: If not available or no answer send to mailbox if exists,
; send busy if no mailbox. Same for busy.
; We try to avoid the n+101 rule whenever possible, but it is not always
; possible as HasVoiceMailbox() does only n+101 jump.
exten => _999XX,1,Set(_To=${EXTEN}) ; Save the original extension
dialled.
exten => _999XX,n,Set(_From=${CALLERID(num)}) ; Save the caller.
; Save the caller number at the called extension for *42 usage.
exten => _999XX,n,Set(DB(${To}/LastCaller)=${From})
; Where we called for *41
exten => _999XX,n,Set(DB(${From}/LastCalled)=${To})
; Now dial the extension.
exten => _999XX,n,Dial(SIP/${EXTEN},20,) ; Dial the phone for 20
seconds.
; No answer or busy
exten => _999XX,n,GoTo(s-${DIALSTATUS},1) ; Jump according to the
failure mode
exten => _999XX,n,Hangup() ; Just to be sure...
; No answer:
exten => s-NOANSWER,1,MailboxExists(${To}|j); Has a mailbox?
exten => s-NOANSWER,n,Busy() ; No maibox = play busy.
exten => s-NOANSWER,102,VoiceMail(u${To}) ; Has mailbox - send the call
to there
; Busy:
exten => s-BUSY,1,MailboxExists(${To}|j); Has a mailbox?
exten => s-BUSY,n,Busy() ; No maibox = play busy.
exten => s-BUSY,102,VoiceMail(b${To}) ; Has mailbox - send the call to
there
; Unavailable channel - act as busy:
exten => s-CHANUNAVAIL,1,Goto(s-BUSY,1);
; Called here when the call is successfull and the user hanged the
phone.
; Check whether the user has a waiting callback queued on him/her
exten => h,1,NoOp(${From} ${To} ${EXTEN})
exten => h,2,Set(tmp=${DB(${From}/CallBack)}) ; Get who is waiting for
us
exten => h,3,NoOp(${From} ${tmp})
exten => h,4,GotoIf($[ ${tmp} ]?5:103) ; Anyone waiting for us?
exten => h,5,DBdel(${From}/CallBack) ; And delete it...
; Create the callfile and then move it to the spool directory to make
the call.
exten => h,6,System(echo Channel: SIP/${tmp} > /tmp/test.tmp${To})
exten => h,7,System(echo WaitTime: 20 >> /tmp/test.tmp${To})
exten => h,8,System(echo Extension: ${From} >> /tmp/test.tmp${To})
exten => h,9,System(echo CallerID: Callback \\\<${tmp}\\\> >>
/tmp/test.tmp${To})
exten => h,10,System(mv /tmp/test.tmp${To}
/var/spool/asterisk/outgoing/)
exten => h,103,NoOp(Nothing to call)
; *42: Get the last number who called us, say it and call it.
exten => *42,1,Set(tmp=${DB(${CALLERID(num)}/LastCaller})
exten => *42,n,SayDigits(${tmp})
exten => *42,n,Goto(${tmp},1)
; *41: Camp on the last extension dialled
exten => *41,1,Set(tmp=${DB(${CALLERID(num)}/LastCalled)})
exten => *41,n,SayDigits(${tmp})
; Save it so when the other side hangs it will see it and dial us.
exten => *41,n,Set(DB(${tmp}/CallBack)=${CALLERID(num)})
exten => *41,n,Hangup()