概述

freeswitch是一款简单好用的VOIP开源软交换平台。

但是fs在处理update消息时候有BUG,为了复现问题,使用sipp模拟uas,发送update并发送DTMF码。

本文档记录sipp的配置方案。

环境

CentOS 7.9

freeswitch 1.10.7

sipp.3.6.2

问题描述

在与运营商对接的过程中,运营商内部会先返回183,然后B路落地端再通过update修改媒体参数。

但是fs在处理update消息时,sofia-sip协议栈会直接响应200 OK,并且200响应消息中sdp的媒体参数不是经过协商后的结果。

当update消息上报fs的业务层后,fs的业务层会根据update的sdp协商并设置媒体参数,但是fs业务层的协商结果和B路落地端的结果可能会存在差异,造成媒体丢失问题。

sipp脚本

测试环境模块。

eyebean --> fs-reg --> fs --> sipp

sipp作为uas端,并在183消息后发送update消息。

其中,183消息中使用101作为rfc2833的payload,update消息中使用103作为rfc2833的payload。

脚本 uas-test-update.xml 内容如下。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">

<scenario name="Basic UAS responder">
<recv request="INVITE" crlf="true" >
<action>
<ereg regexp=".*"
search_in="hdr"
header="From:"
check_it="true"
assign_to="1" />
<ereg regexp=".*"
search_in="hdr"
header="To:"
check_it="true"
assign_to="2" />
<ereg regexp="sip:[^;&gt;]+"
search_in="hdr"
header="Contact:"
check_it="true"
assign_to="3" />
<ereg regexp=".*"
search_in="hdr"
header="CSeq:"
check_it="true"
assign_to="4" />
</action>
</recv>

<send>
<![CDATA[

SIP/2.0 100 Trying
[last_Via:]
[last_From:]
[last_To:];tag=sippTag01
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
Content-Length: 0

]]>
</send>

<pause milliseconds="1000"/>

<send>
<![CDATA[

SIP/2.0 183 Session Progress
[last_Via:]
[last_From:]
[last_To:];tag=sippTag01
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
Content-Type: application/sdp
Content-Length: [len]

v=0
o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [media_ip]
t=0 0
m=audio [media_port] RTP/AVP 8 18 101
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20

]]>
</send>

<pause milliseconds="1000"/>

<!-- The 'crlf' option inserts a blank line in the statistics report. -->
<send retrans="500" crlf="true">
<![CDATA[

UPDATE [$3] SIP/2.0
[last_Via:]
To: [$1]
From: [$2];tag=sippTag01
[last_Call-ID:]
CSeq: 11 UPDATE
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
Content-Type: application/sdp
Content-Length: [len]

v=0
o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
s=-
c=IN IP[media_ip_type] [media_ip]
t=0 0
m=audio [media_port] RTP/AVP 8 18 103
a=rtpmap:18 G729/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:103 telephone-event/8000
a=fmtp:103 0-15
a=ptime:20

]]>
</send>

<recv response="200" crlf="true"> </recv>

<pause milliseconds="1000"/>

<send retrans="500">
<![CDATA[
SIP/2.0 200 OK
[last_Via:]
From: [$1]
To: [$2];tag=sippTag01
[last_Call-ID:]
CSeq: [$4]
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
Content-Type: application/sdp
Content-Length: 0

]]>
</send>

<recv request="ACK" crlf="true"> </recv>

<pause milliseconds="2000"/>

<nop>
<action>
<exec play_pcap_audio="../pcap/dtmf_2833_9.pcap"/>
</action>
</nop>

<pause milliseconds="500"/>

<nop>
<action>
<exec play_pcap_audio="../pcap/dtmf_2833_5.pcap"/>
</action>
</nop>

<pause milliseconds="500"/>

<nop>
<action>
<exec play_pcap_audio="../pcap/dtmf_2833_2.pcap"/>
</action>
</nop>

<pause milliseconds="500"/>

<nop>
<action>
<exec play_pcap_audio="../pcap/dtmf_2833_7.pcap"/>
</action>
</nop>

<pause milliseconds="500"/>

<recv request="BYE">
</recv>

<send>
<![CDATA[

SIP/2.0 200 OK
[last_Via:]
[last_From:]
[last_To:]
[last_Call-ID:]
[last_CSeq:]
Contact: <sip:[local_ip]:[local_port];transport=[transport]>
Content-Length: 0

]]>
</send>

<timewait milliseconds="3000"/>

<ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>

<CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>

</scenario>

文件目录结构如下。

sipp.3.6.2/conf/uas-test-update.xml

sipp.3.6.2/pcap/dtmf_2833_9.pcap

启动sipp-uas。

cd sipp.3.6.2/conf

sudo sipp -i 10.55.55.138 -p 5555 -sf uas-test-update.xml

发起呼叫测试。

使用eyebean发起呼叫,并在10秒后挂机,查看fs节点对DTMF的处理情况,fs有收到sipp的DTMF码,但是并没有转发到A路,和上述的问题现象一致。

