【问题标题】:Dialplan execution order拨号计划执行顺序
【发布时间】:2011-12-29 11:58:34
【问题描述】:

我的星号拨号方案中有以下上下文。

[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行。如果我将 900 扩展(第 4 行)移到标有 redirect(第 3 行)的扩展之前,它会起作用。

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

【问题讨论】:

    标签: asterisk telephony


    【解决方案1】:

    n 自动迭代 - 它在 previous 优先级上加 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
    

    【讨论】:

      【解决方案2】:

      拨号方案必须是连续的。分机 1000 永远不会被击中 - 因此星号落在 h 分机上。

      【讨论】:

      • 但是优先级'n'不应该自动排序吗?即使没有达到 1000,星号不应该移动到下一个优先级 'n' 行吗?
      • 拨号方案 MUS 似乎是连续的。很奇怪,我知道。但这毕竟是 Asterisk……
      • 查看我的回答以了解为什么它必须是“连续的”。事实上,它必须不是只有连续的才能给你预期的结果。
      【解决方案3】:

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

      【讨论】:

      • 实际上,exten => 900,1,Goto(start-call,${EXTEN},1) 将导致无限循环、非工作调用和许多 CPU 周期的浪费。替换_X。 900 只为一个优先级是完全有效的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      相关资源
      最近更新 更多