2

如果第一个命令很忙或无论如何都失败,我正在尝试让我的 php-agi 脚本拨打下一个命令。我现在设置它的方式不只是工作,它只是返回忙然后死,或者如果它工作,它会发送两个拨号命令。这是我得到的:

$agi->exec('DIAL',"SIP/".$target."@".$ip.",30,g");
$agi->exec('DIAL',"SIP/".$target."@".$ip2.",30,g");

非常感谢您对此提供的任何帮助,在此先感谢您!

4

2 回答 2

6

当您调用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");
    }

所以逻辑很简单,只要第一个电话没有被接听,就打电话。

于 2012-11-23T05:10:08.077 回答
0

要说的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。

于 2012-09-06T21:01:02.957 回答