我试图让我的php-agi脚本拨打下一个命令,如果第一个命令忙或者无论如何都失败了。我现在设置它的方式不仅仅是工作,它只是返回繁忙然后死亡,或者如果它工作,它将发送两个拨号命令。这就是我得到的:
$agi->exec('DIAL',"SIP/".$target."@".$ip.",30,g");
$agi->exec('DIAL',"SIP/".$target."@".$ip2.",30,g");
非常感谢任何形式的帮助,谢谢你提前!
答案 0 :(得分:6)
当您致电Dial()
星号时,设置一个名为DIALSTATUS的频道变量。
您可以从AGI中阅读。
来自CLI的核心节目应用拨号"的输出:
${DIALSTATUS}: This is the status of the call
CHANUNAVAIL
CONGESTION
NOANSWER
BUSY
ANSWER
CANCEL
DONTCALL: For the Privacy and Screening Modes. Will be set if the
called party chooses to send the calling party to the 'Go Away' script.
TORTURE: For the Privacy and Screening Modes. Will be set if the
called party chooses to send the calling party to the 'torture' script.
INVALIDARGS
实施例
$agi->exec('DIAL',"SIP/".$target."@".$ip.",30,g");
$dialstatus = $agi->get_variable('DIALSTATUS');
if ( $dialstatus != 'ANSWERED' ) {
$agi->exec('DIAL',"SIP/".$target."@".$ip2.",30,g");
}
所以逻辑只是在没有应答第一个呼叫的情况下进行呼叫。
答案 1 :(得分:0)
g
的{{1}}标记表示(根据您使用的Asterisk版本,可能略有不同):
g:继续当前下一个优先级的拨号方案执行 如果目标频道挂断,则为。
你面临的问题是Dial
没有从拨号方案执行,而是由你的AGI执行,所以当Dial
退出时,这就是故事的结束。
为了完成这项工作,我会做这样的事情......
首先,打开Dial
并在最后添加一些内容(这是未经测试的):
[failover] exten => doit,1,Dial(SIP/${TARGET}@${IP1},30,g) exten => doit,n,Dial(SIP/${TARGET}@${IP2},30,g)
然后,在你的AGI中:
extensions.conf
然后启动Asterisk CLI并重新加载拨号方案:
user@host:~$ asterisk -r *CLI> dialplan reload
现在当AGI退出时,它应该降至// These set the necessary variables
$agi->set_variable('TARGET', $target);
$agi->set_variable('IP1', $ip);
$agi->set_variable('IP2', $ip2);
// And tell Asterisk where to go after the AGI exits
$agi->set_context('failover');
$agi->set_extension('doit');
$agi->set_priority(1);
exit(0);
上下文并为您执行failover
,如果第一个因任何原因失败,则会落到第二个Dial
。< / p>
如果您需要在两次 Dial
次尝试后进行更多处理,您将需要在拨号方案中执行此操作,或者您必须在事后启动另一个AGI。