OpenSIPS 通话中 UPDATE 请求导致没有声音问题

文章目录

  • 1. 问题现象
  • 2. 抓包排查
  • 3. 问题分析及解决方案

1. 问题现象

在 SIP 应用的开发中,通话一端听不到声音是比较常见的问题。一般来说,没有声音意味着 RTP 传输存在障碍,追根究底就是网络不通或者端口未开放等原因。但在实践中,真正造成 RTP 传输故障的原因各式各样,以下是笔者遇到的一个案例:

  1. 坐席使用软电话注册到 OpenSIPS,常驻拉起后拨打外部用户,媒体流传输正常
  2. 坐席使用硬话机注册到 OpenSIPS,常驻拉起后拨打外部用户,没有声音

2. 抓包排查

问题的切入点显而易见,硬话机的行为肯定和软电话存在不一致,从而导致问题的发生。通常遇到这种情况 SIP 抓包是不二的法门,以下是笔者使用 sngrep 抓到的 SIP 交互包,对比可以发现一个明显的差异:

使用硬话机时,在 SDP 协商完成 SIP 会话已经建立的情况下,使用 FreeSWITCH 的 bridge 命令接通坐席和用户时 FreeSWITCH 发出了一个 UPDATE 请求给到 OpenSIPS

在这里插入图片描述

3. 问题分析及解决方案

在进行问题分析前首先要确定以下两点:

  1. SIP 协议中的 UPDATE 请求
    UPDATE 请求用于不改变会话状态的前提下修改会话的参数,可用于 SDP 的重新协商
  2. OpenSIPS 的媒体代理
    笔者的应用架构中 OpenSIPS 不仅仅具有注册代理的功能,在其核心脚本中也会使用 rtpengine 作为媒体代理服务器。OpenSIPS 进行媒体代理的原理并不复杂,关键逻辑只有两个:
    1. 替换 INVITE 请求中 SDP 的 IP 和端口为媒体代理服务器 IP 端口,再将其转发给 SIP 终端;
    2. 当 SIP 终端响应 200 时,替换响应中 SDP 的 IP 端口为媒体代理服务器 IP 端口,再将其转发给 INVITE 请求的发起端

综合以上信息,再来分析 sngrep 抓到的 SIP 交互就可以发现问题所在:

  1. 经过 OpenSIPS 处理后,由 INVITE 请求响应建立起的会话已经形成了 FreeSWITCH <--> rtpenginertpengine <--> 硬话机 之间的 rtp 传输连接,此时 rtp 传输正常
  2. 在 bridge 接通外部用户和使用硬话机的坐席时,FreeeSWITCH 不知道出于什么原因发起了 UPDATE 请求重新进行 SDP 协商。从 SIP 交互报文看,此次协商的结果是 FreeSWITCH 和 硬话机 绕过了 rtpengine 进行 rtp 直连,而二者之间网络并未打通
  3. 检查 OpenSIPS 脚本,发现脚本中对 INVITE 请求进行了媒体代理,但是未对 UPDATE 请求做任何处理

至此问题原因已经清晰,一个简单快速的解决方案是在 OpenSIPS 脚本中对 UPDATE 请求也进行媒体代理的处理,经修改后问题不复现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin Flow 转换以及上下游处理

本片文章主要介绍Flow上下游处理&#xff0c;上游一个Flow使用map&#xff0c;上游两个Flow使用zip&#xff0c;上游三个Flow及以上使用combine 1、下面代码展示了upStreamFlow作为上游&#xff0c;downStreamFlow作为下游&#xff0c;通过对upStreamFlow使用map操作符函数将…

13.Oracle中nvl()与nvl2()函数详解

Oracle中nvl()与nvl2()函数详解&#xff1a; 函数nvl(expression1,expression2)根据参数1是否为null返回参数1或参数2的值&#xff1b; 函数nvl2(expression1,expression2,expression3)根据参数1是否为null返回参数2或参数3的值 1.nvl&#xff1a;根据参数1是否为null返回参数…

数据结构——图

文章目录 图的基本概念顶点边度无向图和有向图无权图和带权图 图的存储邻接矩阵存储邻接表存储 图的搜索广度优先搜索深度优先搜索 图是一种较为复杂的非线性结构。 为啥说其较为复杂呢&#xff1f; 根据前面的内容&#xff0c;我们知道&#xff1a; 线性数据结构的元素满足唯…

nodejs

文章目录 一、nodejs1.1、npm配置命令别名 一、nodejs 1.1、npm配置命令别名 我们可以使用“node index.js”的方式运行代码 也可以利用npm配置别名的方式运行代码 在package.json中配置别名&#xff0c;利用“npm run 别名”也可以运行 start是特殊的&#xff0c;可以“npm r…

ssm+Vue.js在线购物系统源码和论文

ssmVue.js在线购物系统源码和论文049 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势…

GPT---1234

