1.1脚本撰写

进行脚本撰写之前需要熟悉一些默认的参数关键字:

关键词 默认值 说明
【service】 service 由参数-s传递,一般用来指定单个主被叫
[remote_ip] 远端设备地址
[remote_port] 远端设备端口。可以在脚本中使用偏移量,如[remote_port+3]
[local_ip] 本地ip 可以由参数-i指定
[local_ip_type] ip版本 远端设备地址
[local_port] 系统随机分配 可由-p指定,可以在脚本中使用偏移量,如[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]
[last_*] 此关键词用于从接收的上一个sip消息中提取指定头域(如果存在)的值。比如[last_to]则表示从接收的上一个sip消息中提取To域的消息保存到[last_to]中并应用。
[branch] 生成一个由(z9hG4bK) + call number + message索引组成的branch id到脚本中。
[field0-n file=<filename> line=<number>] 从外部文件csv加载值,file表示选择从命令行中指定的csv文件的一个文件作为外部文件,line定义选择的外部文件的起始行,field选择字段。

脚本参数化:
1、需要sipp命令赋值的参数-p、-i、-s:[local_ip]、[local_port]、[remote_ip]、[remote_port]、[service]
2、sipp自动检测生成的参数:[call_number]、[call_id]、[cseq]、[len]、[branch]

创建uac

<send retrans="500">
<![CDATA[
INVITE sip:[service]@[remote_ip]:[remote_port] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port]
From: sipp <sip:sipp@[local_ip]:[local_port]>;tag=[call_number]
To: sut <sip:[service]@[remote_ip]:[remote_port]>
Call-ID: [call_id]
Cseq: 1 INVITE
Contact: sip:sipp@[local_ip]:[local_port]
Max-Forwards: 70
Content-Type: application/sdp
Content-Length: [len]v=0
o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
s=-
t=0 0
c=IN IP[media_ip_type] [media_ip]
m=audio [media_port] RTP/AVP 0
a=rtpmap:0 PCMU/8000
]]>
</send>

在send命令内部,必须将待发送的sip消息括入"<![CDATA" 和 "]]>"中间,在这中间的所有内容将会被发送到远端系统。同时,在这个示例中包含一些特殊的关键词,比如:[service],[remote_ip],这些关键词可以通过sipp命令参数来进行赋值,具体可见上表。另外:加入retrans参数,可在没收到响应的情况下,在设定的时间之后重传,此例中为500毫秒。
注意:在测试业务时,通过在头域中添加<Route:被叫侧地址>以保证呼叫会从业务路由到被叫,否则路由会通过Request URI确定下一跳地址。
SIPp脚本中可以使用”recv”命令等待接收消息。如下:

<recv response="100" optional="true">
</recv><recv response="180" optional="true">
</recv><recv response="200">
</recv>

其中,100和180消息是可选接收的(optional),但200是强制接收的,在一序列”recv”命令中,必须至少有一个消息是强制接收的。

发送请求的时候不需要也不可能重新填写所有字段(比如说From字段不需要,因为一个dialog里的From字段都是相同的;而To字段是没办法自己填写,必需从上一个响应中引入,因为To-tag是远端加上的,本地并不知道),所以可以用[last_字段名]的方式从上一个消息中取得。通常From,To,Call-ID字段从上一个消息中取得,例如:

 <send retrans="3000"><![CDATA[PRACK sip:[remote_ip]:[remote_port] SIP/2.0Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]CSeq: 2 PRACK[last_From:][last_To:][last_Call-ID:]RAck: 1 1 INVITEMax-Forwards: 70Contact: <sip:sipp@[local_ip]:[local_port];transport=udp>Content-Length: [len]]]></send>

在SIPp主叫脚本中,可以通过插入一个暂停语句来模拟实际持续的通话时长,例如:在建立通话后插入语句<pause milliseconds="5000"/>为在通话状态维持5s。
暂停语句要灵活运用,还可以在被叫脚本180Ring后插入暂停来模拟振铃时长等。

创建uas

UAS脚本以”recv”命令开始,语法规则和可用命令跟客户端UAC脚本是一样的,不过在UAS脚本中会用到很多的[last_*]关键词。
UAS脚本会首先收到UAC脚本发送的invite消息:

<recv request="INVITE"><action><ereg regexp=".*" search_in="hdr" header="Via:" check_it="true" assign_to="4" />  <ereg regexp=".*" search_in="hdr" header="CSeq:" check_it="true" assign_to="2" />  </action>
</recv>

说明:在该示例中用到了正则表达式,当sipp的消息序列中带有PRACK时,UAS发送INVITE的200 OK时,某些字段(比如Via和Cseq)则不能使用[last_字段名]方式从上一个收到的消息中引入,因为此时上一个消息是PRACK,而不是INVITE,所以需要先将INVITE的这两个字段保存下来供以后使用。上面的用法便是将INVITE的Via字段的值保存为数字1,在以后发送INVITE的200 OK的时候引用,通过Action来执行这一过程。
在UAS脚本中会用到很多[last_*]关键词,例如:

 <send><![CDATA[SIP/2.0 180 Ringing[last_Via:][last_From:][last_To:];tag=[call_number][last_Call-ID:]Require: 100relCSeq: 1 INVITEContact: <sip:[local_ip]:[local_port];transport=[transport]>Content-Length: [len]]]></send>

在这个脚本中是准备回复180消息,而且该180消息中的一些内容(Via、From、To、Call-ID)是从上一个接收的invite中提取出来的,但是Contact字段不能从上一个消息中引入。
注意:To字段从上一个消息中引入的时候,需要添加To-tag,call_number为sipp自动生成的,在一个dialog中call_number是相同的。从上一个消息引入相关字段的时候,如果上一个消息没有这个字段,则在本消息中也不会有。
在回复180Ring之后可以通过插入暂停语句来模拟真实振铃时长:
<pause milliseconds="3000"/>
注意:被叫回复200OK摘机之前,最好暂停几秒模拟振铃时长,如果180之后立刻回复200OK,容易出现早摘机异常情况。(该异常会导致主叫未收到180而直接收到200OK)
回复invite的200OK时,引用之前存储的变量:

  <send ><![CDATA[SIP/2.0 200 OKVia:[$4][last_To:][last_From:][last_Call-ID:]CSeq:[$2]Contact: <sip:[local_ip]:[local_port];transport=[transport]>Content-Type: application/sdpContent-Length: [len]v=0o=- 197 197 IN IP4 [local_ip]s=SBC callc=IN IP4 [media_ip]t=0 0m=audio 28190 RTP/AVP 108 106 101 102 100 111 96……]]></send>

脚本中的动作action

在一个”recv”或者”recvCmd”命令中,可以执行一些动作,例如:
正则表达式(ereg)
给变量赋字符串值
记录日志(log)等等

现在主要讲一下正则表达式:
在SIPp中使用正则表达式可以实现如下功能:
提取SIP消息中的内容并存储到变量中以在后续中用到
检查SIP消息中的某些内容是否满足要求
下面是正则表达式动作的一些常用语法:

关键词 默认值 说明
regexp 用于使用正则表达式匹配接收到的消息头或者消息体。”.*”用于代表所有字符串。
search_in msg 有四个值:msg:匹配整个消息(匹配后可以再拆分)。hdr:匹配消息头(消息头匹配后不能再拆分)。body:匹配消息体。var:匹配SIPp字符串变量。
header 匹配头域,仅在search_in被设置为hdr时使用。
check_it false 设置为真时,如果不匹配则置此次呼叫为失败,不能同check_it_inverse同时使用。
assign_to 将匹配的结果存储到指定单个变量或几个变量,使用[n]引用变量,可以将变量[n]引用变量,可以将变量[n]引用变量,可以将变量[n]的内容应用于sip消息或者用于编写sipp条件分支脚本。

举例:提取接收到的消息Via头,将提取的Via头分配给变量1,并在后续通过[$1]引用。

<recv request="INVITE" crlf="true"><action><ereg regexp=".*" search_in="hdr" header="Via:" check_it="true" assign_to="1" />    </action></recv>

关于CSeq,RAck,以及CANCEL,ACK的特殊性

对一个会话,UAC侧和UAS侧的CSeq都是按1递增的,不过CANCEL和ACK例外,它们这两个的CSeq和INVITE一致。例如:

