Asterisk通过cdr记录info调用。
如果呼叫通过sip中继进入,则远程公共电话号码通常提供p断言的身份。此信息通常在CDR计费数据库中丢失。
[incoming]
exten => s,1,Set(CALLERID(num)=${SIP_HEADER(P-Asserted-Identity)})
same => n,Dial(SIP/me)
这将p - asserted - identity设置为下一次拨号的主叫号码,但在挂机时没有记录到CDR。原始的CALLERID(num)仍然被记录为src
如果未设置CALLERID(ani),则CDR(src)使用CALLERID(ani)的当前值而不是原始的CALLERID(num)。
[incoming]
exten => s,1,Verbose(Incoming call on line 123)
; try to extract phone number from sip header P-Asserted-Identity
same => n,Set(FON=$["${SIP_HEADER(P-Asserted-Identity)}" : "<sip:([0-9+]+)"])
; This changes clid number wthout affecting cdr's (Just for Dial...)
same => n,ExecIf($[${ISNULL(${FON})}=0]?Set(CALLERID(num)=${FON}))
; prevent beeing hacked by inject
same => n,Set(CALLERID(num)=${FILTER(+0123456789,${CALLERID(num)})})
; This tells cdr to use the new num for "automatic identified (billing) number" as src-field
same => n,Set(CALLERID(ani)=${CALLERID(num)})
same => n,Dial(SIP/me)
这是因为您必须记录真正的原始分机,而不是一般的公共服务号码(08000815)进行内部计费。在大多数情况下,计费的有趣部分是真正的原始扩展。这就是CDR保存CALLERID(num)原始值的原因。CALLERID(num)在呼出过程中经常被修改为普通公众号。在这种情况下,您无法通过cdr识别真正的原始扩展名。
您可以向cdr添加任意数量的新字段,然后使用如下命令
[incoming]
exten => s,1,Set(CALLERID(num)=${SIP_HEADER(P-Asserted-Identity)})
same =>n,Set(CDR(pai)=${SIP_HEADER(P-Asserted-Identity)})
same => n,Dial(SIP/me)