sip信令和媒体截图

整个呼叫流程的sip信令和媒体截图。

总结

sipp很灵活,可以帮助我们在测试中构建各种模拟场景。

修复方案有多种,后续安排上。

空空如常

求真得真

sipp模拟uas发送update的更多相关文章

  1. 使用appium模拟用户发送短信

    一段简单粗糙的代码.主要是实现的功能是模拟用户发送短信的功能. python版本3.5.2 appium版本1.4.16.1 from appium import webdriver desired_ ...

  2. php使用curl模拟多线程发送请求

    每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...

  3. 使用HttpClient配置代理服务器模拟浏览器发送请求调用接口测试

    在调用公司的某个接口时,直接通过浏览器配置代理服务器可以请求到如下数据: 请求url地址:http://wwwnei.xuebusi.com/rd-interface/getsales.jsp?cid ...

  4. Telnet 模拟邮件发送过程

    Telnet 模拟邮件发送过程 windows要提前开启Telnet客户端的功能,再按照下面步骤完成邮件发送: 1.通过 cmd 进入命令窗口 2.连接要发送邮件的服务器:telnet smtp.al ...

  5. 使用java程序模拟页面发送http的post请求

    在web应用程序中,一般都是通过页面发送http的post请求,但也可以使用java程序来模拟页面发送请求,代码如下: import java.io.BufferedReader; import ja ...

  6. js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq

    js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...

  7. Jmeter 使用技巧 (如何在linux下运行jmeter视窗界面呢)-jmeter如何模拟http发送gzip数据

    jmeter如何模拟http发送gzip数据 有时候我们需要模拟在客户端将数据压缩后, 发送(post)到服务器端. 通常这种情况,会发生在移动终端上. 这样做的好处, 是可以节省流量.  当然, 服 ...

  8. sipp模拟电信运营商VoIP终端测试(SIP协议调试)

    三大运营商都有SIP服务器,用来支持语音对讲,多媒体调度等功能,他们的平台可能不是标准的SIP协议会话. 为了应对没完没了的对接各个厂商的平台,这里再整理了一套协议脚本,毕竟全都是没有意义的无用功,标 ...

  9. sipp模拟freepbx分机测试(SIP协议调试)

    1.sipp的安装 1) 在centos 7.2下安装 yum install make gcc gcc-c++ ncurses ncurses.x86_64 ncurses-devel ncurse ...

  10. C#模拟http 发送post或get请求

    /// <summary> /// 模拟HTTP提交表单并获取返回数据 /// POST /// </summary> /// <param name="Url ...

随机推荐

  1. React项目国际化-React-intl

    npx create-react-app react-intl-demo && cd react-intl-demo,创建react-intl-demo项目.npm install r ...

  2. C#使用Aspose将Word\HTML 转换成PDF文件

    写在前面 Aspose 这个是收费的,直接使用是有水印的 需要用到的dll文件 ==> Aspose.Words.dll.Aspose.HTML.dll.Aspose.Total.lic(授权文 ...

  3. Oracle 锁表查询和解锁方法

    system登录 查询被锁表信息 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, ...

  4. MySQL索引是怎么支撑千万级表的快速查找?

    前言 在 MySQL 官方提到,改善操作性能的最佳方法 SELECT 在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配 ...

  5. [oeasy]python0140_导入_import_from_as_namespace_

    导入import 回忆上次内容 上次学习了 try except   注意要点 半角冒号 缩进 输出错误信息   有错就报告 不要隐瞒 否则找不到出错位置 还可以用traceback把 系统报错信息原 ...

  6. 使用 useRequestEvent Hook 访问请求事件

    title: 使用 useRequestEvent Hook 访问请求事件 date: 2024/7/23 updated: 2024/7/23 author: cmdragon excerpt: 摘 ...

  7. 《最新出炉》系列入门篇-Python+Playwright自动化测试-56- 多文件上传 - 下篇

    1.简介 前边的两篇文章中,宏哥分别对input控件上传文件和非input控件上传文件进行了从理论到实践地讲解和介绍,但是后来又有人提出疑问,前边讲解和介绍的都是上传一个文件,如果上传多个文件,Pla ...

  8. docker 容器挂载技术

    创建和使用桥接网络 docker network create --driver bridge --subnet 192.168.13.0/24 --gateway 192.168.13.1 mqyn ...

  9. python统计班级学生

    python统计班级学生 如下场景: 假设我有一个学生类和一个班级类,想要实现的功能为:    执行班级人数增加的操作.获得班级的总人数:    学生类继承自班级类,每实例化一个学生,班级人数都能增加 ...

  10. java程序设计期末复习总结&复盘

    java复习 java的特点:简单.面向对象.可移植.跨平台.分布式.多线程.稳定安全.高性能 一个数组可以存放许多不同类型的数值. (F) StringBuffer类是线程安全的,StringBui ...