FreeSWITCH的SDP读取与设置

2024-05-16 03:18
文章标签 读取 设置 freeswitch sdp

本文主要是介绍FreeSWITCH的SDP读取与设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在对接第三方SIP客户端和网关时,常常需要修改手工修改SDP信息。 下面给出设置修改SDP信息的两种方法,如下: 
- 通过拨号方案修改SDP信息 
- 通过API命令修改SDP信息

通过拨号方案修改SDP信息

Edit sdp channel variables by dialplan.

拨号方案重写SDP信息

在拨号方案里面通过set方法设置switch_r_sdp的值,该方法会直接覆盖掉原有的sdp值。 
具体拨号方案如下所示:

<extension name="show_info"><condition field="destination_number" expression="^9192$"><action application="answer"/><action application="info"/><action application="log" data="INFO  ===switch_r_sdp Before:========${switch_r_sdp}"/><action application="set"><![CDATA[switch_r_sdp=v=0
o=- 123456 123 IN IP4 192.168.1.112
s=etmedia
c=IN IP4 192.168.1.113
t=0 0
a=X-nat:0 Unknown
m=audio 4002 RTP/AVP 18 103 102 117 3 0 8 9 118 119 104 4 101
a=rtpmap:18 G729/8000
]]></action><action application="log" data="INFO  ===switch_r_sdp After:============${switch_r_sdp}"/><action application="sleep" data="250"/><action application="hangup"/></condition>
</extension>  

控制台输出如下所示:

2013-06-07 22:04:44.210888 [INFO] mod_dptools.c:1458  ===switch_r_sdp Before:========v=0
o=- 3579631484 3579631484 IN IP4 192.168.1.101
s=etmedia
c=IN IP4 192.168.1.101
t=0 0
a=X-nat:0 Unknown
m=audio 4018 RTP/AVP 18 103 102 117 3 0 8 9 118 119 104 4 101
a=rtpmap:18 G729/8000
a=rtpmap:103 speex/16000
a=rtpmap:102 speex/8000
a=rtpmap:117 iLBC/8000
a=fmtp:117 mode=30
a=rtpmap:3 GSM/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:118 AMR/8000
a=rtpmap:119 AMR-WB/16000
a=rtpmap:104 speex/32000
a=rtpmap:4 G723/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=rtcp:4019 IN IP4 192.168.1.1012013-06-07 22:04:44.210888 [INFO] mod_dptools.c:1458  ===switch_r_sdp After:============v=0
o=- 123456 123 IN IP4 192.168.1.112
s=etmedia
c=IN IP4 192.168.1.113
t=0 0
a=X-nat:0 Unknown
m=audio 4002 RTP/AVP 18 103 102 117 3 0 8 9 118 119 104 4 101
a=rtpmap:18 G729/8000

从上面的输出结果可以看到,在设置完switch_r_sdp后,原有的SDP变量的值都被替换为新值。

拨号方案向A-Leg附加SDP新值

apend new value to A-Leg sdp 
上面的方法会直接覆盖掉所有的SDP值,那如果只是要附加一部分值的话,可以采用下面的方式: 
如下方拨号方案所示:

<extension name="show_info"><condition field="destination_number" expression="^9192$"><action application="answer"/><action application="info"/<action application="set" data="switch_r_sdp=${switch_r_sdp}AS:384"/><action application="sleep" data="250"/><action application="hangup"/></condition>
</extension>  

在原有变量的后面附加上自己需要的值即可。

拨号方案向B-Leg附加SDP新值

append new value to B-Leg SDP 
如果需要在桥接B-Leg之前,修改B-Leg的SDP值的话,需要用到一个通道变量sip_append_audio_sdp 
可采用下面的方式来解决:

<extension name="show_info"><condition field="destination_number" expression="^9192$"><action application="answer"/><action application="info"/><action application="export" data="sip_append_audio_sdp=b=AS:384"/><action application="sleep" data="250"/><action application="hangup"/></condition>
</extension> 
应用场景

在桥接第三方SIP客户端时,需要在SDP在里面增加对方自定义的值才能协商语音成功,在这种场景里面需要用到该变量。(此处是个人理解,如果有更好的应用,欢迎指点)

变量说明

sip_append_audio_sdp在官网的Wiki文档说明如下: 
This may be used to append audio parameters to the SDP sent to B-leg. 
It should/must be set before bridging. 
Usage:

<action application="export" data="sip_append_audio_sdp=a=fmtp:18 annexb=no"/>   

简单翻译下是该变量可以用来设置发送给B-Leg的语音变量,不过,需要在Bridge之前进行设置。

通过API命令修改SDP信息

API命令读取SDP

前提假设

假设现在有两个短号互打,1000为Easytalk,1001为x-lite,1001拨打1000,通话正常建立。

1000对应的通道UUID为:31c0ea2e-53b6-4457-8790-70b1b1c36d10 
1001对应的通道UUID为:6fec25de-34e9-4a4a-9d1c-5284bf023e43

查询A-Leg的SDP信息

使用下面的命令查询使用的SDP: 
FreeSWITCH@wchi-PC> uuid_getvar 6fec25de-34e9-4a4a-9d1c-5284bf023e43 switch_r_sdp
返回结果:

v=0
o=- 2 2 IN IP4 192.168.1.101
s=CounterPath X-Lite 3.0
c=IN IP4 192.168.1.101
t=0 0
m=audio 55190 RTP/AVP 107 119 100 106 0 105 98 8 101
a=rtpmap:107 BV32/16000
a=rtpmap:119 BV32-FEC/16000
a=rtpmap:100 SPEEX/16000
a=rtpmap:106 SPEEX-FEC/16000
a=rtpmap:105 SPEEX-FEC/8000
a=rtpmap:98 iLBC/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=alt:1 1 : +pnfung+ CxnLWcRO 192.168.1.101 55190
查询B-Leg的SDP信息

FreeSWITCH@wchi-PC> uuid_getvar 31c0ea2e-53b6-4457-8790-70b1b1c36d10 switch_r_sdp 
返回结果:

v=0
o=- 3579629755 3579629756 IN IP4 192.168.1.101
s=etmedia
c=IN IP4 192.168.1.101
t=0 0
a=X-nat:0 Unknown
m=audio 4016 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=rtcp:4017 IN IP4 192.168.1.101

API命令设置SDP

设置方法同上面拨号方案类似,都是通过修改通道变量来达到目的。只是修改的方式不同而已。

这篇关于FreeSWITCH的SDP读取与设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993716

相关文章

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu