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

相关文章

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