-->INVITE CSeq: 1 INVITE
<--100 CSeq: 1 INVITE
<--183 CSeq: 1 INVITE
-->PRACK CSeq: 2 PRACK
<--200(PRACK) CSeq: 2 PRACK
-->CANCEL CSeq: 1 CANCEL
<--200(CANCEL) CSeq: 1 CANCEL
<--487 CSeq: 1 INVITE
-->ACK CSeq: 1 ACK

UAC侧和UAS侧的CSeq是单独的,没有关联性,只是对于Response来说,它的CSeq需要和它对应的Request一致。
再列出一个例子:

-->INVITE CSeq: 1 INVITE
<--100 CSeq: 1 INVITE
<--183 CSeq: 1 INVITE
-->PRACK CSeq: 2 PRACK
<--200(PRACK) CSeq: 2 PRACK
-->UPDATE CSeq: 3 UPDATE
<--200(UPDATE) CSeq: 3 UPDATE
<--200(INVITE) CSeq: 1 INVITE
-->ACK CSeq: 1 ACK
-->BYE CSeq: 4 BYE
<--200(BYE) CSeq: 4 BYE

PRACK中有RAck这个消息头,RAck的格式是:
RAck: RSeq CSeq Method
RSeq是对应的18X中的Rseq,CSeq是对应的18X中的CSeq,也就是INVITE的CSeq,Method是INVITE。
另外要注意的是,18X重发时,每次RSeq的值是按1递增。
例子:

-->INVITE CSeq: 1 INVITE
<--100 CSeq: 1 INVITE
<--183 CSeq: 1 INVITE RSeq:100
-->PRACK CSeq: 2 PRACK  RAck:100 1 INVITE
<--200(PRACK) CSeq: 2 PRACK
<--183 CSeq: 1 INVITE RSeq:101
-->PRACK CSeq: 3 PRACK  RAck:101 1 INVITE
<--200(PRACK) CSeq: 3 PRACK
-->CANCEL CSeq: 1 CANCEL
<--200(CANCEL) CSeq: 1 CANCEL
<--487 CSeq: 1 INVITE
-->ACK CSeq: 1 ACK

从外部CSV文件引入变量

SIPp可以在脚本运行命令行中使用”-inf 文件名”参数来引入变量到脚本中,例如性能测试时需要模拟不同的用户同时呼叫系统,需要通过从.csv文件中引入变量的形式来实现。
文件的第一行须申明变量的读取方式是顺序读取(SEQUENTIAL),还是随机读取(RANDOM),还是基于用户的方式读取(USER)。每一行对应一个呼叫,并使用”;”分隔符分隔每一项数据,分开的项在脚本中作为变量名[filed0]、[field1]、……[fieldn]来引用。例如:
SEQUENTIAL
Sarah;sipphone32
Bob;sipphone12
Fred;sipphone94
该文件中的数据行会被按顺序读取,第一个呼叫第一行,第二个呼叫第二行。在脚本中的任何地方只要出现了关键词[field0],根据第几个呼叫决定,这个关键词就会被替换为Sarah或者Bob或者Fred,[field1]也是类似。如果达到了文件末尾则再重新开始,一直循环,文件的大小没有限制。
SIPp脚本使用示例:

另外,可以使用参数不从第一行开始,例如从第二行开始:[field0 line=1]
还可以使用不止一个外部文件来引入变量,比如你要做一个测试主叫号码是按顺序的但是被叫是随机的时候,你就可以用一个第一行为顺序的uac.csv文件和一个第一行为随机的uas.csv文件来实现。
INVITE sip:[field0 file=”uas.csv”] SIP/2.0
From: sipp user <[field0 file=”uac.csv”]>
To: sut user <[field0 file=”uas.csv”]>

完结

