这就是我的拨号方案 (
/etc/asterisk/extensions.conf
) 的样子:
[default]
exten => _X.,1,NoOp(New call from ${EXTEN} ! )
same => n,NoOp( The header X-Twilio-CallSid = ${SIP_HEADER(X-Twilio-CallSid)})
same => Dial(SIP/SomePeer)
... etc
感谢功能 SIP_HEADER 我能够获得我的提供商发送给我的呼叫的 ID。
这非常适合来电。现在我的问题是拨出电话。在呼叫被应答之前,sip 标头
X-Twilio-CallSid
不存在。 接听电话后如何阅读该标题?我已经尝试在电话挂断后放置${SIP_HEADER(X-Twilio-CallSid)}
。通过 Wireshark 分析流量,该标头出现在 INVITE 请求之后。
SIP_HEADER 函数仅适用于一个数据包 - 入站第一个邀请消息。
你已经使用 c/c++ 编写了自己的函数,或者使用了其他软件,如 homer/sipcapture。
我还没有对此进行测试,但是根据文档,您可以将后置处理程序编写为宏(使用
M()
)或GoSub(使用U()
):
[outbound-twilio]
exten => _X.,1,Dial(SIP/${EXTEN}@twilio-trunk,,M(post-answer))
[macro-post-answer]
exten => s,1,Verbose("Answer header shows ${SIP_HEADER(X-Twilio-CallSid)}")
same => s,n,Return()
我不确定这是否会有任何不同,因为 INVITE 交易可能只跟踪初始请求,而不是响应,即使我们从其他渠道执行它也是如此。您可能还想考虑切换到
chan_pjsip
,它有PJSIP_HEADER
:
PJSIP_HEADER 允许您从入站 PJSIP 通道读取特定的 SIP 标头,以及在出站通道上写入(添加、更新、删除)标头。一个例外是您可以读取已添加到出站通道的标头
也许这与
chan_sip
的SIP_HEADER
功能的实现方式不同?
此外,还有更多 docs on Macros from the book.