Asterisk 13自定义拨号方案:CDR自定义字段值为空原因排查
问题原因及解决方案
这个问题其实是对Asterisk里SIPAddHeader和SIP_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里记录,那得保证:
- 对端的PBX(或者终端)会把这个自定义头回传给你的Asterisk
- 在接收端的拨号方案里,用
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,提问作者Антон Попов