sipp脚本撰写(二)相关推荐

  1. sipp介绍与脚本撰写(一)

    1.1.SIPp简介 SIPp是一个测试SIP协议性能的工具软件.它包含了一些基本的用户代理工作流程(UAC和UAS:UAC负责发起SIP呼叫请求,UAS接收UAC的请求并负责对其做出响应),并可使用 ...

  2. 短视频脚本撰写小技巧,不同的短视频类型要使用不同的撰写方法

    短视频脚本撰写小技巧,不同的短视频类型要使用不同的撰写方法 短视频在拍摄之前,往往都还需要先撰写好脚本,这样才能方便拍摄,也能方便后期制作.那么,短视频脚本究竟要如何撰写呢?那么接下来,我们就结合不同 ...

  3. Shell脚本撰写指南

    属性 信息 文档名称 Shell脚本撰写指南 版本号 V1.0.0.0 文档修改日志 修改时间 修改人 修改描述 版本号 12-13 13:00 宋全恒 脚本撰写指南 V0.0.0.0 12-17 1 ...

  4. Linux shell脚本编程(二)

    Linux shell脚本编程(二) -------------------------------------------------------------------- 注:如果你对python ...

  5. linux使用读mysql脚本,【mysql学习】linux安装mysql,使用install脚本方式 (二)

    [mysql学习]linux安装mysql,使用install脚本方式 (二) 发布时间:2020-04-06 20:51:12 来源:51CTO 阅读:1092 作者:浮尔魔司 本文介绍Linux下 ...

  6. ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能

    ASP.NET Web--GridView 完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能 环境说明 系统要求:win7/10/11 开发语言:C# 开发工具:Visual Studio ...

  7. Redis中使用Lua脚本(二)之红包雨的抢夺

    Redis中使用Lua脚本(二)之红包雨的抢夺 一.需求介绍 二.红包雨的需求分析及概要设计 三.红包雨的Lua脚本设计及模拟演示 四.Lua脚本在生产环境的使用 一.需求介绍 如同前两年的爆款&qu ...

  8. 【python】python制作 连连看 游戏脚本(二)

    [python]python制作 连连看 游戏脚本(一)_sunriver2000的博客-CSDN博客 [python]python制作 连连看 游戏脚本(二)_sunriver2000的博客-CSD ...

  9. 路由器二次开发一步一步把工业路由器变成一个高端的可指定出网、节点和链路的路由器,包含详细过程及快捷脚本(二)

    路由器二次开发一步一步把工业路由器变成一个高端的可指定出网.节点和链路的路由器,包含详细过程及快捷脚本(二). 如果没有路由器可以采用废旧的电脑,详细环境部署参考第(一)篇文章,这里采用800米的工业 ...

最新文章

  1. nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
  2. 【数据库】兴唐第二十八节课零散知识点汇总
  3. Html与Css关联到一起
  4. Consumer设计-high/low Level Consumer
  5. 浅谈C#中的异步编程
  6. [导入]实现数字分页
  7. 如何用python开发游戏_手把手教你用Python完成一个控制台小游戏-阿里云开发者社区...
  8. listview异步加载图片
  9. java tls 实例_grpc加密TLS初体验(go、java版本)
  10. CloudIDE插件开发实战:教你如何调试代码
  11. python的random模块怎么写_Python常用标准库之random模块
  12. 软件网站安全性的设计与检测与解决方案
  13. 12月Java原生商城APP源码-完全开源
  14. 阿里巴巴早期发展简史
  15. AppStore 上架方法(将包提交到构建文件)
  16. 改变用户在某表空间的配额不足
  17. SSH框架面试题(自己+别人的试题)
  18. Ubuntu服务器配置mysql8
  19. matlab 三维图 输出,MATLAB三维曲线图绘制并输出到指定文件夹(突出几组不同数据)...
  20. 计算机网络智能化在铁路通信的发展,关于接入网技术在铁路通信中的应用

热门文章

  1. 突破KEIL软件编译时 C51中断号最大只能为31限制的补丁,使中断号可以达到256
  2. 阿里巴巴年度技术总结 - 人工智能在搜索的应用和实践
  3. 牛客网 D-图图(广搜)
  4. 奖励补贴有点多!武汉市大健康和生物技术产业发展奖励措施解读
  5. tensorflow2.0莺尾花iris数据集分类|超详细
  6. 怎么简单把word转成PDF并生成书签
  7. 关于如何发挥最好的学习状态的思考暨《自控力》一书读后感
  8. 心...............................
  9. 超火爆的人类一败涂地Human Fall Flat Mac中文版(支持m1)
  10. html插入外链音乐,GitHub Page插入网易云音乐外链