当前位置:文档之家› SIPp脚本编写方法基础m

SIPp脚本编写方法基础m

SIPp脚本编写方法基础目录SIPp脚本编写方法入门 (1)1. 脚本格式 (3)1.1.基于XML进行扩展 (3)1.2.DTD扩展语法规则 (3)1.3.脚本结构 (3)1.4.注释 (5)2. 脚本类型 (5)2.1.UAC (5)2.2.UAS (5)2.3.3PCC(三方通话) (6)2.4.OCC(Out-of-call) (6)3. 命令与属性 (6)3.1.常用命令 (6)3.2.常用属性列表 (8)3.3.正则表达式 (10)4. 变量与关键字 (11)4.1.关键字的使用 (11)4.2.变量定义与使用 (13)4.3.鉴权 (15)5. 分支和跳转 (16)5.1.标签 (16)5.2.条件判断 (16)5.3.跳转和循环 (17)5.4.概率分支 (18)6. 文件引用 (19)6.1.外部文件格式 (19)6.2.引用方法 (20)6.3.文件索引 (20)7. 脚本中的命令操作 (21)7.1.内部命令 (21)7.2.外部命令 (21)7.3.媒体命令 (21)8. 附录 (23)修订记录 (24)1.脚本格式1.1.基于XML进行扩展SIPp的测试脚本遵循标准的XML V1.0版本的语法规范,XML即“可扩展标记语言”eXtensible Markup Language 的缩写,W3C组织与1998年发布XML 1.0规范。

1.2.DTD扩展语法规则SIPp的执行目录中,存在一个sipp.dtd文件。

该文件为标准的xml扩展语法规则,在该文件中,对send、recv、pause等元素增加了定义,包括其属性列表等内容,可作为脚本文件格式的校验。

1.3.脚本结构一个标准的SIPp脚本,文件起始应为通用的xml前导区和DTD文件定义区如图所示:接下来使用<scenario>和</scenario>包括的部分,即为脚本的正文部分。

sipp脚本正文部分,包含如下几个区域:1.初始化区在初始化区域中,通常用来进行全局变量的定义和赋值等操作,在脚本未进行逻辑流程前,预先完成初始化动作。

初始化区是在脚本正文的最开始,通过使用命令<init>和</init>,并在其之间插入一些<nop>和<label>命令即可实现,在初始场景中的变量,仅用于全局变量,并不会应用于呼叫。

例如下图中,在初始化区对THINKTIME进行赋值:2.逻辑执行区逻辑执行区中包括了业务流程的相关内容,比如接收消息、发送消息、暂停时长、分支判断、媒体播放、内外部命令执行等操作。

逻辑执行区是脚本的最关键部分,编写sipp脚本,主要也就是针对该部分进行编写和调试。

3.变量抑制区该部分是为了避免在脚本逻辑区定义了大量的变量,但实际并未使用导致运行时报错无法执行的问题,不论定义了多少变量,这些变量有无被使用,只需要添加进变量抑制区的列表中,脚本均可正常执行。

该部分仅有一个命令<Reference />,variables属性为所需抑制的变量列表。

如下图所示:4.定时器自定义区该区域主要作用为:针对消息响应时长(ResponseTime)以及呼叫持续时长(CallLength)的Timer进行自定义间隔的配置,以获取所需的显示范围,例如自定义timer配置为:则在sipp运行时,查看运行统计界面呈现如下:1.4.注释sipp脚本注释的语法格式为<!-->xxx<-->,支持多行注释,如:2.脚本类型SIPp脚本根据使用场景不同,主要分为UAC、UAS、3PCC和OCC4种类型,每种类型均有其特定的使用方式,内部逻辑也有所不同。

2.1.UAC顾名思义,UAC类型的脚本主要是模拟sip会话中的UAC侧,即负责发起会话的client端。

如注册客户端、主叫用户、订阅者等。

通常的UAC脚本逻辑区会以send作为业务流程的起始。

UAC脚本一旦启动,如果不设置起始暂停时长的参数,通常会立即开始执行。

2.2.UASUAS与UAC相对,主要模拟sip会话的UAS侧,启动后即进入被动接收状态,通常作为server端使用,如注册服务器、被叫用户、通知者、业务网关等。

通常的UAS脚本逻辑区会以recv作为业务流程的起始。

UAS脚本启动后,即绑定相关本地socket,进入接收消息的状态。

2.3.3PCC(三方通话)SIPp工具允许多个脚本实例间进行交互,完成较为复杂的业务流程。

如三方通话等业务,因此该种脚本在普通脚本的基础上,更多地使用内部cmd交互命令,如recvcmd、sendcmd等在不同脚本间传递会话参数,配合完成复杂流程的测试实现。

sipp还提供了扩展的3pcc模式,支持master和slave的脚本角色。

该类型的脚本编写和调试较为复杂,本文档中不再赘述,如有兴趣可以翻阅sipp的使用手册等文档,其中有详细说明。

2.4.OCC(Out-of-call)OCC(Out-of-call)脚本作为特殊类型的脚本,通常不会单独使用,而是与UAC脚本配合使用(也只能与UAC脚本配合,UAS等类型脚本无法支持-occsn等执行命令)。

