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


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

    请添加图片描述


    一、前言:

    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
    
    • 1

    说明:
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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


    五、后记

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


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

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

  • 相关阅读:
    Java学习 (九)基础篇 包机制&JavaDoc
    【华为上机真题 2022】| 差点没过
    C++11开发的消息总线库
    力扣大厂热门面试算法题 - 动态规划
    Java之接口
    cp -r, 保留拷贝的文件原本的权限和属性
    PyCharm使用教程(较详细,图+文)
    算法题Day71
    for循环中var声明导致定时器输出奇特现象的粗略解释
    档案数字化管理能够带来哪些好处
  • 原文地址:https://blog.csdn.net/xxm524/article/details/127954470