星号agi调用失败,然后是下一个



如果第一个命令繁忙或出现故障,我正试图让我的php-agi脚本拨打下一个命令。我现在设置它的方式不仅有效,它只是返回繁忙状态,然后停止工作,或者如果有效,它会发送两个拨号命令。我得到的是:

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

非常感谢您在这方面的任何帮助,提前感谢!

当您调用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

Ex。

    $agi->exec('DIAL',"SIP/".$target."@".$ip.",30,g");
    $dialstatus = $agi->get_variable('DIALSTATUS');
    if ( $dialstatus != 'ANSWERED' ) {
      $agi->exec('DIAL',"SIP/".$target."@".$ip2.",30,g");
    }

因此,逻辑是只在第一个呼叫没有得到应答的情况下进行呼叫。

Dialg标志表示(根据您使用的Asterisk版本,它可能略有不同):

g: 在当前的下一优先级执行拨号计划如果目标频道挂断,则扩展

你面临的问题是,Dial不是从拨号计划中执行的,而是由你的AGI执行的,所以当Dial退出时,故事就结束了。

为了让这个工作,我会做这样的事情。。。

首先,打开extensions.conf,并在末尾添加以下内容(这是未经测试的):

[故障切换]extent=>doit,1,拨号(SIP/${TARGET}@${IP1},30,g)extent=>doit,n,拨号(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并重新加载拨号计划:

user@host:~$星号-r*CLI>重新加载拨号计划

现在,当AGI退出时,它应该下降到failover上下文,并为您执行Dial,如果第一个Dial由于任何原因失败,则会下降到第二个。

如果在两次Dial尝试后都需要进行更多处理,则必须在拨号计划中进行处理,或者必须在事后启动另一个AGI。

相关内容

最新更新