[asterisk-users] Callback on busy

Steve Edwards asterisk.org at sedwards.com
Fri Jan 27 11:05:42 CST 2017


On Fri, 27 Jan 2017, Michele Pinassi wrote:

> i'm using Asterisk as a media box for a VoIP network based on OpenSIPS.
> When an user phone is busy, call was forwarded to an asterisk ext:
>
> ; ===========================================
> ; Voicemail on NOT AVAILABLE
> ; ===========================================
> exten => _VMR_.,1,Noop("from-voip: ${CALLERID(num)} ${EXTEN}")
> exten => _VMR_.,n,Set(DID=${EXTEN:4})
> exten => _VMR_.,n,Answer()
> exten => _VMR_.,n,Wait(1)
> exten => _VMR_.,n,GotoIf(${VM_INFO(${DID},exists)}?avail:unavail)
> exten => _VMR_.,n(avail),Voicemail(${DID},u)
> exten => _VMR_.,n,Hangup()
> exten => _VMR_.,n(unavail),Playback(vm-theperson)
> exten => _VMR_.,n,SayDigits(${DID});
> exten => _VMR_.,n,Playback(vm-isunavail)
> exten => _VMR_.,n,Read(digit,vm-tocallback,1,,1,5)
> exten => _VMR_.,n,Gotoif($["${digit}" = "2"]?:skip,1,5)
> exten => _VMR_.,n,Noop("Add callback for ${DID} from ${CALLERID(num)}")
> exten => _VMR_.,n,AGI(callback,${DID},${CALLERID(num)})
> exten => _VMR_.,n,Playback(goodbye)
> exten => _VMR_.(skip),n,Hangup()
>
> when a vocal message asks to press "2" to add a callback when called
> users return free, using an AGI script that create a .call file:

> #!/usr/bin/php -q
> <?php
>
> ob_implicit_flush(true);
> set_time_limit(0);
>
> $called = $argv[1];
> $caller = $argv[2];
>
> $cf =
> fopen("/var/spool/asterisk/outgoing/cb".$called."-".$caller.".call","w+");
> fputs($cf,"Channel: LOCAL/CB_$called\n");
> fputs($cf,"Context: default\n");
> fputs($cf,"Extension: $caller\n");
> fputs($cf,"CallerID: CallBack $caller <$caller>\n");
> fputs($cf,"MaxRetries: 100\n");
> fputs($cf,"RetryTime: 30\n");
> fputs($cf,"Archive: Yes\n");
> fputs($cf,"SetVar: CALLER=$caller\n");
> fputs($cf,"SetVar: CALLED=$called\n");
> fclose($cf);
>
> ?>

0) This is not an AGI script. It does not read the AGI environment from 
STDIN and does not make any AGI requests. You could execute it using the 
system() application and it should execute the same -- maybe a couple of 
nanoseconds faster because Asterisk does not need to create the AGI 
environment or fiddle with file descriptors.

1) You should not create the call file in the spool directory. Doing so 
introduces a 'race condition' where Asterisk could start to read the file 
before your script is finished writing it. You should create the call file 
in another directory on the same file system and 'mv' it to the spool 
directory. /tmp/ or /var/tmp/ are usually suitable. ('mv' is 'atomic' -- 
it happens all at once.)

2) Visit http://www.voip-info.org/wiki/view/Asterisk+auto-dial+out to 
learn more about the call file format.

Think of call files in terms of legs. The first leg uses the 'channel' 
argument to originate the call. If that call is answered, 'leg 2' 
execution continues either in the dialplan at 'context:extension:priority' 
or the 'application:data' is executed.

Visit http://www.voip-info.org/wiki/view/Asterisk+local+channels to learn 
more about local channels. I think the syntax section will be most 
helpful.

> I need that Asterisk call CALLED user and, when answered, start calling 
> CALLER.

Yes, but the concept of 'answered' is vague if you are using analog 
channels.

Visit http://www.voip-info.org and search for 'asterisk call back' for 
examples of how others have approached this problem.

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



More information about the asterisk-users mailing list