GPT:《Improving Language Understanding by Generative Pre-Training》 下载地址:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdfhttps://cdn.openai.com/research-covers/language-unsupervised/language_understa…

保姆级使用vmware安装Ubuntu-server版

保姆级VMware安装Ubuntu20服务器版 文章目录 保姆级VMware安装Ubuntu20服务器版前期准备一、安装vmware二、下载Ubuntu镜像 VMware安装Ubuntu201. 启动Workstation Pro或者Workstation Player,进入软件后新建一个虚拟机2. 进入引导界面选择默认的即可3. 点击下一步即可4. 选择操…

Selenium超级详细的教程

Selenium是一个用于自动化测试的工具&#xff0c;它可以模拟用户在浏览器中的各种操作。除了用于测试&#xff0c;Selenium还可以用于爬虫&#xff0c;特别是在处理动态加载页面时非常有用。本文将为您提供一个超级详细的Selenium教程&#xff0c;以帮助您快速入门并了解其各种…

如何使用 Gson 将对象转换为 JSON 字符串

在现代的软件开发中&#xff0c;经常需要将 Java 对象转换为 JSON 字符串&#xff0c;以实现数据的序列化和传输。Gson 是一个流行的 Java 库&#xff0c;它提供了方便的方法来将对象转换为 JSON 字符串。本文将介绍使用 Gson 库的步骤&#xff0c;将一个对象转换为 JSON 字符串…

VR全景加盟会遇到哪些问题?全景平台会提供什么?

想创业&#xff0c;你是否也遇到这些问题呢&#xff1f;我是外行怎么办&#xff1f;没有团队怎么办&#xff1f;项目回本周期快吗&#xff1f;项目靠谱吗&#xff1f;加盟平台可信吗&#xff1f;等等这类疑问。近几年&#xff0c;VR产业发展迅速&#xff0c;尤其是VR全景项目在…

C++中内存的分配

一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。 2、堆区&#xff08;heap&#xff09; — 一般由程序员分配释放&#xff0c; 若程序…

Cypress 做 e2e 测试,如何在获得某个 checkbox 后先判断它是否被 check 然后再更改它的状态?

比如如果这个 checkbox 已经被 check 了&#xff0c;就不做操作&#xff0c;否则将它 check。 我们假设这个 checkbox 的 data-testid 属性是 VendorCodeCheckbox-0-test-id。Cypress 的代码如下&#xff1a; cy.getByTestId(VendorCodeCheckbox-0-test-id).shadow().find([r…

vue base64图片转file流 下载到本地 或者上传

<img :src"data:image/png;base64,form.img" style"max-width:280px;max-height: 280px;margin: auto;" />// base64 转file const base64ToFile()>{let byImg atob(form.img); // 解码base64let n byImg.lengthlet a new Uint8Array(n);while…

[ VMware 虚拟机 ] 启动不了图形界面,报 “The system is running in low-graphics mode” 错误

文章目录 问题现象异常原因解决方案 问题现象 在启动虚拟机的时候&#xff0c;不能正常的进入图形界面&#xff0c;报 “The system is running in low-graphics mode” 错误。 异常原因 启动界面的xorg.conf文件失败并删除。 解决方案 1、点击异常界面上的 “ok”后&…

编码基础一:侵入式链表

一、简介概述 1、普通链表数据结构 每个节点的next指针指向下一个节点的首地址。这样会有如下的限制&#xff1a; 一条链表上的所有节点的数据类型需要完全一致。对某条链表的操作如插入&#xff0c;删除等只能对这种类型的链表进行操作&#xff0c;如果链表的类型换了&#…

静态代码扫描持续构建(Jenkins)

前提条件 已正确安装、配置Jenkins环境&#xff0c;并装有 Gradle 插件、HTML 插件、SVN 插件等。如下图所示&#xff1a; 已正确安装、配置android sdk&#xff0c;在cmd窗口输入命令“android -h”,回车 配置步骤 打开Jenkins&#xff0c;新建一个job&#xff0c;输入项目…

Discuz!论坛发帖标题字数限制80字符可以修改吗?修改发帖标题字数的方法

Discuz!论坛发帖标题字数限制80字符修改方法 1.数据库修改2.修改JS验证字符数文件3.修改模板中写死的字符限制数4.修改函数验证文件5.修改语言包文件6.更新缓存 Discuz X3.4论坛网站帖子标题字数限制80字符&#xff0c;当我们想使用长标题的时候就得一删再删&#xff0c;实在是…

服务器CPU飚高排查

排查思路 当正在运行的Java服务导致服务器的CPU突然飙高时&#xff0c;我们该如何排查定位到哪个接口的哪行代码导致CPU飙高的问题呢&#xff1f;我主要提供两个方案&#xff1a; jstackarthas 准备工作 代码准备 现在需要准备一段可以让服务器CPU飙高的代码以及把代码部署…