【FreeSwitch开发实践】外呼线路电话收不到回铃音问题的解决

news2024/9/21 3:14:59

✨ 博客主页:小小马车夫的主页
✨ 所属专栏:FreeSwitch开发实践
✨ 专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内容。内容在持续更新中,如果感兴趣可以对专栏进行订阅~

请添加图片描述

文章目录

  • 一、前言:
  • 二、问题概述
    • 2.1 软件环境
    • 2.2 问题描述
    • 2.3 拨号命令
  • 三、原因分析:
  • 四、解决方案:
  • 五、后记


一、前言:

FreeSwitch服务器在对接通信线路时常会遇到一些没有声音的问题,今天就介绍一个收不到回铃音和提示音的问题。


二、问题概述

2.1 软件环境

FreeSwitch 1.10.7
CentOS 7.4 64位

2.2 问题描述

FreeSwitch使用外呼线路拨打电话,不能收到回铃音或提示音(就是早期媒体收不到),但可以收到SIP信令数据和电话接通后的语音数据。

2.3 拨号命令

bgapi originate sofia/external/18600000001@120.120.120.120:2018 &echo

说明:
18600000001 为被手机号码
120.120.120.120:2018 为线路的IP和端口
echo为回音程序,拨打回音程序是因为可以清楚的听到返回回来的语音


三、原因分析:

经过一系列定位和网上搜索一些遇到类似问题资料,如nat穿透相关的FreeSwitch配置,都不起作用。不过大体原因知道了一些。
问题的原因是FreeSwitch服务器是公司的内网中,而与线路通信要用外网,首先FreeSwitch知道线路的外网地址,而线路并不清楚FreeSwitch的媒体外网地址,或者即便知道了,由于一个公司的外网到内网要经过层层防火墙、网关,要涉及网络穿透NAT,中间链路层数较多,不易定位问题。但有一点,只要FreeSwitch先向线路发送一个语音RTP数据包,由于里会携带FreeSwitch服务器的IP外网信息和端口,那么线路服务器也就能定位FreeSwitch服务器,数据自然也就能发送过来。


四、解决方案:

实现一个模块APP, 它的功能是在回铃音开始时,收到数据后,返回一帧数据(一帧就可以)。
具体实现步骤如下:

    1. 在模块APP中 订阅media bug
    1. 在media bug回调函数中,获取语音流
    1. 获取语音流后,将数据重新返回给被叫
    1. 确保第3步只写一次

其中,media bug回调函数关键代码如下:

switch_bool_t myapp_media_bug_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
	switch_core_session_t* session = detector->session;
	switch (type) {
	case SWITCH_ABC_TYPE_READ_REPLACE:
	{
		switch_frame_t *frame;
		if (!(frame = switch_core_media_bug_get_read_replace_frame(bug))) {
			return SWITCH_FALSE;
		}
		if (detector->is_send_rtp) {
			detector->is_send_rtp = SWITCH_FALSE;
			switch_core_session_write_frame(session, frame, SWITCH_IO_FLAG_NONE, 0);
		}

		break;
	}
	default:
		break;
	}
	return SWITCH_TRUE;
}

说明:
模块APP创建方法详见《FreeSwitch开发实践】自定义模块创建与使用》
media bug创建方法详见《【FreeSwitch开发实践】media bug获取通话语音流》


五、后记

本文的方法能解决没有回铃音的问题,但后来通过网络的方法,也就网关配置的方法也解决了问题,而且相比用FreeSwitch自定义模块的方法,更加简单。不过通过上方法,能更加清楚问题本质原因,收获也是很大的。
以上,仅供大家作参考~


如果觉得有些帮助或觉得文章还不错,请关注一下博主,你的关注是我持续写作的动力。另外,如果有什么问题,可以在评论区留言,或者私信博主,博主看到后会第一时间进行回复。
【间歇性的努力和蒙混过日子,都是对之前努力的清零】

欢迎转载,转载请注明出处:https://xiao2macf.blog.csdn.net/article/details/127954470

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

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

相关文章

从URL输入到页面展现到底发生什么?

从开发&运维角度方面来看,总体来说分为以下几个过程: DNS 解析:将域名解析成 IP 地址TCP 连接:TCP 三次握手发送 HTTP 请求服务器处理请求并返回 HTTP 报文浏览器解析渲染页面断开连接:TCP 四次挥手 一、什么是URL&#xff…

[附源码]java毕业设计书店网站论文

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

如何从0到1实现一个基于bitcask的kv存储引擎

愿景 ​ 今年大部分业余时间都在nutsdb的开源贡献上,nutsdb是基于bitcask模型实现的持久化存储引擎,提供了诸如list,set等多种丰富的数据结构。近来很多小伙伴,其中也有一些我的好朋友陆陆续续加入到这个项目上来。为了帮助小伙伴…

pytorch中Dataset和Dataloader的使用

