sipp脚本中被叫挂机事件BYE: 481 Call Leg Does Not Exist错误处理

被叫挂机时,由被叫发起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>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SIPp可以使用XML脚本来描述SIP会话。盲转是一种SIP功能,允许用户在不知道目标URI的情况下将呼叫转移到其他URI。下面是一个基本的SIPp盲转脚本示例: ```xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE scenario SYSTEM "sipp.dtd"> <!-- 定义变量 --> <scenario name="Blind Transfer" description="Blind Transfer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <send retrans="500" trcount="1"> <![CDATA[ INVITE sip:user1@192.168.1.1 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bK12345 From: sip:user2@192.168.1.2;tag=12345 To: sip:user1@192.168.1.1 Call-ID: 12345@192.168.1.2 CSeq: 1 INVITE Contact: sip:user2@192.168.1.2:5060 Content-Type: application/sdp Content-Length: 0 ]]> </send> <!-- 等待100 Trying响应 --> <recv response="100" optional="true"> </recv> <!-- 等待200 OK响应 --> <recv response="200"> <!-- 提取From标头 --> <check_from uri="sip:user2@192.168.1.2" /> <!-- 提取To标头 --> <check_to uri="sip:user1@192.168.1.1" /> <!-- 提取Contact标头 --> <check_contact /> <!-- 提取SDP信息 --> <check_body content="audio" /> </recv> <!-- 发送盲转请求 --> <send retrans="500" trcount="1"> <![CDATA[ REFER sip:user3@192.168.1.3 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bK12346 From: sip:user2@192.168.1.2;tag=12345 To: sip:user1@192.168.1.1 Call-ID: 12345@192.168.1.2 CSeq: 2 REFER Contact: sip:user2@192.168.1.2:5060 Refer-To: <sip:user3@192.168.1.3> ]]> </send> <!-- 等待202 Accepted响应 --> <recv response="202"> </recv> <!-- 等待BYE请求 --> <recv request="BYE"> <!-- 提取From标头 --> <check_from uri="sip:user2@192.168.1.2" /> <!-- 提取To标头 --> <check_to uri="sip:user3@192.168.1.3" /> </recv> <!-- 发送200 OK响应 --> <send> <![CDATA[ SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bK12347 From: sip:user2@192.168.1.2;tag=12345 To: sip:user3@192.168.1.3 Call-ID: 12345@192.168.1.2 CSeq: 3 BYE Contact: sip:user2@192.168.1.2:5060 Content-Length: 0 ]]> </send> </scenario> ``` 如上所示,该脚本首先发送一个INVITE请求,等待100 Trying响应和200 OK响应。然后,发送一个REFER请求,将呼叫转移给URI为`<sip:user3@192.168.1.3>`的用户。最后,等待BYE请求和200 OK响应。在发送和接收消息时,可以使用`<check_*>`元素从SIP消息提取信息,以便进行后续处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值