1、 SIPp 使用手册 黄龙舟 译 hlz_ http:/ 目录 SIPP 使用手册 . 1 目录 2 一、 简介 . 3 二、 安装 SIPP 3 1. 获取 SIPp 3 2. 安装 SIPp 4 3. 增加文件标识符限制 . 5 三、 使用 SIPP 6 1. 主要特性 6 2. 集成的脚本(场景) . 6 2.1 示范脚本:主叫( UAC) . 6 2.2 示范脚本:带媒体的 UAC 7 2.3 示范脚本:被叫( UAS.xml) . 7 2.4 示范脚本:正则表达式, regexp.xml . 8 2.5 示范脚本:分支, branchc.xml 和 branchs.xml . 8 2
2、.6 UAC Out-of-call 消息 . 9 2.7 3PCC(第三方呼叫控制) . 9 3. 扩展的 3PCC . 12 4. 控制 SIPp 12 5. 后台运行 SIPp. 13 6. 创建自定义的 XML 脚本 13 6.1 创建客户端(类似 UAC)脚本 20 6.2 创建服务端( 类似 UAS)脚本 . 24 6.3 动作( Actions) 25 6.4 变量 31 6.5 条件分支 33 6.6 SIP 认证 . 34 6.7 初始场景 36 7. 运行界面 36 8. 传输层模式 . 38 9. 统计 39 10. 错误处理 40 11. 日志功能 40 12. 使用
3、SIPp 做性能测试 45 12.1 使用 SIPp 做 性能测试的建议 . 45 12.2 SIPp 内部调度机制 . 45 一、 简介 SIPp 是一个测试 SIP 协议性能的工具软件,它包含了一些基本的 SipStone 用户代理工作流程( UAC 和 UAS),并可使用 INVITE 和 BYE 建立和释放多个呼叫。它也可以读 XML 的场景文件,即描述任何性能测试的配置文件( 可以用他来模拟现场的 SIP 信令,以重现出现的故障;或者可以自定义 SIP 协议以测试终端对某些方面的容错或错误处理能力 )。它能动态显示测试运行的统计数据( 呼叫速率、信号来回的延迟,以及消息统计 )。周期
4、性地把 CSV 统计数据转储,在多个套接字上的 TCP 和 UDP,利用重新传输管理的多路复用。在 场景定义文件中可以使用正则表达式,动态调整呼叫速率。 SIPp 可以用来测试许多真实的 SIP 设备,如SIP 代理, B2BUAs,SIP 媒体服务器, SIP/x 网关, SIP PBX,等等,它也可以模仿上千个 SIP 代理呼叫你的 SIP 系统。 另外, SIPp 还可以简单用来测试 SIP 协议。 本文档是根据 sipp v3.4 版本来编写的,早期的 sipp 版本可能不含有本文档提到的一些特性。 下面是 SIPp 的运行界面截图: 二、 安装 SIPp 1. 获取 SIPp SIP
5、p 在 GNU GPU 许可下发行, sipp 下载地址为 http:/ 2. 安装 SIPp SIPp 可安装在 Linux 和 Cygwin 上面, 其他 Unix 版本可能也可以安装使用,但在每一个发布周期中并未被测试。 不过 Cygwin 上面性能没有 Linux 上面好 ,且 SIPp 只能在运行于windows xp 或更高 windows 版本的 Cygwin 上面运行 。在 Linux 环境中, SIPp 以源代码的 形式提供,在使用 SIPp 之前需要编译 SIPp,在编译之前需要如下依赖组件: C+ Compiler curses or ncurses library Fo
6、r TLS support: OpenSSL = 0.9.8 For pcap play support: libpcap and libnet For SCTP support: lksctp-tools For distributed pauses: Gnu Scientific Libraries 在编译 SIPp 时,有如下四个选项: 不包含对 TLS, SCTP 或 PCAP 的支持 # tar -xvzf sipp-xxx.tar # cd sipp # ./configure # make 包含 TLS 支持 # tar -xvzf sipp-xxx.tar # cd sipp
7、# ./configure -with-openssl # make 包含 PCAP play 支持 # tar -xvzf sipp-xxx.tar # cd sipp # ./configure -with-pcap # make 包含 SCTP 支持 # tar -xvzf sipp-xxx.tar # cd sipp # ./configure -with-sctp # make 或者组合支持以上功能 # tar -xvzf sipp-xxx.tar # cd sipp # ./configure -with-sctp -with-pcap -with-openssl # make 下
8、面以 CentOS 6.4 为例 ,可以按如下步骤编译安装 安装后使用 sipp -v 命令可查看当前 sipp 版本,如下版本是 v3.4,日期为 2013 年 10 月22 日版本。 3. 增加文件标识符限制 如果你的系统不支持足够的文件标识符, 当使用 TCP/TLS 模式(译者注:使用 UDP 模式也一样)进行大并发量呼叫测试可能会遇到问题,可以使用两种方法来突破这种限制:使用命令行参数 -max socket 或者改变系统的限制。至于如何增加文件描述符的最大值,不同的系统修改方法或步骤不同。 在内核为 2.4 版本的 Linux 系统上可以通过修改 /etc/security/lim
9、its.conf and the /etc/pam.d/login 文件来更改,打开 /etc/security/limits.conf 文件并添加如下内容: * soft nofile 32768 * hard nofile 65535 然后打开 /etc/pam.d/login 文件并添加如下内容: session required /lib/security/pam_limits.so 然后使用如下命令来永久更改文件描述符所能支持的最大值: ulimit -s unlimited 注销系统再登录,然后使用 ulimit -a 命令验证是否更改成功,成功后如下图所示#yum install
10、 gcc-c+ gcc automake autoconf libtool make #yum install libpcap libpcap-devel #yum install ncurses ncurses-devel #tar -xvzf sipp-xxx.tar.gz #cd sipp #./configure -with-sctp -with-pcap -with-openssl #make tag=call_number To: sut peer_tag_param Call-ID: call_id CSeq: 1 ACK Contact: sip:sipplocal_ip:lo
11、cal_port Max-Forwards: 70 Subject: Performance Test $2 3. 扩展的 3PCC SIPp 扩展的 3PCC 功能可以让一个 SIPp 实例与任意多个 SIPp 实例通信,来实现多个 SIPp群呼的场景。 此文暂不 介绍。 4. 控制 SIPp 可以使用按键或者 UDP 连接加交互地控制 SIPp。 在运行过程中, SIPp 支持使用热键或者一些简单命令来控制,使用到的热键如下: 按键 作用 + 以 1 倍于 rate_scale 的速率增加呼叫 - 以 1 倍于 rate_scale 的速率减少呼叫 * 以 10 倍于 rate_scale
12、 的速率增加呼叫 / 以 10 倍于 rate_scale 的速率减少呼叫 c 进入命令控制模式 q 待所有呼叫完成后退出 sipp Q 立即退出 sipp s 转储当前状态到日志文件(仅当使用了 -trace_screen 参数时) p 暂停当前工作 1 显示脚本页面 2 显示统计页面 3 显示响应时间分布页面 4 显示变量页面 5 显示 TDM 页面 6-9 Display the second through fifth repartition screen. 在命令模式,可以使用单个命令控制 SIPp 的动作。命令模式比热键更灵活,只不过需要手动输入命令, SIPp 提供了如下命令(在
13、运行过程按热键 c 进入): 命令 描述 dump tasks 把错误信息转储到日志文件 set rate x 设置呼叫率 set rate-scale x 设置呼叫速率步长( rate-scale) set users x 设置 同时在线的 用户数(仅在指定了参数 -users 时生效) set limit x 设置呼叫速率上限(等同于参数 -l) set hide Should the hide XML attribute be respected? set display 改变视图,在主脚本页面和 ooc 脚本页面之间切换 set index 是否显示脚本视图中的索引信息 trace 开
14、启或关闭错误显示,仅对 “error“, “logs“, “messages“, and “shortmessages“有效。 1) 流量控制 SIPp 根据脚本指定的内容产生 sip 流量,你可以控制每秒产生的 sip 呼叫( calls)个数。如果使用了参数 -users,则是指定每秒并发的用户数( users),可以使用下面的方法来调节呼叫速率: 热键(上文已描述) 交互式命令 开数呼叫时指定的参数 有两个命令可用于控制速率, set rate X用于设置当前的呼叫速率为 X。 另外, set rate-scale X 用于设置呼叫速率步长为 X,设置步长后,可以使用 +, -, *,
15、/快速地控制呼叫速率。另外,在开始运行 SIPp 时,可以通过如下参数来指定呼叫速率: -r:指定每秒呼叫的个数 -rp:指定呼叫速率的时间单位(毫秒),默认是 1000 毫秒( 1 秒)。通过这个参数可以指定每 m 毫秒里有 n 个呼叫(使用命令 -r n -rp m) 2) 远程控制 可以通过一个 UDP socket 来远程控制 SIPp,例如: 可以使用脚本来自动地控制一些动作,比如平滑地增加呼叫速率 被测试的程序通过脚本可以根据负载向 SIPp 发送命令自动地控制呼叫速率 每一个 SIPp 实例监听一个 UDP socket,监听的端口从 8888 开始,一直递增到 60 个,可以使
16、用如下命令控制 SIPp: echo p /dev/udp/x.y.z.t/8888 - 暂停 SIPp,相当于按 p键 echo q /dev/udp/x.y.z.t/8888 - 退出 SIPp,相当于按 q键 echo “cset rate 100“ /dev/udp/127.0.0.1/8888 - 发送 set命令 如下是一个比较有用的实例,动态地控制 SIPp 的呼叫速率: #!/bin/sh echo “*“ /dev/udp/127.0.0.1/8889 sleep 5 echo “*“ /dev/udp/127.0.0.1/8889 sleep 5 echo “*“ /dev
17、/udp/127.0.0.1/8889 sleep 5 echo “*“ /dev/udp/127.0.0.1/8889 sleep 60 echo “q“ /dev/udp/127.0.0.1/8889 5. 后台运行 SIPp 使用命令参数 -bg 可以将 SIPp 在后台运行,如果不指定 sipp 脚本执行的次数, sipp 将会一直在后台运行。可以使用 kill 命令( kill SIPp_PID, kill SIPp 进程号)终止 SIPp。 6. 创建自定义的 XML 脚本 虽然 SIPp 已内置了脚本, 但这远远是不够的,所以现在介绍一下如何创建自己的 SIPp脚本。 SIPp
18、脚本使用 XML 编写,一个 SIPp 脚本总是以如下开头: 而且总是以下面语句结束: 开头和结尾很简单, 至于中间的写法规则其实也不难,在 SIPp 的脚本文件中,用于操作 SIP 消息的命令没有多少个,例如: , , , , , and 等等,详细列表如下: 命令 属性 描述 用例 retrans 仅用于使用 udp协议时,定义 udp 报文重发送时间, 遵循 rfc3261 标准section 17.1.1.2 :表示每 500ms 重传输该消息 。 lost 模拟丢包率 :发送的丢包率为 10% start_txn 本属性用来记录响应时间,该属性记录本次发送的消息的 branch id
19、,以在收到回应时能够 精确 匹配, 若没有此属性则根据 Cseq 匹配 。 : 存储 本次会话(由branch id 唯一指定)消息,名称记为“ invite” ack_txn 本属性用来记录响应时间,该属性与 start_txn指定 的消息 对应,这两个消息必须成对出现,否则报错 : 对应上面发送的名为“ invite”的会话消息 response 指定 SIPp期望收到的 SIP消息 代码,如 1xx, 2xx,3xx 等 :表示 SIPp 期望收到代码为200 的消息 request 指定 SIPp期望 到收的 SIP请求消息, 如 : INVITE,ACK, BYE, REGISTER
20、,CANCEL, OPTIONS 等 。 :表示 SIPp 期望收到 ACK 请求 optional 指定 SIPp 期望收到的消息是可选的,对端可以回这个期望的消息,也可以没有回这个期望的消息 。如果 SIPp 收到一个消息, SIPp 先检查这个消息是否匹配一个标记为 optional 的消息,如果 不 匹 配 则 标 记 为unexpected。 当 optional 设置为“ global”时, SIPp 在收到一个消息时会检查 脚:表示 SIPp期望收到代码为 100 的消息,但如果没有收到也没有关系。 本的全部步骤。 rrs Record Route Set,即路由记录设置, 如果
21、该属性被设置为“ true”则收到的消息中的消息头“ Record-Route”会被存储,并可以通过route关键词调用 。 . auth 鉴权认证。 如果该属性被设置为“ true” 则 消息 中 的 消 息 头“Proxy-Authenticate:“会被存储并 可以用来生成认证用的关键词authentication。 . lost 模拟丢包率 timeout 设置超时,如果期望的消息在指定的时间里面没有收到, 除非指定了ontimeout 标否,否则 呼叫将 被 终止。 ontimeout 在超时之后跳到指定标号 例:在 100s 内没有收到消息 100 则跳到标号 5. action
22、指定 当收到指定 的 消息时 SIPp 需要采取的动作 action 的正则表达式实例: 表示收到响应消息 200 后,在消息中 搜索匹配正则表达式 (0-91,3.)30-91,3:0-9*的字符串, 并存储在变量 1 和 2 中,这个表达式的意义实际上是提取 ip 地址和端口号。 regexp_match 布尔值 。检查收到的请求( Request)是否匹配指定包含的消息,如果匹配则应用正则表达例: 检查是否 匹配 MESSAGE or PUBLISH or SUBSCRIBE requests。 式,这个方法可以用来一次提取多个请求中的字符串,非常方便 response_txn 表示这个
23、响应消应是与之前开始 的( start_txn)对应,通过 branch id 来匹配 :表示仅响应以 start_txn=“invite“发送的消息 milliseconds 定义暂停的时间,单位为 ms。当没有指定时间时,则使用命令行参数 -d来指定。 :暂停脚本 5 秒钟 variable 表示使用哪个呼叫变量来决定该呼叫是否需要暂停 : 当含有呼叫变量 1 时暂停 distribution 表示使用 GSL( GNU 科学计算库 ) 决定的呼叫长度来对呼叫进行暂停。如果不用 GSL,则可以使用固定值 或者 指定一个范围 。使用高斯分布,则有以下几种统计分布可选: normal, exp
24、onential, gamma, lambda, lognormal, negbin, (negative binomial), pareto, 和weibull, 在选择哪种分布时,需要指定对应的参数。 1、不使用 GSL 时,可以使用以下两种方法来对呼叫进行暂停: ,表示暂停 1 秒钟 , 表示暂停时间在 2秒到 5秒钟之间。 2、使用 GSL 时需要指定参数,参数的命名与 Wikipedia中关于分布的描述页面一致。举几例如下: , 提供一个平均偏差为 60 秒和标准差为 15 秒的暂停分布值,平均差与标准差的值为毫秒整型值,分布图形如下: , 创建一个分布,该分布是以平均差为 12.2
25、8 和标准差为 1 为的自然对数,平均差与标准差为双精度型,单位为毫秒,分布图如下: ,创建一个平均值为 15 分钟的指数分布,分布图如下: , 创建一个威尔布分布。 创建一个帕累托分布。 , 创建一个伽马分布 创建一个负二项分布。 sanity_check 完整性检查。默认情况下 统计分布暂停都会执行完整性检查以保证暂停值不会超过程序设定的最大值,可以将该值设置为 false 来禁用这个功能,以提升性能。 action 不对 SIP 协议处理,仅用于执行命令 例:执行播放声音或视频的命令 用于 3PCC dest 仅用于扩展模式的 3 方通话 : action 当接收到命令时定义一个动作。
26、src 仅用于 3PCC的扩展模式 id 标号,用于 给脚本分支,属性值 id 是一个整型值,最大值是 19。 比如标号 13: value 定义时间间隔, 用于将响应时间进行分类 :表示响应时间分类为 0-10, 10-20, 20-30 和大于 30 value 定义时间间隔,用于将呼叫时长进行分类 : variables 定义全局范围里的变量 variables 定义用户范围的变量 variables 抑制未用到的变量,当脚本运行提示有存在未用到的变量时,可以使用该命令来禁用它。 综 上 , 用 到 的 命 令 其 实 也 不 多 : send, recv, sendCmd, recvC
27、md, pause, ResponseTimeRepartition, CallLengthRepartition, Globals, User, 和 Reference。这些命令的使用其实也蛮有规律的。比如有些命令在书写时是成对出现的,如 是一对,有些命令在书些时不用成对出现,如 。 除上面列举的属性是必须按类别使用的外,还有一些是通用属性,所有脚本命令 (i.e., , , , , , and)均可使用,具体如下: 属性 描述 实例 start_rtd 开启一个“响应时间值 ( Response Time Duration) ”计时器,便于统计响应时间 :当这个消息被发送的时候会开启一个名
28、为“ invite”的计时器。 可以在统计视图按 3, 6, 7,8 察看所定义的计算器 rtd 停止 五个中的 一个“响应时间值”计时器,便于统计响应时间 。计时器的个数序号可在运行界面看到,如 RTD1, RTD2 :当这个消息被发送的时候会停止 2 号计时器 ,可以在统计视图按 3, 6, 7, 8 察看所定义的计算器。例如::当这个消息被发送的时候会停止 invite计时器 repeat_rtd 重复使用“响应时间值”计时器,便于统计响应时间 :名为 invite 的 计时器值会被统计出来,但计时器不会停止 crlf 在 脚本视图 中 对应的位置处 输出一个空行 next 在任意命令中
29、使用next 属性可以使当前的执行跳到 脚本的另一部分 ,前提是收到了当段脚本定义的消息。 例 1:发送 ACK 后跳到标号为 12 的脚本 例 2:当收到 403 消息后跳到标号为 5的脚本 test 与 next 一起使用,除了满足 next 属性的要求外,同时仅当设置了与 test 相关的变量才能跳到指定脚本段。 例:当设置了变量 4 时,在发送了 ACK 消息后跳到标号为 6的脚本 chance 与 test 一起使用,设置后按设定的机率跳到指定脚本。 例:设置了变量 3 后,以 90%的机率跳到标号 5 的脚本 condexec 当 condexec中的属性值被设置时执行执行这个元素
30、,具体例子可以参考“ 6.7 初始场景”部分。 condexec_inverse 与 condexec 相反 counter 累加计数器,计算对应参数的执行次数,结果在统计视图中体现出来。 :当该消息发送后,“ MsgA”递增 1。 6.1 创建 客户端(类似 UAC) 脚本 客户端 脚本以“ send”命令开始,如下: ;tag=call_number To: sut Call-ID: call_id Cseq: 1 INVITE Contact: sip:sipplocal_ip:local_port Max-Forwards: 70 Subject: Performance Test C
31、ontent-Type: application/sdp Content-Length: len v=0 o=user1 53655765 2353687637 IN IPlocal_ip_type local_ip s=- t=0 0 c=IN IPmedia_ip_type media_ip m=audio media_port RTP/AVP 0 a=rtpmap:0 PCMU/8000 从示例可以看出,在“ send”命令内部,必须要将待发送的 sip 消息括入 “ ”中间,在这中间的所有内容将会被发送到远端系统。同时,你可能也注意到了在这个示例中有一些特殊的关键词,比如: servi
32、ce, remote_ip, 这些关键词 用来指示 SIPp 将要做什么样的事情,具体可见下表“关键词列表”。 关键词 默认值 说明 service service 由参数 -s 传递 ,一般用来指定单个主被叫 remote_ip 远端设备地址 remote_port 5060 远端设备端口 。可以在脚本中使用偏移量,如remote_port+3 transport UDP 指定 传输层协议 , UDP/TCP,由参数 -t 决定 local_ip 主机本地地址 可以由参数 -i 指定 local_ip_type ip 版本 local_port 由系统随机分配 可由 -p 指定 ,可以在脚本
33、中使用偏移量,如local_port+3 len sdp 长度, 用于“ Content-Length”头域, 由sipp 自动生成或者手动指定 ,可以添加偏移量,如 len+3 call_number 呼叫索引, 从 1 开始 ,每增加一个呼叫递增 1 cseq 初始值为 1,可以 使用参数 -base_cseq 手动指定初始值。 media_ip 本地 媒体流 ip,可以由 -mi 参数指定 media_ip_type 本地 媒体流 ip 版本 media_port 本地 媒体流端口,可由 -mp 指定 ,可以设置偏移量 media_port+3 auto_media_port 自动指定媒
34、体流端口,仅用于 pcap。该参数使多个呼叫的音频和视频端口从 -mp 指定的端口开始,并给每个新的呼叫分配端口。 SIPp 默认支持10000 个 rtp 流并发 last_* 此关键词用于从接收的上一个 sip 消息中提取指定头域(如果存在) 的值 。比如 last_to则表示从接收的上一个 sip消息中提取 To 域的消息保存到 last_to中 并应用 。 field0-n file= line= 从 从外部文件 csv 加载值, file 表示选择从命令行中 指定的 csv 文件的一个文件作为外部文件 , line定义 选择的外部文件的起 始 行 , field 选择字段 file
35、name= 把指定的文件中内容全部插入到 sip 消息中。由于空格符,回车符及换行符不被某些关键词识别,所以插入的文件需要被精确地编辑成你想要的格式才行,否则会有乱码。 timestamp 当前 时间戳 ,与错误日志的时间戳格式一样 last_message 上一个收到的消息 $n 用于插入定义的呼叫变量 n authentication 用于认 证 头( authentication head),这个关键词可以使用参数,书写格式为: authentication username=myusername password=mypassword,如果没有指定用户名( username),则需使用
36、命令行参数 -au 或者 -s 指定;如果没有指定密码( password),则需使用命令行参数 -ap 指定 pid 指定 sipp 的 pid,即进程号 routes 如果在 recv 命令中已设置“ rrs”属性为 true,则“ Record-Route”头被存储在关键词 route中,可使用 routes调用。 next_url 如果在 recv 命令中已设置“ rrs”属性为 true,则next_url中包含 Contact 头中的内容 branch 生成一个由 (z9hG4bK) + call number + message 索引 组成的 branch id 到脚本中。如果你
37、想要使用与之前的消息一样的 branch id,你可以使用偏移量指定,如 branch-N msg_index 在脚本中提供消息号 cseq 提供接收到的上一个请求消息中的 CSeq 值,可以使用 cseq+1来递增该值。 clock_tick 在消息中 包含 sipp 的内部时钟 sipp_version 在消息中包含 sipp 的版本 tdmmap 在呼叫消息中包含 tdm 映射值 fill 使用字符填充消息 users 如果在命令行中指定 了 -users 参数 , 则这个关键词表示当前已经运行的用户的数量 userid 如果在命令行中指定 了 -users 参数 , 则这个关键词表示当
38、前 正在运行的用户的 id(范围为 0 到users-1) 如上,在脚本中我们已经发送了 Invite 消息, SIPp 可以使用“ recv”命令等待接收消息。如下: optional=“true“ optional=“true“ 其中, 100和 180 消息是可选接收的( optional),不过 200是强制接收的 , 在一序列“ recv”命令中,必须至少有一个消息是强制接收的 ,接下来使用 SIPp 发送 ACK。 ;tag=call_number To: sut peer_tag_param Call-ID: call_id Cseq: 1 ACK Contact: sip:si
39、pplocal_ip:local_port Max-Forwards: 70 Subject: Performance Test Content-Length: 0 我们也可以在这里插入一个暂停,如下,脚本会暂停 5 秒钟。 然后通过发送一个 Bye 消息并期望接收一个 200ok 来结束此次呼叫: ;tag=call_number To: sut peer_tag_param Call-ID: call_id Cseq: 2 BYE Contact: sip:sipplocal_ip:local_port Max-Forwards: 70 Subject: Performance Test
40、Content-Length: 0 然后结速这个脚本 通过以上例子可以看出创建自己的 SIPp 脚本也并不是很难的,如果你想看其它例子,你可以在命令行使用参数 -sd 查看 SIPp 内嵌的脚本。 6.2 创建 服务端(类似 UAS) 脚本 脚务端脚本以“ recv”命令开始,语法规则和可用命令跟客户端脚本的是一样的,不过在服务端脚本中会用到很多的 last_*关键词,举个例子如下: Content-Length: 0 在这个脚本中是准备回复 180 消息,而且该 180 消息中的一些内容是从上一个接收的invite 中提取出来的。 6.3 动作( Actions) 在一个“ recv”或者“
41、 recvCmd”命令中,可以执行一些动作,目前支持如下动作: 正则表达式( ereg) 记录日志( log) 执行外部命令(如系统命令),内部命令,以及播放 pcap 文件( exec) 执行双精度变量算术运算 给变量赋字符串值 比较双精度变量 跳到脚本的指定索引 在 csv 文件中查找指定词 鉴权 改变一个呼叫的网络地址 1) 正则表达式 在 SIPp 中使用正则表达式可以实现如下功能: 提取 SIP 消息中的内容并存储到变量中以在后续中用到 检查 SIP 消息中的某些内容是否满足要求 SIPp 中的正则表达式满足 PSIX 1003.2 规范,如果你想学习如何写表达式,可以参考此正则表达
42、式教程, 请点击我 , 下面是正则表达式动作的一些语法: 关键词 默认值 描述 regexp - 用于 使用正则表达式 匹配接收到的消息头或者消息体。例: 在消息头的头域 Contact:中查询所有并分配给变量 6。“ .*”用于代表所有字符串。 search_in msg 有四个值: msg:匹配整个消息 (匹配后可以再拆分), 比如如果从消息 From: ;tag=39f-29ee138 中做正则表达式为 ereg regexp=“;.*进行匹配,则可以匹配为三部分。 hdr:匹配消息头 (消息头匹配后不能再拆分),比如如果消息头为 From: ;tag=39f-29ee138,正则表达式
43、为 ereg regexp=“;.*,此时匹配的结果只有一个,就是整个 From 头。 body:匹配消息体 var:匹配 SIPp 字符串变量。 header - 匹配头域, 仅在 search_in 被设置为 hdr 时使用 variable - 匹配变量,仅在 search_in 被设置为 var 时使用 case_indep false To look for a header ignoring case . Only used when the search_in tag is set to hdr. occurence 1 查找头域第几次出现,默认为 1,仅在 search_in
44、被设置为hdr 时使用 start_line false 仅查找起始行,仅在 search_in 被设置为 hdr 时使用 check_it false 设置为真时,如果不匹配则置 此次 呼叫为失败 ,不能同check_it_inverse 同时使用 check_it_inverse false 与 check_it 相反,当 设置为真时,如果匹配则置呼叫为失败 assign_to - 将匹配的结果存储到指定 单个 变量 或几个变量 ,使用 $n引用变量 ,可以将变量 $n的内容应用于 sip 消息或者用于编写 sipp 条件分支脚本 。 在分配的几个变量中,第一个变量包含整个正则表达式的内容
45、,接下来的其它变量依次匹配各子正则表达式 , 例: 如果 sip消息包含有如下行: o=user1 53655765 2353687637 IN IP4 127.0.0.1 那么变量 3, 4, 5, 8 分别为: o=user1 53655765 2353687637 user1 53655765 2353687637 特别提示一下 :在同一个动作( action)中可以同时使用多个正个表达式。举例说明如下: 第一个动作( First action): 提取接收到的 sip 消息中的第一个 ipv4 地址 检查我们是否能够成功提取该 ip 地址 将该 ip 地址赋给呼叫变量 1 和 2 第二
46、个动作( Second action): 提取接收到的消息的 Contact 头 将提取的 contact 头分配给变量 6 2) 记录日志 log 动作( action)可以记录自定义的日志,记录的消息保存在“脚本名 _进程号 .log”文件中, 所有关键词都可以应用于日志动作中以用来反馈我们想要看到的消息或日志。注意:只有在打开日志跟踪开关 -trace_logs 时才能产生日志。 例: 还可以使用另一个动作“ warning”来记录 sipp 的错误日志消息,如下: 3) 执行命令 动作“ exec”可以用来执行内部命令,外部命令,或者播放音频或视频(命令“play_pcap_audio
47、“ 和 “play_pcap_video“)。 内部命令: 内部命令 “ int_cmd”有三个属性: stop_call, stop_gracefully(类似于按 q 键), stop_now(类似于使用 ctrl+C 强制退出 sipp)。举个收到 603 后停止执行脚本的例子: 外部命令 使用外部命令“ command”的属性可以执行当前主机的 shell 可执行的任意命令。举个回显收到了 invite 消息的例子: from_list.log“/ 媒体命令 命令“ rtp_stream”可以将内嵌的编码为 PCMA, PCMU 或者 g729 的音频文件(如 a.wav)转为流媒体向
48、对端发送。动作“ rtp_stream”的用法如下: ,流传输文件 file.wav,假设该文件是 pcma 格式的 , 流传输文件名为filename的文件,重放 loopcount次,默认是 1 次,如果设置为 -1 则一直循环播放,payloadtype告诉 SIPp 当前音频的负载类型( PCMA 为 8, PCMU 为 0, G729 为 18)。 ,暂停当前的流媒体 ,继续被暂停的流媒体 命令“ pcap_play”允许 sipp 发送预先录制好的 RTP 流媒体,共有 play_pcap_audio / play_pcap_video 两个属性。如果选择 play_pcap_audio,则在 SIP/SDP 中使用“ m=audio”,play_pcap_video 则为“ m=video” ,命令用法如下: 4) 变量操作 SIPp 的呼叫变量支持使用双精度浮点型,可以使用 SIPp 的动作来对由参数“ assign_to”指定的值进行修改 , 目前支持的动作有: assign, sample 和 todouble。 assign 动作能将双精