翼度科技»论坛 编程开发 python 查看内容

python3使用ESL和sipp自动多轮压测FreeSWITCH

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
环境: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文件,示例如下:
  1.   <nop>
  2.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  3.   <assign assign_to="4" variable="5" /><action>
  4.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  5.   <assign assign_to="4" variable="5" />  <assign assign_to="audio" value="0"/>
  6.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  7.   <assign assign_to="4" variable="5" /></action>
  8.   </nop>
  9.   <label id="speak"/>
  10.   <nop>
  11.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  12.   <assign assign_to="4" variable="5" /><action>
  13.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  14.   <assign assign_to="4" variable="5" />  <exec play_pcap_audio="pcap/g711a.pcap"/>
  15.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  16.   <assign assign_to="4" variable="5" />  <add assign_to="audio" value="1"/>
  17.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  18.   <assign assign_to="4" variable="5" />  <test assign_to="result" variable="audio" compare="less_than" value="6" />
  19.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  20.   <assign assign_to="4" variable="5" /></action>
  21.   </nop>
  22.   <pause milliseconds="10000" />
  23.   <nop next="speak" test="result"/>
复制代码
1.2 实现UAS主动发Bye请求sipp内置的场景里面,UAS是不主动发Bye请求的,如果需要UAS发Bye请求,可通过如下配置实现:
  1. <send  retrans="500">
  2.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  3.   <assign assign_to="4" variable="5" /><![CDATA[
  4.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  5.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  6.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  7.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  8.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  9.   <assign assign_to="4" variable="5" />  From[$4]
  10.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  11.   <assign assign_to="4" variable="5" />  To[$3]
  12.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  13.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  14.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  15.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  16.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  17.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  18.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  19.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  20.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  21.   <assign assign_to="4" variable="5" />  Content-Length: 0
  22.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  23.   <assign assign_to="4" variable="5" /> ]]>
  24.   </send>
复制代码
其中,$3 $4 $5 是变量,通过以下语法获取:
  1.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  2.   <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的效果

编写拨号方案:
  1. <send  retrans="500">
  2.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  3.   <assign assign_to="4" variable="5" /><![CDATA[
  4.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  5.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  6.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  7.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  8.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  9.   <assign assign_to="4" variable="5" />  From[$4]
  10.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  11.   <assign assign_to="4" variable="5" />  To[$3]
  12.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  13.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  14.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  15.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  16.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  17.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  18.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  19.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  20.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  21.   <assign assign_to="4" variable="5" />  Content-Length: 0
  22.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  23.   <assign assign_to="4" variable="5" /> ]]>
  24.   </send> <send  retrans="500">
  25.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  26.   <assign assign_to="4" variable="5" /><![CDATA[
  27.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  28.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  29.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  30.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  31.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  32.   <assign assign_to="4" variable="5" />  From[$4]
  33.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  34.   <assign assign_to="4" variable="5" />  To[$3]
  35.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  36.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  37.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  38.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  39.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  40.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  41.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  42.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  43.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  44.   <assign assign_to="4" variable="5" />  Content-Length: 0
  45.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  46.   <assign assign_to="4" variable="5" /> ]]>
  47.   </send> <send  retrans="500">
  48.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  49.   <assign assign_to="4" variable="5" /><![CDATA[
  50.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  51.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  52.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  53.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  54.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  55.   <assign assign_to="4" variable="5" />  From[$4]
  56.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  57.   <assign assign_to="4" variable="5" />  To[$3]
  58.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  59.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  60.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  61.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  62.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  63.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  64.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  65.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  66.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  67.   <assign assign_to="4" variable="5" />  Content-Length: 0
  68.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  69.   <assign assign_to="4" variable="5" /> ]]>
  70.   </send> <send  retrans="500">
  71.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  72.   <assign assign_to="4" variable="5" /><![CDATA[
  73.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  74.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  75.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  76.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  77.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  78.   <assign assign_to="4" variable="5" />  From[$4]
  79.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  80.   <assign assign_to="4" variable="5" />  To[$3]
  81.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  82.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  83.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  84.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  85.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  86.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  87.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  88.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  89.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  90.   <assign assign_to="4" variable="5" />  Content-Length: 0
  91.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  92.   <assign assign_to="4" variable="5" /> ]]>
  93.   </send> <send  retrans="500">
  94.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  95.   <assign assign_to="4" variable="5" /><![CDATA[
  96.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  97.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  98.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  99.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  100.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  101.   <assign assign_to="4" variable="5" />  From[$4]
  102.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  103.   <assign assign_to="4" variable="5" />  To[$3]
  104.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  105.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  106.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  107.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  108.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  109.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  110.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  111.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  112.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  113.   <assign assign_to="4" variable="5" />  Content-Length: 0
  114.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  115.   <assign assign_to="4" variable="5" /> ]]>
  116.   </send> <send  retrans="500">
  117.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  118.   <assign assign_to="4" variable="5" /><![CDATA[
  119.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  120.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  121.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  122.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  123.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  124.   <assign assign_to="4" variable="5" />  From[$4]
  125.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  126.   <assign assign_to="4" variable="5" />  To[$3]
  127.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  128.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  129.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  130.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  131.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  132.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  133.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  134.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  135.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  136.   <assign assign_to="4" variable="5" />  Content-Length: 0
  137.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  138.   <assign assign_to="4" variable="5" /> ]]>
  139.   </send> <send  retrans="500">
  140.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  141.   <assign assign_to="4" variable="5" /><![CDATA[
  142.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  143.   <assign assign_to="4" variable="5" />  BYE sip:[$5] SIP/2.0
  144.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  145.   <assign assign_to="4" variable="5" />  Via: SIP/2.0/[transport] [local_ip]:[local_port]
  146.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  147.   <assign assign_to="4" variable="5" />  From[$4]
  148.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  149.   <assign assign_to="4" variable="5" />  To[$3]
  150.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  151.   <assign assign_to="4" variable="5" />  Call-ID: [call_id]
  152.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  153.   <assign assign_to="4" variable="5" />  Cseq: [cseq] BYE
  154.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  155.   <assign assign_to="4" variable="5" />  Contact: sip:[local_ip]:[local_port]
  156.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  157.   <assign assign_to="4" variable="5" />  Max-Forwards: 70
  158.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  159.   <assign assign_to="4" variable="5" />  Content-Length: 0
  160.   <ereg regexp="sip:(.*)>" search_in="hdr" header="Contact" assign_to="4,5"/>
  161.   <assign assign_to="4" variable="5" /> ]]>
  162.   </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

举报 回复 使用道具