Vas*_*asu 0 telephony asterisk
我的星号拨号计划中有以下上下文。
[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
Run Code Online (Sandbox Code Playgroud)
我有一个 AGI 应用程序,它连接呼叫并收集 DTMF 输入,并使用 SET EXTENSION agi 命令(第 1 行)将该号码设置为分机号。仅当没有 DTMF 输入时,我才将 AGISTATUS 设置为 FAILURE。如果没有输入,我就会超时并挂断(第 3 行)。但是,如果输入 900,我将返回到启动调用上下文,并在 AGI 应用程序中执行一些操作(第 4 行)。
问题是,现在即使我输入 900,电话也会挂断。不是从第 3 行开始,而是从最后一行开始。所以它以某种方式跳过了第 4 行。如果我将 900 分机(第 4 行)移到标记为重定向的分机(第 3 行)之前,它就会起作用。
我认为星号会自动增加“ n ”优先级,并希望它按照上面列出的顺序工作。我这里错了吗?
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
Run Code Online (Sandbox Code Playgroud)
要解决此问题,您必须按照其他人的说明重新排序您的扩展,或者使用+运算符确定优先级:
[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
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您还可以使用文本标签作为扩展名,这将使您的拨号计划更具可读性:
[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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2973 次 |
| 最近记录: |