Asterisk 拨号计划执行命令

Asterisk 拨号计划执行命令,asterisk,telephony,Asterisk,Telephony,我的星号拨号计划中有以下内容 [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,Hangu

我的星号拨号计划中有以下内容

[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,电话也会挂断。不是第三行而是最后一行。所以它不知怎么跳过了第四行。如果我将900分机(第4行)移到标有重定向的分机(第3行)之前,它就会工作


我认为星号会自动增加“n”优先级,并希望它按照上面列出的顺序工作。我错了吗?

拨号计划必须是连续的。Ext 1000永远不会被点击-因此星号会一直延伸到h扩展。

拨号计划必须是连续的。Ext 1000永远不会被点击-因此星号会一直延伸到h扩展。

是的,拨号计划必须是连续的,一旦开始“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

是的,拨号计划必须是连续的,一旦你开始“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

n
自动迭代-它将在前一优先级上添加1。这也是为什么您必须在第一行中使用优先级1初始化incrementor

当你把优先级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

n
自动迭代-它将在前一优先级上添加1。这也是为什么您必须在第一行中使用优先级1初始化incrementor

当你把优先级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

但优先级“n”不应该自动排序吗?即使没有达到1000,星号不应该移到下一个优先级“n”行吗?它似乎是连续的。奇怪,我知道。但这毕竟是星号…看看我的答案,了解为什么它必须是“连续的”。事实上,它不能,但只有连续才能得到预期的结果。但优先级“n”不应该自动排序吗?即使没有达到1000,星号不应该移到下一个优先级“n”行吗?它似乎是连续的。奇怪,我知道。但这毕竟是星号…看看我的答案,了解为什么它必须是“连续的”。实际上,
ext=>900,1,Goto(start call,${exten},1)
将导致无限循环、无效调用和许多CPU周期浪费。用900代替单个优先级是完全有效的。实际上,
ext=>900,1,Goto(start call,${extn},1)
将导致无限循环、无效调用和许多CPU周期浪费。用900代替单个优先级是完全有效的。