sipp中jump命令的用法

在sipp脚本编写中,通常遇到branch分支的情况,需要进行跳转时,都会用到next命令,通过next命令可以随意跳转到下一个指定的label位置。但是next命令存在局限性,那就是不能向当前位置之前的标签进行跳转,这就导致了很多条件判断需要重复操作的流程无法进行。其实在sipp中还定义了另一个实用的命令,那就是jump。

jump的作用与编程语言中的goto类似,可以跳转至任意msg_index位置(不能跳转至msg_index=0的位置,因为那时候脚本还未初始化)。

关于msg_index究竟代表了什么值,在所有的有关sipp的使用文档中均没有相关记载,通过研究和尝试,基本能够确定,该值为当前xml脚本中,所有程序段的序号。这个“程序段”是我个人的称谓,按照一般的解释就是,有独立意义的语句段落。例如<nop />、<recv />、<send />、<pause />等。msg_index的值起始为0,从<scenario>标签后开始累加,依次+1。因此在使用jump时,需事先计算出所需跳转的程序段的msg_index值,然后再进行操作。

jump命令经过试验,无法直接使用test来进行条件执行,因此需要与其他语句配合使用,如下是一个例子,通过jump命令,来实现rtp媒体播放的循环操作:

1、在脚本起始部分(跳转循环之前),定义变量1,并赋值0,例如在recv INVITE消息的语句内,增加action段来实现

<scenario name="callee_inner">
<recv request="INVITE">
    <action>
    <assign assign_to="1" value="0" />
    </action>    
</recv>

2、在收到ACK后开始播放rtp媒体流,此时可以加入变量的运算操作,完成类似编程语言中for循环的操作:$1自增1,判断$1是否小于5,结果赋给result。当result为真时,跳转至jump标签。如果等于或大于5,则顺序执行。实际效果就是将play_pcap和pause语句循环执行了5次

<recv request="ACK" rtd="ack" />    
<nop hide="true">
    <action>
      <exec play_pcap_audio="pcap/g711u.pcap"/>
      <add assign_to="1" value="1" />
      <test assign_to="result" variable="1" compare="less_than" value="5" />
    </action>
  </nop>

<pause milliseconds="2000"/>

<nop next="jump" test="result" /> 

3、为避免误操作,定义的jump标签最好在END标签前,计算出需跳转的msg_index为7,进行跳转

<label id="jump"/> 
<nop>
  <action>
<jump value="7"/>
</action>
</nop> 

4、由于在进行循环的过程中,无法进行下一步的状态机,因此如果需要在被动接受BYE的一方添加上述语句,需考虑对端发出BYE的实际,否则会造成BYE消息被丢弃而呼叫无法继续的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值