You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Asterisk 13自定义拨号方案:CDR自定义字段值为空原因排查

问题原因及解决方案

这个问题其实是对Asterisk里SIPAddHeaderSIP_HEADER函数的作用方向理解偏差导致的,我给你拆解清楚:

核心原因

  • SIPAddHeader(Test-header: 123)往当前通道要发送的OUTGOING SIP消息里添加自定义头,这个头只会出现在发给对端的SIP包中,并不会被存入当前通道的「可读取头列表」里。
  • SIP_HEADER(Test-header) 这个函数的作用是读取当前通道收到的INCOMING SIP消息里的头字段——也就是对端发给你的SIP包中的头,不是你自己发出去的内容。

所以你在Set操作里用SIP_HEADER(Test-header)自然拿不到值,因为这个头根本没被你的Asterisk收进来,只是被发出去了而已。

正确的实现方式

既然这个123是你自己在拨号方案里生成的,直接复用变量就好,完全不需要绕SIP头的弯路:

exten => _1XX, n, Set(CUSTOM_VALUE=123)
exten => _1XX, n, SIPAddHeader(Test-header: ${CUSTOM_VALUE})
exten => _4XX, n, Set(CDR(Test column)=${CUSTOM_VALUE})

如果确实需要通过SIP头传递值(跨PBX场景)

要是你的需求是把这个头从A端传到B端,再在B端的CDR里记录,那得保证:

  1. 对端的PBX(或者终端)会把这个自定义头回传给你的Asterisk
  2. 在接收端的拨号方案里,用SIP_HEADER(Test-header)才能读到这个头,再设置到CDR里

另外,也可以用Asterisk的CHANNEL变量来携带这个值,比SIP头更可靠,因为CHANNEL变量是绑定在通话通道上的,不会受SIP协议的头过滤规则影响:

exten => _1XX, n, Set(CHANNEL(userfield)=123)
exten => _1XX, n, SIPAddHeader(Test-header: ${CHANNEL(userfield)})
exten => _4XX, n, Set(CDR(Test column)=${CHANNEL(userfield)})

内容的提问来源于stack exchange,提问作者Антон Попов

火山引擎 最新活动