★★sipp中jump命令的用法 - sipp成长之路
在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消息被丢弃而呼叫无法继续的问题。