概述

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设置最大呼叫时长的更多相关文章

  1. XamarinAndroid组件教程设置动画的时长参数

    XamarinAndroid组件教程设置动画的时长参数 在添加动画的时候,开发者还可以动画参数进行设置,如动画持续的时长.插值器等.下面依次讲解动画参数的设置方法. 1.设置动画时长 设置动画持续的时 ...

  2. IT兄弟连 JavaWeb教程 Servlet会话跟踪 设置Session存活时长

    方式一:修改所有的session默认时长,修改tomcat目录下的conf文件夹下的web.xml文件. <session-config> <session-timeout>希 ...

  3. (转载)【TP5.0】设置session有效时长+修改默认存储路径

        //查看默认session存储路径:print_r(session_save_path());   \thinkphp\helper.php if (!function_exists('ses ...

  4. 【Android端 APP 启动时长获取】启动时长获取方案及具体实施

    一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分 ...

  5. js读写Cookie问题(Cookie存储时长、Cookie存储域)汇总

    在采集网站用户行为数据/使用js对用户行为做交互时,经常会使用到Cookie,了解Js Cookie的读写,以及一些细节,非常重要.   什么是Cookie 所谓Cookie,只是一条极为短小的信息, ...

  6. Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  7. 大文件视频断点续传插件resumabel.js,优化上传速度,缩短最后一片等待时长。

    在angular中使用resumable.js遇到的一个问题:大视频上传到99-100%时,此时正在上传最后一片,最后一片的xhr一直是pending状态.原因插件会检查第一片和最后一片的元数据,检测 ...

  8. 使用FFMPEG进行一些视频处理(C#)视频合并、转码、获取时长

    FFMPEG的强大无需多说,举几个用到的功能,直接贴代码了 还有更多命令用到时搜索即可 视频转码 ) { var args = "-y -i {0} -vcodec copy {1}&quo ...

  9. 使用mediainfo工具统计每个视频文件(媒体文件)播放时长

    需求 1.运营那边需要统计大量视频文件的播放时长,并汇总记录到excel表中,问我有什么方法搞定 这边搜索了很多统计媒体文件时长的,主要有以下几种 1.使用java获取 2.使用python获取 3. ...

  10. js用img代替ajax js心跳 向服务器定时传送参数 主要计算用户在线时长

    html: <!doctype html><html><head><meta charset="utf-8"><title&g ...

随机推荐

  1. Java并发(十七)----变量的线程安全分析

    1.成员变量和静态变量是否线程安全 如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况 如果只有读操作,则线程安全 如果有读写操作,则这段代码是临界区,需要考虑线 ...

  2. SpringBoot启动@Test单元测试时,一致卡在加载junit-bom-5.6.3.pom.xml文件

    今天做项目时创建一个SpringBoot工程,使用的版本是<spring-boot.version>2.3.7.RELEASE</spring-boot.version> 当我 ...

  3. CatFly【汇编代码还原】

    CatFly[难度:1] 题目界面 下载附件,发现是dll文件,放到linux中运行一下,运行界面如图所示: 从上图中可以看到两处字符串,上面的字符串不断滚动,下方字符串在次数上不断累加,猜测上方字符 ...

  4. scrapy 请求meta参数使用案例-豆瓣电影爬取

    num = 0 import scrapy from scrapy.http import HtmlResponse from scrapy_demo.items import DoubanItem ...

  5. 【UniApp】-uni-app-项目实战页面布局(苹果计算器)

    前言 经过前面的文章介绍,基本上 UniApp 的内容就介绍完毕了 那么从本文开始,我们就开始进行一个项目的实战 这次做的项目是苹果计算器,这个项目的难度不是很大,但是也不是很简单,适合练手 创建项目 ...

  6. 劫持 PE 文件:新建节表并插入指定 DLL 文件

    PE格式简介 PE(Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe.dll.vxd.sys和vdm等)的标准文件格式.PE格式衍生于早期建立在VAX(R) ...

  7. 8种超简单的Golang生成随机字符串方式

    本文分享自华为云社区<Golang生成随机字符串的八种方式与性能测试>,作者: 张俭. 前言 这是**icza**在StackOverflow上的一篇高赞回答,质量很高,翻译一下,大家一起 ...

  8. JavaScript this 绑定详解

    函数内 this 绑定 函数内this的绑定和函数定义的位置没有关系,和调用的方式和调用位置有关系,函数内的this是在被调用执行时被绑定的. this的具体绑定规则 this 绑定基本包含下面4种绑 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (137)-- 算法导论11.3 3题

    三.用go语言,考虑除法散列法的另一种版本,其中 h(k) = k mod m,m=$2^p-1$,k为按基数 $2^p$ 表示的字符串.试证明:如果串可由串 y 通过其自身的字符置换排列导出,则x和 ...

  10. 13、Flutter AspectRatio 调整子元素child的宽高比

    AspectRatio的作用是根据设置调整子元素child的宽高比.   childAspectRatio 是 GridView 和 AspectRatio 控件中的一个参数   AspectRati ...