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.设置动画时长 设置动画持续的时 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 设置Session存活时长
方式一:修改所有的session默认时长,修改tomcat目录下的conf文件夹下的web.xml文件. <session-config> <session-timeout>希 ...
- (转载)【TP5.0】设置session有效时长+修改默认存储路径
//查看默认session存储路径:print_r(session_save_path()); \thinkphp\helper.php if (!function_exists('ses ...
- 【Android端 APP 启动时长获取】启动时长获取方案及具体实施
一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分 ...
- js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总
在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要. 什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...
- Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...
- 大文件视频断点续传插件resumabel.js,优化上传速度,缩短最后一片等待时长。
在angular中使用resumable.js遇到的一个问题:大视频上传到99-100%时,此时正在上传最后一片,最后一片的xhr一直是pending状态.原因插件会检查第一片和最后一片的元数据,检测 ...
- 使用FFMPEG进行一些视频处理(C#)视频合并、转码、获取时长
FFMPEG的强大无需多说,举几个用到的功能,直接贴代码了 还有更多命令用到时搜索即可 视频转码 ) { var args = "-y -i {0} -vcodec copy {1}&quo ...
- 使用mediainfo工具统计每个视频文件(媒体文件)播放时长
需求 1.运营那边需要统计大量视频文件的播放时长,并汇总记录到excel表中,问我有什么方法搞定 这边搜索了很多统计媒体文件时长的,主要有以下几种 1.使用java获取 2.使用python获取 3. ...
- js用img代替ajax js心跳 向服务器定时传送参数 主要计算用户在线时长
html: <!doctype html><html><head><meta charset="utf-8"><title&g ...
随机推荐
- C++ Qt开发:ComboBox下拉组合框组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ComboBo ...
- Colaboratory使用教程
Google Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.同时 ...
- 面试官:说说MVCC的执行原理?
MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于解决数据库并发访问中,数据一致性问题.它通过在读写操作期间保存多个数据版本,以提供并发事务间的隔离 ...
- Python 实现HTML 转Word
之前文章分享过如何使用Spire.Doc for Python库将Word文档转为HTML格式,反过来,该库也能实现HTML到Word文档的转换.通过代码进行转换,避免了手动复制粘贴费时间,并且可能会 ...
- 酷表ChatExcel -北大出品免费自动处理表格工具
酷表ChatExcel是通过文字聊天实现Excel的交互控制的AI辅助工具,期望通过对表输入需求即可得到处理后的数据(想起来很棒),减少额外的操作,辅助相关工作人员(会计,教师等)更简单的工作.Cha ...
- Windows 监控配置
1:Windows2003服务器 2:Windows Sever 2008安装snmp 3:Windows Sever 2012安装snmp 4:Windows 10安装snmp 服务配置 双击打开[ ...
- Linux SNMP监控配置
1, 安装SNMP服务 [root@zlm log]# yum -y install net-snmp net-snmp-utils 2, 编辑SNMP配置文件[root@zlm log]# vim ...
- maven系列:属性管理和版本管理
目录 一. 属性配置与使用 ①:定义属性 ②:引用属性 二. 资源文件引用属性 ①:定义属性 ②:配置文件中引用属性 ③:开启资源文件目录加载属性的过滤器 ④:配置maven打war包时,忽略web. ...
- 仿微信语音聊天webrtc
主要技术 MediaRecorder 录音 webrtc 获取麦克风 URL.createObjectURL 转换为url(实际生产中,通过后端转换blob为mp3网址) 实现elementui+vu ...
- 华为云应用服务网格最佳实践之从Spring Cloud 到 Istio
摘要:在全球首届社区峰会IstioCon 2021中,华为云应用服务网格首席架构师张超盟发表了<Best practice:from Spring Cloud to Istio>主题演讲, ...