1.datasets下载数据集 root :代表着路径,表示现存或者准备存储的地方。 train :代表是否下载训练数据集,如果否的话就下载测试数据集 transform: 如果想对数据集进行什么变化,在这里进行操作 target_transform:跟上面的一样 download:如果是T…

ORB-SLAM2 ---- Tracking::CreateInitialMapMonocular函数

目录 1.函数作用 2.函数解析 2.1 调用函数解析 2.2 Tracking::CreateInitialMapMonocular函数总体思路 2.2.1 代码 2.2.2 总体思路解析 2.3 MapPoint::ComputeDistinctiveDescriptors函数解析 2.3.1 函数作用 2.3.2 代码 2.3.3 函数解析 2.4 MapPoint::UpdateNor…

idea使用谷歌翻译

项目场景: idea google翻译 问题描述 由于某些原因,现在谷歌翻译一直不能正常使用… 解决方案: 使用 pigcha 工具 设置也超级简单,每个月也就三十多块钱,可正常使用国内外网络。 电脑网络代理设置如下:…

XSS平台与cookie获取

今天继续给大家介绍渗透测试相关知识,本文主要内容是XSS平台与cookie获取。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权…

[附源码]SSM计算机毕业设计大学生心理咨询网站JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【ElasticSearch学习笔记】一、ES下载、安装、目录结构、root用户权限问题、kibana下载安装

下载和安装一、下载二、安装2.1 JDK的安装2.2 ElasticSearch的安装2.3 启动ES2.4 多节点启动三、Kibana的安装一、下载 以下载7.10.0为例: https://www.elastic.co/cn/downloads/elasticsearch 选择对应的操作系统,我是为了安装在CentOS上面&#xff0c…

微信小程序 | 做一个小程序端的扫雷游戏

📌个人主页:个人主页 ​🧀 推荐专栏:小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏!从个人到商业的全套开发教程,实打实的干货分享,确定不来看看? …

【第三部分 | 移动端开发】3:Flex布局

目录 | Flex布局简介 | Flex父元素属性 设置主轴的方向 flex-direction 设置主轴上的子元素排列方式 justify-content 设置子元素是否换行 flex-wrap 设置侧轴上的子元素排列方式(单行) align-items 设置侧轴上的子元素的排列方式(多行…

HIve数仓新零售项目DWD层的构建

HIve数仓新零售项目 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kaf…

网络是怎样链接的--向DNS服务器查询Web服务器的IP地址

文章目录2.1 IP地址的基本知识2.2 域名和IP地址共用理由2.3 DNS本质是什么2.4 浏览器如何获取IP2.5 DNS解析器内部工作原理2.1 IP地址的基本知识 浏览器能够解析网址并生成HTTP消息,但并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来…

DataObjectImpl

DataObjectImpl目录概述需求:设计思路实现思路分析1.DataObjectImpl2.DeadLetterJobQueryImpl3.DeploymentQueryImpl4.Direction5.DynamicBpmnServiceImpl参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,fu…

IDEA2022版本创建maven web项目(两种方式)

目录 一、使用骨架的方式 二、maven中添加 web方式 总结: 前言: 创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式 一、使用骨架的方式 1.打开idea,按照步骤创建一个新的项目 2.点击Mave…

【高级篇】Java JVM实战 之 内存调优

文章目录一、通过Jprofiler调式Dump文件错误⛅ 什么是Jprofiler?⚡使用Jprofiler调试Dump文件二、堆内存调优三、 GC垃圾回收器四、GC常用算法❄️引用计数法⛄复制算法♨️标记清除算法⛽标记压缩⚠️标记清除压缩五、JMM⛵小结一、通过Jprofiler调式Dump文件错误 …

Spark 3.0 - 4.Pipeline 管道的工作流程

目录 一.引言 二.基本组件 三.Pipeline 基本流程 1.训练 Pipeline - Estimator 2.预测 Pipeline - Transformer 四.Pipeline 分解与构造 1.DataFrame 2.Transformer1 - Tokenizer 3.Transformer2 - HashingTF 4.Estimator - LR 5.Pipeline With ParamMap - Estimat…

SpringCloud微服务(一)——Consul服务注册中心

Consul服务注册中心 SpringCloud 中文官网:https://www.springcloud.cc/spring-cloud-consul.html Consul是一套开源的分布式服务发现和配置管理系统,Go语言开发。 Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络…

SharedPreferences存储

文章目录 前言 听说SharedPreferences存储技术快过时了,不过如果是单纯的使用的话,不费什么时间成本。 本文的Demo摘录自《第一行代码》。 一.什么是SharedPreferences SharedPreferences,一种通过使用键值对的方式来存储数据的技术。 二…

【深入浅出Spring6】第八期——面向切面编程 AOP

AOP(Aspect Oriented Programming)面向切面编程,属于面向对象编程的一种衍射,是一种编程思想或技术AOP的底层是由动态代理机制实现的 JDK动态代理CGLIB动态代理,自动识别并切换我们也可以通过配置属性指定就是用CGLIB …