在asterisk中寻找恰当的挂断原因

我在 extensions.lua 中设置了一个挂断处理程序。在挂断时,该函数也会执行,但我的问题是我无法捕获确切的挂断代码。不管是我的拨号计划还是最终用户挂断,我始终会得到16作为挂断代码。我正在使用带有PRI卡的asterisk,所有呼叫都通过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正在传递它到Local/888488XXXX@local-channel-start-00000017;2
-- Local/888488XXXX@local-channel-start-00000017;1正在进行
-- DAHDI/i1/888488XXXX-389正在响铃
点赞
用户861388
用户861388

你可以读取DIALSTATUS变量。

如果你挂断了,应该是CANCEL。

2017-02-02 22:47:57
用户1618438
用户1618438

我一直使用自己的 HANGUP_OWNER 变量。当拨打电话时,您可以使用“g”选项来继续执行拨号计划。如果您挂断,Asterisk 将直接跳到当前上下文的“h”扩展,但如果您的被叫者挂断,"g"选项告诉 Asterisk 在同一上下文中继续执行拨号计划。这是我拨号计划的修改版本。请注意,您必须在使用 Dial() 函数的任何地方执行此操作:

[all-outbound]
exten = _X.,1,NoOp(Outgoing call from ${CALLERID(all)} to ${EXTEN})
exten = _X.,n,Set(HANGUP_OWNER=Caller)  ; 我们挂断
; 拨打提供商 SIP 中继出站电话
exten = _X.,n,Dial(SIP/${EXTEN}@provider-sip,,g)
; 必须使用拨号选项 'g' 才能让挂断所有者工作
exten => _X.,n,Set(HANGUP_OWNER=Callee)  ; 他们挂断
;....
;....
exten = h,1,NoOp(Hangup cause is ${HANGUPCAUSE})
exten = h,n,NoOp(Call Duration is ${CDR(duration)})

此外,值得指出的是,关于“我们/他们”,入站和出站是反过来的,因此更新注释很有帮助。我保持“呼叫者/被叫者”的用词以保持简单,但在注释中显示确定谁是谁是很好的习惯。

Asterisk 13 Dial docs

2017-02-03 15:52:22