【问题标题】:Finding proper hangup reason in asterisk在星号中找到正确的挂断原因
【发布时间】:2017-02-04 00:07:05
【问题描述】:

我在 extensions.lua 中设置了一个挂断处理程序。挂断时该函数也在执行,但我的问题是我无法捕捉到确切的挂断代码。无论挂断是由我的拨号计划还是最终用户挂断,我总是得到 16 作为挂断代码。我将星号与 PRI 卡一起使用,所有呼叫均仅通过 PRI。

以下是我的挂断处理程序代码 -

function my_custom_hangup_handler(c,e)
    app.NoOp('Inside Hangup Handler For:'..e)
    app.NoOp('Hangup Cause='..channel['HANGUPCAUSE']:get())
end

我还可以在控制台中看到 RINGING 事件。有没有办法在拨号计划中获取这些事件?

查看下面的日志

-- Called DAHDI/g0/888488XXXX
-- DAHDI/i1/888488XXXX-389 is proceeding passing it to Local/888488XXXX@local-channel-start-00000017;2
-- Local/888488XXXX@local-channel-start-00000017;1 is proceeding
-- DAHDI/i1/888488XXXX-389 is ringing

【问题讨论】:

    标签: lua asterisk


    【解决方案1】:

    我总是设置自己的 HANGUP_OWNER 变量。您可以在拨号时使用“g”选项继续执行拨号计划。本质上,如果你挂断,Asterisk 将直接跳转到当前上下文的“h”扩展,但是如果你的被调用者挂断,“g”选项告诉星号继续在同一个上下文中执行拨号计划。这是我的拨号方案的修改版本。请记住,您必须在使用 Dial() 函数的任何地方执行此操作:

    [all-outbound]
    exten = _X.,1,NoOp(Outgoing call from ${CALLERID(all)} to ${EXTEN})
    exten = _X.,n,Set(HANGUP_OWNER=Caller)  ; we hung up
    ; dial out on the provider SIP trunk
    exten = _X.,n,Dial(SIP/${EXTEN}@provider-sip,,g)
    ; must use dial option 'g' for hangup owner to work
    exten => _X.,n,Set(HANGUP_OWNER=Callee)  ; they hung up
    ;....
    ;....
    exten = h,1,NoOp(Hangup cause is ${HANGUPCAUSE})
    exten = h,n,NoOp(Call Duration is ${CDR(duration)})
    

    此外,值得指出的是,入站与出站的“我们/他们”相反,因此更新 cmets 很有帮助。为了简单起见,我保留了“调用者/被调用者”的措辞,但在 cmets 中准确显示谁是谁很好。

    星号 13 Dial docs

    【讨论】:

    • 它能够检测呼叫是否被接听,甚至更早我使用它来检测。但它是 PRI,当用户没有回答或挂断时,我总是得到 CHANUNAVAIL,我希望这个事件能够正确检测
    • 如果您发布您的拨号方案的相关部分,我也许能够确定问题所在。听起来您可能正在拨打其他用户挂机后无法使用的电话?
    • 我已经就此与硬件提供商进行了交谈,他们告诉 PRI 连接提供商在这两个事件中都只通过了挂断原因 31,这就是我得到 CHANUNAVAIL 的原因。
    【解决方案2】:

    您可以读取 DIALSTATUS 变量。

    如果你挂断,应该是CANCEL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      相关资源
      最近更新 更多