环境: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软件的安装使用,可参考这篇文章:
1.1 实现循环播放pcap文件
实现思路如下:
1)通过 assign 进行赋值;
2)通过 add 进行计数器累加;
3)通过 test 进行判断;
4)通过 next 进行逻辑控制;
 
参考文档:

循环播放pcap文件,示例如下:

  <nop>
<action>
<assign assign_to="audio" value="0"/>
</action>
</nop>
<label id="speak"/>
<nop>
<action>
<exec play_pcap_audio="pcap/g711a.pcap"/>
<add assign_to="audio" value="1"/>
<test assign_to="result" variable="audio" compare="less_than" value="6" />
</action>
</nop>
<pause milliseconds="10000" />
<nop next="speak" test="result"/>
1.2 实现UAS主动发Bye请求
sipp内置的场景里面,UAS是不主动发Bye请求的,如果需要UAS发Bye请求,可通过如下配置实现:
 <send  retrans="500">
<![CDATA[ BYE sip:[$5] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port]
From[$4]
To[$3]
Call-ID: [call_id]
Cseq: [cseq] BYE
Contact: sip:[local_ip]:[local_port]
Max-Forwards: 70
Content-Length: 0 ]]>
</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编译及使用,可参考这篇文章:
示例代码如下:

完整代码可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20230730 获取。

三、运行效果

1、UAS2循环播放音频及发送BYE的效果

编写拨号方案:
    <extension name="pjsua_uas_test">
<condition field="destination_number" expression="^123$">
<action application="set" data="hangup_after_bridge=true"/>
<action application="bridge" data="{origination_caller_id_number=123456,origination_caller_id_name=123456}sofia/external/123@192.168.137.33:55080"/>
</condition>
</extension>
启动UAS2,注册分机,拨打 123 即可看到效果:

2、功能验证抓包数据

UAS1 : 1个并发
UAS2 : 1个并发

都有数据发送。

3、python脚本压测效果

为了便于观察效果,这里设置的参数如下:
1) UAS1 播放音频时长 30 秒,等待 BYE 请求;
2) UAS2 播放音频时长为 35 秒,发送 BYE 请求;
3) python脚本的压测循环次数为3,呼叫并发100,循环间隔70秒;
运行效果如下:

运行效果视频可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 2023073001 获取。

四、资源下载

本文涉及文件和示例代码从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230730 获取。

python3使用ESL和sipp自动多轮压测FreeSWITCH的更多相关文章

  1. Linux 安装python3.7.3 提示已经自动安装了pip和setuptools 可是使用时bash提示没有找到pip

    Linux 安装python3.7.3 提示已经自动安装了pip和setuptools 可是使用时bash提示没有找到pip 今天的任务就是找到解决办法 另外就是用布置好python3的路径

  2. Python3发送post请求,自动记住cookie

    转载自:http://www.cnblogs.com/meitian/p/4607737.html 在做登录的post请求时,需要记住cookie,否则不能访问登录后的页面. 下面是登录的代码: #c ...

  3. Linux --- vim 安装、支持python3的配置、插件自动补全YCM的安装配置及全过程错误总结

    1.git(用来下载vim和相关插件) sudo apt-get install git 2,cmake(用来编译clang-llvm) sudo apt-get install build-esse ...

  4. nose在python2与python3中的包的自动发现用例的区别

    最近在使用python3,同样装了nose,发现自动发现用例总是有问题,如下面的代码结婚 testcase |------ __init__.py |------ test_bb.py test_bb ...

  5. 利用python3.5 +TK 开发股票自动交易伴侣

    # -*- encoding: utf8 -*- # version 1.11 import tkinter.messagebox,os from tkinter import * from tkin ...

  6. Python3实现Win10桌面背景自动切换

    [本文出自天外归云的博客园] 得空写了个自动切换桌面背景图片的小程序.再不写python就要扔键盘了,对vue还有那么一点好感,天天php真是有够烦. 准备工作 准备个文件夹放在桌面上,平时看到什么高 ...

  7. python3 简单服务器监控,自动发送邮件

    import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartimpo ...

  8. python3.7 利用pyhive 连接上hive(亲测可用)

    来python爬虫中,经常会遇到数据的存储问题,如果有大量数据,hive存储是个不错的选择. 那么python如何来连接hive呢?网上有各种教程但是都不是很好用,亲自测试pyhive可用 要求:可用 ...

  9. python3 django1.11 安装xadmin 的方法,亲测可用

    首先需要Pip安装如下的包ip install django-crispy-forms pip install django-import-export pip install django-reve ...

  10. centos下mysql自动备份(亲测可用)

    编写sh脚本如下: #!/bin/bash db_user="root" db_passwd="123456" db_name="test_db&qu ...

随机推荐

  1. 如何实现Spring中服务关闭时对象销毁执行代码

    spring提供了两种方式用于实现对象销毁时去执行操作 1.实现DisposableBean接口的destroy 2.在bean类的方法上增加@PreDestroy方法,那么这个方法会在Disposa ...

  2. Windows屏幕解锁服务原理及实现(1)

    https://github.com/zk2013/windows_remote_lock_unlock_screen 将生成的DLL注册至注册表 HKEY_LOCAL_MACHINE\SOFTWAR ...

  3. 【Linux】文本处理及Shell编程

    1.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来 [root@CentOS8 ~]# cat /etc/passwd root:x:0 ...

  4. 2021-10-19:缺失的区间。给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间。力扣163。

    2021-10-19:缺失的区间.给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间.力扣163. 福大大 答案2021-1 ...

  5. 【Qt 6】读写剪贴板

    剪贴板是个啥就不用多介绍了,最直观的功能是实现应用程序之间数据共享.就是咱们常说的"复制"."粘贴"功能. 在 Qt 中,QClipboard 类提供了相关 A ...

  6. Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.

    问题描述 新建表或者修改表varchar字段长度的时候,出现这个错误 Row size too large. The maximum row size for the used table type, ...

  7. requests标头在json序列化时报错TypeError: Object of type CaseInsensitiveDict is not JSON serializable

    requests的作者似乎为了解决header里大小写兼容的问题,而创建了大小写不敏感的数据结构CaseInsensitiveDict,requests返回的响应标头即是一个CaseInsensiti ...

  8. y总算法基础课+算法提高课+算法进阶课超全模板

    y总超全算法模板 y总模板自取 喜欢的可以点个赞支持一下^-^ 模板展示

  9. 深度解析 slab 内存池回收内存以及销毁全流程

    在上篇文章 <深入理解 slab cache 内存分配全链路实现> 中,笔者详细地为大家介绍了 slab cache 进行内存分配的整个链路实现,本文我们就来到了 slab cache 最 ...

  10. Sublime Text Windows/Linux平台快捷键

    编辑 按键 对应命令 Ctrl + X 删除行 Ctrl + 行后插入 Ctrl + ⇧ + 行前插入 Ctrl + ⇧ + ↑ 上移文本/选择 Ctrl + ⇧ + ↓ 下移文本/选择 Ctrl + ...