我的星号拨号方案中有以下背景信息。
[start-call]
exten => _X.,1,AGI(agi://localhost:4000)
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect)
exten => _X.,1000(redirect),Hangup(31)
exten => 900,n,Goto(start-call,${EXTEN},1)
exten => h,n,Hangup
我有一个AGI应用程序连接呼叫并收集DTMF输入,并使用SET EXTENSION agi命令(第1行)将该号码设置为扩展名。只有在没有DTMF输入时才将AGISTATUS设置为FAILURE。如果没有输入,我会超时,并挂断(第3行)。但如果输入900,我会回到起始调用上下文并在AGI应用程序中做一些魔术(第4行)。
问题在于,即使我输入900,电话也会被挂断。而不是从第3行到最后一行。所以它以某种方式跳过第4行。如果我在标记为重定向(第3行)之前移动900扩展名(第4行),则可以正常工作。
我认为星号会自动增加' n '优先级,并且可以按照上面列出的顺序运行。我错了吗?
答案 0 :(得分:3)
n
自动迭代 - 它将之前的优先级加1。这也是你必须在第一行初始化优先级为1的增量器的原因。
当您将优先级1000置于中间位置(完全有效)时,n
的下一行将为此添加1,从而产生优先级1001 - 这是其他人已经解释过的永远不会被命中的。
您的拨号方案可以如下所示阅读:
[start-call]
exten => _X.,1,AGI(agi://localhost:4000)
exten => _X.,2,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect)
exten => _X.,1000(redirect),Hangup(31)
exten => 900,1001,Something() ; not 3!
exten => h,1,Hangup
要解决此问题,您必须按其他人的说明重新排序您的扩展程序,或使用+
运算符来确定优先级:
[start-call]
exten => _X.,1,AGI(agi://localhost:4000) ; 1
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect) ; 2
exten => _X.,n+1000(redirect),Hangup(31) ; 1002
exten => 900,n,Something() ; 3
exten => h,1,Hangup
顺便说一句,你也可以使用文字标签作为扩展名,这将使你的拨号方案更具可读性:
[start-call]
exten => _X.,1,AGI(agi://localhost:4000) ; 1
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?agi_failure,1) ; 2
exten => 900,n,Something() ; 3
exten => agi_failure,1,DoSomething()
exten => agi_failure,n,DoEvenMore()
exten => h,1,Hangup
答案 1 :(得分:1)
拨号方案必须是连续的。 Ext 1000永远不会被击中 - 因此星号会落到h exten。
答案 2 :(得分:0)
是的,拨号方案必须是连续的,一旦你启动“n”系列,你需要坚持使用它。我假设扩展900是DTMF输入的一个示例 - 这个新扩展必须始终以优先级1开始。“h”扩展也必须以1的优先级开始
[start-call]
exten => _X.,1,AGI(agi://localhost:4000)
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect)
exten => _X.,n,**if input received do something here**
exten => _X.,n(redirect),Hangup(31)
exten => 900,1,Goto(start-call,${EXTEN},1)
exten => h,1,Hangup