如果第一个命令很忙或无论如何都失败,我正在尝试让我的 php-agi 脚本拨打下一个命令。我现在设置它的方式不只是工作,它只是返回忙然后死,或者如果它工作,它会发送两个拨号命令。这是我得到的:
$agi->exec('DIAL',"SIP/".$target."@".$ip.",30,g");
$agi->exec('DIAL',"SIP/".$target."@".$ip2.",30,g");
非常感谢您对此提供的任何帮助,在此先感谢您!
当您调用Dial()
星号时,会设置一个名为 DIALSTATUS 的通道变量。您可以从 AGI 中读取它。
来自 CLI 的“core show application Dial”的输出:
${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");
}
所以逻辑很简单,只要第一个电话没有被接听,就打电话。
要说的g
标志Dial
(根据您使用的 Asterisk 版本可能会略有不同):
g:如果目标通道挂断,则在当前分机中以下一个优先级继续执行拨号计划。
您面临的问题Dial
是不是从拨号计划执行的,而是由您的 AGI 执行的,所以当Dial
退出时,这就是故事的结尾。
为了使这项工作,我会做这样的事情......
首先,打开extensions.conf
并在最后添加一些内容(未经测试):
[故障转移] exten => doit,1,Dial(SIP/${TARGET}@${IP1},30,g) exten => doit,n,Dial(SIP/${TARGET}@${IP2},30,g)
然后,在您的 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);
然后启动 Asterisk CLI 并重新加载拨号方案:
用户@主机:~$ 星号 -r *CLI> 拨号方案重载
现在,当 AGI 退出时,它应该回到failover
上下文并为你做这件事,如果第一个因任何原因失败,它Dial
会进入第二个。Dial
如果您需要在两次 Dial
尝试后进行更多处理,您要么必须在拨号计划中进行,要么必须在事后启动另一个 AGI。