主要作用为扩展UAC脚本的适用范围,使UAC脚本能够在接收到不同会话内的非预期消息时,不至于直接丢弃。

如注册客户端可能会遇到接收到通知NOTIFY的消息,此时就需要在运行register脚本的时候适用-oocsn或-oocsf参数,配合ooc脚本,实现对NOTIFY消息返回200的操作。

3.命令与属性3.1.常用命令SIPp工具提供的命令相当丰富,包括消息操作命令、变量操作、正则表达式、赋值和判断、内部命令、外部命令、日志操作、媒体命令等多种,在一般的使用场景下,通常根据不同的动作,来进行命令的使用。

下面针对比较常用的场景,如发送消息、接收消息、媒体播放等进行描述:(更详细的命令功能及示例,可以翻阅sipp的使用手册等文档)一个最基本的sipp脚本,通常包含了send、recv、nop、pause这几个命令。

其中send为发送sip消息,recv为接收sip消息,nop为处理非业务的逻辑,pause为提供暂停时长。

例如一个基本语音呼叫的主叫侧脚本:首先使用send命令发送INVITE消息,注意在发送消息时,sip消息所有内容均包含在标准的xml数据格式CDATA内,CDATA的语法格式请格外注意,避免因为语法错误导致无法正确发送。

(注:在构造发送的INVITE消息时,为实现批量发送,使用到了大量的变量和关键字,在后续内容中会详细加以说明。

)发送出消息后,还需要进行后续响应消息的接收,请注意由于sip协议存在临时响应和最终响应两种,而1xx的响应在业务中可能存在,也可能不存在,因此需要采用可选属性加以区别。

(注:optional=“true”即表示该条消息为可选接收,如果没有收到,也不会影响后续消息的接收及处理,如100/183/180。

而200为必选接收消息,只有当接收到该消息后,脚本才会继续后续流程,因此没有optional参数。

)在接收到200 ok消息,并发送出ACK后,语音通话接续流程即完成,此时根据实际业务流程,需要进行语音媒体的传输,因此脚本在这里需要增加一个nop命令,用于媒体的播放(注:nop命令可以用于任何非消息处理的位置,在nop命令中增加action 命令,然后即可执行类似媒体处理、变量操作、条件判断等动作。

)在执行媒体播放命令后,由于sipp在执行nop相关命令后,不会等待命令执行完毕而是立即执行后续脚本内容,因此为保证媒体播放正常,我们还需要根据实际要求,将脚本暂停一段时间,以确保流程模拟正确。

(注:millisenconds属性可以自定义暂停的时长,单位为ms,如果该属性为空,则可以通过在执行命令中增加“-d 10000”来指定暂停时长)3.2.常用属性列表通用属性:3.3.正则表达式正则表达式作为sipp中极为重要的功能,在各个场景下应用广泛,最常见的是通过正则表达式,获取接收消息中某个参数,并将该参数赋给变量,用于后续流程的使用。

正则表达式的使用语法如下图所示:正则表达式的命令为<ereg />regexp属性为需要匹配的表达式内容,其中使用”()”包括起来的部分,为匹配项,可以赋给变量;search_in属性为设置本次查询的方式,sipp支持3种正则匹配的方式,分别为:1.头域查询匹配当search_in=”hdr”时,表示正则按照头域匹配,必须包含header参数,给出需要查询的头域名称,如header=”From”。

sipp会在指定的头域中进行匹配。

注:start-line的匹配也是用头域匹配方式。

2.消息查询匹配当search_in=”msg”时,表示正则根据整个消息内容进行匹配,通常在需要匹配SDP内容时会用到。

3.变量查询匹配当search_in”var”时,表示正则按照变量进行匹配,必须配置variable 参数,给出需要匹配的变量名称,如variable=”header_to_tag”。

4.变量与关键字4.1.关键字的使用sipp中定义了大量的关键字,涉及到网络参数、sip会话参数和媒体参数等等,需要在编写脚本时加以注意。

关键字的引用格式为[keyword],例如[locao_ip]、[call_id]等。

下表列出了常用的关键字:4.2.变量定义与使用sipp的脚本中,支持双精度浮点型变量和字符串变量两种变量类型.1.浮点型变量针对浮点型变量的操作命令主要有assgin(赋值)、sample(统计分布)和todouble(强制类型转换),以及加减乘除等简单算术运算,举例如下:<nop><action><!—将变量sum赋值为0--><assign assign_to="sum" value="0" /><!--将sum加2,然后再赋值给sum--><add assign_to="sum" value="2" /><!--将sum减3,然后再赋值给sum --><subtract assign_to="sum" value="3" /><!--将sum乘以4,然后再赋值给sum --><multiply assign_to="sum" value="4" /><!--将sum除以5,然后再赋值给sum,此时sum=-0.8 --><divide assign_to="sum" value="5" /></action></nop>浮点型变量还支持变量比较测试功能,该部分在分支一节中会重点描述。

相关主题