被叫挂机时,由被叫发起BYE消息给主叫,执行sipp脚本时出现481错误,考虑是由于bye消息中call-id、from-tag、to-tag值不匹配导致的,这时抓取日志进行确认tag值。
被叫UAS脚本:
发现被叫UAS的日志中显示from-tag和to-tag同bye消息中填写的不一致,其中的to-tag可以根据SIPP脚本之前的tag值取到,而from-tag无法直接取到,但是可以考虑使用正则表达式从收到的消息中获取,如返回的PRack消息或183消息等
<recv request="PRACK">
<action>
<ereg regexp=".*" search_in="hdr" header="From: " assign_to="header_from_tag"/>(从头域中取出from的值存放到header_from_tag里)
<ereg regexp="tag=(.*)" search_in="var" variable="header_from_tag" assign_to="2" />(从header_from_tag里匹配tag=xxx的变量值存放到2参数里)
</action>
</recv>
然后在bye消息中引用取到的tag值即可<![CDATA[
BYE sip:10.1.xx.xx:xxxx SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
To:<sip:[field2]@IP:端口>;[$2](主叫号码地址)
From:<sip:[field0]@IP:端口;user=phone>;tag=[pid][call_number](被叫号码地址)
[last_Call-ID:]
[last_Allow]
Max-Forwards: 70
CSeq: 5 BYE
Content-Length: 0
]]>
主叫UAC脚本:
主叫sipp脚本中发出的200 OK(BYE)中from-tag和to-tag也需要同整个脚本中使用的tag保持一致,且特别需要注意这里发出的bye对应的200 ok消息中from和to需要同被叫脚本中的from和to一致
<send retrans="1000">
<![CDATA[
SIP/2.0 200 OK
Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
From:<sip:[field2]@IP:端口;user=phone>;tag=[call_number](被叫号码地址)
To:<sip:[field0]@IP:端口>;tag=[pid][call_number](主叫号码地址)
[last_Call-ID:]
CSeq: 5 BYE
Content-Length: [len]
]]>
</send>