freeswitch设置最大呼叫时长
概述
freeswitch 作为开源VOIP软交换,对经过fs的每一通电话都要有足够的控制。
在一通电话呼叫中,通话时长是一个重要的数据,客户在实际使用过程中,会有各种针对呼叫时长的场景需求。
本篇文档讨论fs如何设置最大呼叫时长,并从源代码的角度解析fs的实现原理。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.8.7
GCC:4.8.5
定时挂机
freeswitch提供了APP接口“sched_hangup”,帮助使用者实现定时挂机功能,以达到设置最大呼叫时长的需求。
使用方法很简单,根据fs的官方文档,调用格式如下。
//在拨号计划中的调用格式
<action application="sched_hangup" data="[+]<time>[ <hangup_cause>]"/>
//作为API接口的调用格式
sched_hangup [+]<time> <uuid>[ <hangup_cause>]"
//实例,C++代码
//设置最大通话时长,默认55秒
ptmp = switch_core_get_variable("max_duration");
max_duration = (ptmp? ptmp: "+55");
if (SWITCH_STATUS_SUCCESS != switch_core_session_execute_application(session, "sched_hangup", max_duration))
{
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING,
"sched_hangup failed, max_duration = %s\n", max_duration);
}
//实例,拨号计划
<action application="sched_hangup" data="+55 allotted_timeout"/>
<action application="sched_hangup" data="+55"/>
<action application="sched_hangup" data="55"/>
上面的拨号计划实例中,三种调用方式的参数不同,但是实际测试结果是一样的。
这一点和官方接口文档有差异。
Time in seconds.
If used with + then the call will be hung up after that number of seconds.
If used without + then the given value is considered the number of seconds since the epoch, 1970-01-01 00:00:00 UTC
接口描述中,“sched_hangup +55”和“sched_hangup 55”的结果应该是有区别的。
下面从源代码里找找看有什么地方做了特殊处理。
源代码
sched_hangup接口代码在mod_dptools模块,逻辑很简单,处理参数,调用“switch_ivr_schedule_hangup”接口。
处理参数的过程中,对于参数1中“+”号的处理,代码如下
int sec = atol(argv[0] + 1);
if (*argv[0] == '+') {
when = switch_epoch_time_now(NULL) + sec;
} else {
when = atol(argv[0]);
}
//处理之后,when的值为”now+55”和“55”
switch_ivr_schedule_hangup接口代码在“switch_ivr_async.c”中,接口中直接调用“switch_scheduler_add_task”创建了一个定时任务,定时任务的逻辑就是对指定的呼叫挂机。
上面的逻辑中,都没有涉及执行时间的特殊处理,只剩下“switch_scheduler_add_task”创建任务接口,该接口在之前的文章“freeswitch的任务引擎实现分析”中有详细介绍。
//switch_scheduler_add_task,任务执行时间的特殊处理,小于now则+now
if (task_runtime < now) {
container->task.repeat = (uint32_t)task_runtime;
task_runtime += now;
}
这样处理之后,上面“sched_hangup”调用中“+55”和“55”俩种参数的结果就统一了。
总结
freeswitch的功能接口部分有很多实用的功能和代码流程,适合有fs深度定制需求的开发参考。
最后放一张简图,便于理解。定时任务的数据结构和处理实际上要比这个复杂。
空空如常
求真得真
freeswitch设置最大呼叫时长相关推荐
- XamarinAndroid组件教程设置动画的时长参数
XamarinAndroid组件教程设置动画的时长参数 在添加动画的时候,开发者还可以动画参数进行设置,如动画持续的时长.插值器等.下面依次讲解动画参数的设置方法. 1.设置动画时长 设置动画持续的时 ...
- caps、erl、自动机、平均呼叫时长和媒体资源的关
文章目录 前言 一.caps 二.ERL 三.自动机 四.媒体资源 总结 前言 提示:这里可以添加本文要记录的大概内容: 不觉间从事电信软件有12年之久了,其中常见一些术语,刚入门的同事经常问我cap ...
- android 设置动画时长,XamarinAndroid组件教程设置动画的时长参数
XamarinAndroid组件教程设置动画的时长参数 在添加动画的时候,开发者还可以动画参数进行设置,如动画持续的时长.插值器等.下面依次讲解动画参数的设置方法. 1.设置动画时长 设置动画持续的时 ...
- 设置自动关门时长_自动上锁,鹿客智能指纹锁classic2s,双十一值得买
国内智能门锁领军品牌鹿客三年前携爆款产品Classic亮相,销售火爆.好评如潮,时至今日依旧畅销.如今Classic 2S升级来袭,除了延续Classic的经典,还进行了全方位升级,包括自动上锁.离合 ...
- spring boot设置session超时时长(自定义spring boot session超时时长)
针对spring boot 2.0 以下版本(亲测1.5.10)设置session超时的方法如下: 1.添加依赖,代码如下: <dependency><groupId>org. ...
- freeswitch 会议室录音文件时长小于会议室时长
前段时间公司的产品发现了一个比较蛋疼的bug,就是会议室录音文件的时长比会议室时长短. 在这边先简单介绍一下使用的东西,公司做的是voip,使用的是开源的freeswtich,所有的功能都是这个开源工 ...
- 设置自动关门时长_小米苹果全适配,绿米D100全自动指纹锁新鲜上手
Ciao Bella,我是老房 关于智能指纹门锁,其实老房老早就想装了.家里有位平均一两个月就要忘带一次钥匙的媳妇儿,甚至有好几次,我特意说了晚上有应酬晚回去千万记得要带钥匙,结果喝酒喝到一半,一个电 ...
- (转载)【TP5.0】设置session有效时长+修改默认存储路径
//查看默认session存储路径:print_r(session_save_path()); \thinkphp\helper.php if (!function_exists('session') ...
- axios关于针对请求时长策略设计的思考
前言 在我们的业务请求中,有很多时候会针对有不同时长的需求策略性设置.这里针对这个需求进行详细的展开. 针对这种情况,我们的timout的一般是根据请求地址来的,所以核心处理技巧便是如何根据不同的re ...
最新文章
- 吴恩达新动作:建立全新机器学习资源Hub,「以数据为中心的AI」大本营
- Binder相关面试总结(一):为什么Android要采用Binder作为IPC机制?
- R之ddlpy函数学习[转载]
- 蜂鸣器接入_无源蜂鸣器的原理和和mixly结合制作电子琴
- 竞品分析框架及案例-探索业务方向
- bootstrap文件不能被识别_树莓派安装openCV做图像识别
- 像素画高级教程:怎样画流动的水
- 爬虫爬到的网页源代码不是真正的源代码_Python爬虫经常爬不到数据?你可以看一下这篇文章...
- Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程
- Bootcamp Mac 安装Win10 教程
- mysql libc.so.6_解决安装mysql动态库libstdc++.so.6、libc.so.6版本过低问题
- 顺德职业技术学院计算机专业录取线,顺德职业技术学院录取分数线2021是多少分(附历年录取分数线)...
- R语言ETL工程系列:读写(read/write)
- php导出word乱码,php导出的word会乱码吗
- 小白学爬虫---爬取中国房价工资比
- NHWC BGR -> NCHW RGB
- 非科班关于gan的一点点学习
- Doris-查询(三)
- 白板体现计算机什么方面应用,白板汉字论文,关于电子白板在小学低年级识字写字教学中的运用相关参考文献资料-免费论文范文...
- 【无标题】求各大ios shsh版本!能不能给大哥?