freeswitch设置多个execute_on_media
概述
freeswitch是一款简单好用的VOIP开源软交换平台。
fs中有非常多的接口和通道变量,使用方式多变。
官方文档有时候也仅仅是介绍了最基本的使用方法和格式。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.6
GCC:4.8.5
execute_on_xxxx
fs提供了一系列的execute_on_xxxx通道变量,供使用者设置,常见的如下。
execute_on_answer
execute_on_pre_answer
execute_on_media
execute_on_ring
execute_on_tone_detect
execute_on_originate
execute_on_post_originate
execute_on_pre_originate
execute_on_pre_bridge
execute_on_post_bridge
每一个通道变量对应呼叫流程中的状态,符合呼叫状态即会调用。
比如execute_on_media,当收到183或200之后,有媒体通道建立成功,则调用对应的APP。
用法,execute_on_media特别适合做录音的启动点,可以把早期媒体和正常通话都录下来。
<action application="export" data="execute_on_media=app + params"/>
但是某些场景下,我们需要在一个状态时调用多个APP,比如当有媒体进入的时候,我们希望同时开启录音和音频检测。
<action application="export" data="execute_on_media=record_session ${record_file}.wav"/>
<action application="export" data="execute_on_media=spandsp_start_dtmf"/>
这样的配置在实际业务流程中,由于execute_on_media是通道变量,后一个会覆盖前一个,最后只会执行一个“spandsp_start_dtmf”的APP。
源码
查看switch_channel.c的源码,execute_on的函数如下,参数2“variable_prefix”为“execute_on_media”。
SWITCH_DECLARE(switch_status_t) switch_channel_execute_on(switch_channel_t *channel, const char *variable_prefix)
{
switch_event_header_t *hp;
switch_event_t *event, *cevent;
int x = 0;
switch_core_get_variables(&event);
switch_channel_get_variables(channel, &cevent);
switch_event_merge(event, cevent);
for (hp = event->headers; hp; hp = hp->next) {
char *var = hp->name;
char *val = hp->value;
if (!strncasecmp(var, variable_prefix, strlen(variable_prefix))) {
if (hp->idx) {
int i;
for (i = 0; i < hp->idx; i++) {
x++;
do_execute_on(channel, hp->array[i]);
}
} else {
x++;
do_execute_on(channel, val);
}
}
}
switch_event_destroy(&event);
switch_event_destroy(&cevent);
return x ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
}
可以看出,execute_on的处理流程中,会把event的全部headers遍历一遍,对于每个header,对headername和variable_prefix进行比较。
匹配则检查header的idx,idx不为0的时候,对header下的array字段轮询调用do_execute_on。
这里有两种配置方案可以实现我们需要的多次execute_on_media。
第一种,比较明显,利用header的idx,对execute_on_media设置多个值。
<action application="export" data="execute_on_media[0]=log::execute_on_media[0]"/>
<action application="export" data="execute_on_media[1]=log execute_on_media[1]"/>
第二种,隐藏方案,strncasecmp只比较固定长度。
<action application="export" data="execute_on_media-1=log::execute_on_media[0]"/>
<action application="export" data="execute_on_media-2345=log execute_on_media[1]"/>
测试方案
测试方案使用第一种配置方案,dialplan如下。
<action application="export" data="execute_on_media[0]=log::execute_on_media[0]"/>
<action application="export" data="execute_on_media[1]=log execute_on_media[1]"/>
测试结果
发起呼叫,dialplan的流程日志如下。
2023-11-22 17:54:46.345184 [NOTICE] sofia_media.c:92 Pre-Answer sofia/external/10011@10.55.55.138!
EXECUTE sofia/external/10011@10.55.55.138 log(execute_on_media[1])
2023-11-22 17:54:46.345184 [DEBUG] mod_dptools.c:1742 execute_on_media[1]
...
2023-11-22 17:54:46.345184 [DEBUG] sofia.c:7084 Channel sofia/external/10011@10.55.55.138 entering state [early][183]
2023-11-22 17:54:46.345184 [DEBUG] switch_ivr.c:623 sofia/external/10011@10.55.55.138 Command Execute log(execute_on_media[0])
EXECUTE sofia/external/10011@10.55.55.138 log(execute_on_media[0])
2023-11-22 17:54:46.345184 [DEBUG] mod_dptools.c:1742 execute_on_media[0]
总结
execute_on大部分源码在switch_channel.c中。
思考为什么测试结果中,先执行log1,再执行log0。
空空如常
求真得真
freeswitch设置多个execute_on_media的更多相关文章
- freeswitch设置支持视频语音编码
1.修改FreeSWITCH安装路径下/conf/var.xml文件中,增加: <X-PRE-PROCESS cmd=="set" data="proxy_medi ...
- FreeSWITCH技巧:notify与message-waiting
FreeSWITCH技巧:notify与message-waiting @(Freeswitch经验点滴) 现象描述 在客户端登陆抓包时,发现了FreeSWITCH发来的包: NOTIFY sip:9 ...
- 线程池c3p0和dbcp2的配置初始化实例
一.c3p0 public class ConnectionManager { public static ComboPooledDataSource dataSource; static { try ...
- Linux命令总结大全,包含所有linux命令
使用说明:此文档包含所有的Linux命令,只有你想不到的没有你看不到的,此文档共计10万余字,有8400多行,预计阅读时间差不多需要3个小时左右,所以要给大家说一说如何阅读此文档 为了方便大家阅读,我 ...
- FreeSWITCH黑名单功能设置
功能描述:对呼叫的号码进行过滤 步骤: 1.编译mod_blacklist 模块:进入源目录/usr/local/src/freeswitch --> make mod_blacklist-i ...
- 使用FreeSWITCH做电话自动回访设置
一.背景介绍: 目前公司在处理客户回访方面,需要人工进行电话回访,尤其是逢年过节的时候,电话问候更能体现服务的品质: 在某些公司,电话销售员需要给大批量的陌生用户打电话,如果能过滤掉不关心的用户,销售 ...
- FreeSWITCH 客户端fs_cli连接设置(acl)
FreeSWITCH 默认配置只能 在本机连接, 要从 外面连接, 就要配置: acl.conf.xml::network-lists/list event_socket.conf.xml::appl ...
- freeswitch控制台日志级别设置以及存储
1.在管理控制台上设置 console loglevel (0~7)越往上级别越大 2.打开sip详细日志 sofia profile internal siptrace on 3.关闭sip详细日志 ...
- freeswitch模块之event_socket
这是我之前整理的关于freeswitch mod_event_socket的相关内容,这里记录下,也方便我以后查阅. mod_event_socket以socket的形式,对外提供控制FS一种途径, ...
- freeswitch呼叫流程分析
今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...
随机推荐
- valgrind 配合 gdb 调试程序
在实际研发过程中,可能会遇到过这样的问题:测试通过 valgrind 验证当前代码存在变量未初始化的问题,但仅通过 valgrind 测试报告,研发无法确认具体的应用场景.本文将通过 valgrind ...
- Effective C++ 笔记(二)
16.保证异常安全 1 void PrettyMenu::changBackground(std::istream &imgSrc) 2 { 3 lock(&mutex); 4 del ...
- 使用 AutoGPTQ 和 transformers 让大语言模型更轻量化
大语言模型在理解和生成人类水平的文字方面所展现出的非凡能力,正在许多领域带来应用上的革新.然而,在消费级硬件上训练和部署大语言模型的需求也变得越来越难以满足. Hugging Face 的核心使命是 ...
- Web通用漏洞--sql注入
SQL注入 mysql注入目的:获取当前web权限 mysql注入--常规查询&union联合查询 MYSQL--Web组成架构 服务器搭建web服务可能存在多个站点搭建在一台服务器中,数据集 ...
- vs2022离线安装教程
因特殊需要,要离线安装vs2022的环境,完成配置后将安装过程记录. 第一步:下载visual Studio 引导程序以创建布局 在微软的官网下载合适的引导程序. 官网地址:创建基于网络的安装 - V ...
- Codeforces 1462E2 Close Tuples (hard version)
题意 给一个长度为\(n\)的数组,取\(m\)个数字,其中最大值最小值相差不大于\(k\),问这种方式有多少种,答案\(\mod 10^9+7\). 分析 通过简单版本大概了解了这题要枚举最小值来判 ...
- 保护个人数据安全,使用luks加密硬盘分区
create:2023-01-24 17:44:44 准备工作 新硬盘4T,无数据.在root用户或sudo状态下执行. 首先创建分区表,由于mbr最大支持只有2T,因此分区表创建为gpt格式. 然后 ...
- 谈谈JSF业务线程池的大小配置
1.简介 JSF业务线程池使用JDK的线程池技术,缺省情况下采用Cached模式(核心线程数20,最大线程数200).此外,还提供了Fixed固定线程大小的模式,两种模式均可设置请求队列大小. 本文旨 ...
- 用OLED屏幕播放视频(2): 为OLED屏幕开发I2C驱动
下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这是此系列文章的第2篇, 主要总结和记录一个I ...
- 在线PNG, JPG, BMP 转ICO图标,适用WINDOWS XP, VISTA, 7, 8, 10
在线PNG, JPG, BMP 转ICO图标网址: http://static.krpano.tech/image2ico 该网站可以把PNG, JPG和BMP图片转换成包含多个层级的ICO图标, 可 ...