我想做什么:
接听来电并拨打另一个号码。当呼叫结束时,我需要有正确的呼叫通话时间(应该存储在$ {CDR(billsec)}中)。
我得到的是什么:
由于通道被应答,拨号应用程序中的C选项仅将CDR的应答变量重置为当前时间,因此得到的 billsec 等于CDR的持续时间变量,等于通道占用时间未调用谈话时间。
我的拨号方案:
exten => 333333,1,NoOp(Here I answer the channel and make another call)
same => n,Answer
same => n,Dial(DAHDI/g0/123456789,,gC)
same => n,NoOP(Billsec: ${CDR(billsec)}) // Here billsec is equal to CDR(duration)
注意:如果我只是从拨号方案中删除了应答CMD,那么billsec变量显示正确的通话时间,这是有道理的,因为通道没有应答,CDR(应答)将在调用后立即分配派对回答了频道。但问题是,在我的完整拨号方案中,我必须在拨打电话之前接听电话,因为我需要事先与用户互动,并且需要回答频道。
BTW,我正在使用 Asterisk 13.0.0-beta1 。你们中的任何人都可以告诉我如何实现我想做的事情吗?
答案 0 :(得分:1)
如果基本CDR功能不足以进行计费,请查看CEL(频道事件记录)。支持所有数据库后端,并且有关于您可能需要的呼叫(加时间戳)的所有事件。
答案 1 :(得分:0)
ResetCDR()是你的朋友。我现在使用它,以便我可以跟踪原始呼叫持续时间和被叫方转移后的呼叫部分。这实际上会创建第二个CDR记录,然后应该包含与通话时间匹配的billsecs。
不是100%肯定所有这一切,但是,给它一个旋转,我认为这是你想要的。
答案 2 :(得分:0)
回答您的问题可能为时已晚,但我有完全相同的情况。
我所做的是,在呼叫转移到 C 支路之前(A 支路是主叫方,B 支路是接听电话的 IVR,C 支路是转接呼叫的目的地),使用 ForkCDR(arve)。
类似于:
exten => _X.,1,NoOp(Incoming call from Provider X to User Y)
same => n,Macro(Execute_IVR)
same => n,ForkCDR(arve)
same => n,Dial(SIP/${EXTEN}@userY)
它工作正常:我得到 2 个 CDR 行,一个用于 IVR 的 A 段,有自己的帐单秒(例如,25 秒),另一个用于呼叫转发 A 段到 C 段,也有自己的帐单秒(比如 350 秒)。 2 billsecs 的总和为您提供 A 腿(呼叫者)发出的呼叫的总持续时间。 第二个 CDR 的 billsec 为您提供了该部分通话的通话时长。