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