|
环境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 sipp版本:3.6.1 python版本:3.9.12日常工作中,有时会遇到批量自动压测FreeSWITCH的需求,sipp是一个非常好的VoIP压测工具,python是个很好用的脚本语言,今天记录下CentOS 7环境下python3如何借助ESL使用sipp自动压测FreeSWITCH服务器。一、背景描述
sipp的灵活性很好,可根据实际的业务场景定制不同的压测模型,这里选取的压测模型比较简单,整体结构如下:
说明:
1)python脚本通过ESL模块和FreeSWITCH通信,用于控制呼叫和接受数据; 2)FreeSWITCH在这里的角色类似网关,负责将两台UAS的通话连接起来; 3)两台UAS都可自动接收呼叫,并自动播放音频数据,其中有一台需要具备主动发Bye请求挂断电话的功能,用于结束通话。二、具体实现
1、准备sipp配置文件
这里使用的sipp测试模型是UAS模型,该部分我会列举下关键点,sipp软件的安装使用,可参考这篇文章:https://www.cnblogs.com/MikeZhang/p/sippPcapTest.html 1.1 实现循环播放pcap文件实现思路如下:1)通过 assign 进行赋值;2)通过 add 进行计数器累加;3)通过 test 进行判断;4)通过 next 进行逻辑控制; 参考文档:https://sipp.readthedocs.io/en/latest/scenarios/actions.html
循环播放pcap文件,示例如下:- <nop>
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><action>
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> <assign assign_to="audio" value="0"/>
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /></action>
- </nop>
- <label id="speak"/>
- <nop>
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><action>
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> <exec play_pcap_audio="pcap/g711a.pcap"/>
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> <add assign_to="audio" value="1"/>
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> <test assign_to="result" variable="audio" compare="less_than" value="6" />
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /></action>
- </nop>
- <pause milliseconds="10000" />
- <nop next="speak" test="result"/>
复制代码 1.2 实现UAS主动发Bye请求sipp内置的场景里面,UAS是不主动发Bye请求的,如果需要UAS发Bye请求,可通过如下配置实现:- <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send>
复制代码 其中,$3 $4 $5 是变量,通过以下语法获取:- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" />
复制代码 1.3 场景配置文件1)UAS1的配置
2)UAS2的配置
完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230730 获取。2、准备python测试脚本
实现思路如下:1)设置压测参数;2)使用ESL连接FreeSWITCH,使用hupall清理呼叫,发送外呼命令,同时呼叫UAS1、UAS2;3)等待UAS2执行挂机操作,避免hupall引起的并发过高;4)根据设置的循环次数进入下一轮压测;
其中,python3.9.12版本的ESL编译及使用,可参考这篇文章:https://www.cnblogs.com/MikeZhang/p/py39esl-20230424.html
示例代码如下:
完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230730 获取。
三、运行效果
1、UAS2循环播放音频及发送BYE的效果
编写拨号方案:- <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send> <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send> <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send> <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send> <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send> <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send> <send retrans="500">
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /><![CDATA[
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> BYE sip:[$5] SIP/2.0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Via: SIP/2.0/[transport] [local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> From[$4]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> To[$3]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Call-ID: [call_id]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Cseq: [cseq] BYE
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Contact: sip:[local_ip]:[local_port]
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Max-Forwards: 70
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> Content-Length: 0
- <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
- <assign assign_to="4" variable="5" /> ]]>
- </send>
复制代码 启动UAS2,注册分机,拨打 123 即可看到效果:
2、功能验证抓包数据
UAS1 : 1个并发UAS2 : 1个并发
都有数据发送。
3、python脚本压测效果
为了便于观察效果,这里设置的参数如下:1) UAS1 播放音频时长 30 秒,等待 BYE 请求;2) UAS2 播放音频时长为 35 秒,发送 BYE 请求;3) python脚本的压测循环次数为3,呼叫并发100,循环间隔70秒;
运行效果如下:
运行效果视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023073001 获取。四、资源下载
本文涉及文件和示例代码从如下途径获取:关注微信公众号(聊聊博文,文末可扫码)后回复 20230730 获取。
来源:https://www.cnblogs.com/MikeZhang/p/pyESLTest20230731.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|