这是我的拨号计划(/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。这是我使用WireShark捕获的第一个数据包:
换句话说${SIP_HEADER(X-Twilio-CallSid)}
= ACbccc967c48dda15d8d1c9b34961d19a0
这非常适合来电。现在我的问题是拨出电话。在应答呼叫之前,sip头X-Twilio-CallSid
不存在。 接听电话后,如何读取该标头?当电话挂断后,我尝试放置${SIP_HEADER(X-Twilio-CallSid)}
。分析通过Wireshark的流量,该头出现在INVITE请求之后。
答案 0 :(得分:0)
SIP_HEADER函数仅适用于一个数据包-入站FIRST邀请消息。
您已经使用c / c ++编写了自己的函数,或者使用了诸如homer / sipcapture之类的其他软件。
答案 1 :(得分:0)
我还没有对此进行测试,但是according to the docs,您可以将答案处理程序编写为宏(使用M()
)或GoSub(使用U()
):< / p>
[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
的{{1}}函数的实现方式不同吗?
此外,本书中还有更多docs on Macros。