星号agi呼叫失败然后接下来

时间:2012-09-06 10:39:28

标签: asterisk agi

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

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

非常感谢任何形式的帮助,谢谢你提前!

2 个答案:

答案 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。