FreeSWITCH在session上执行定时挂机与取消
日常开发中,会遇到需要在已存在的session上执行定时挂机和取消挂机的情况,今天整理下这方面的内容,我将从以下几个方面进行描述:
- 实验场景环境描述
- 定时挂机描述
- 如何使用定时挂机
- 如何取消定时挂机
- 提供示例代码及运行效果视频
一、实验场景环境描述
FreeSWITCH测试机:192.168.137.32
会议室: test1
分机: 1000
模拟的场景:
1)会议室test1邀请分机1000加入会议室
在邀请时,添加定时挂机任务。
2)分机1000接通后,需要按数字1加入会议;
3)如果分机1000在特定时间内按数字1键,则正常入会
同时,取消定时挂机任务。
4)如果分机1000未在特定时间内按数字1键,则执行超时挂机操作。
二、定时挂机描述
FreeSWITCH提供了个定时挂机的工具,工具名称: sched_hangup
sched_hangup是dptools模块提供的工具,该工具会创建一个任务,用于执行定时挂机操作,该任务的信息存储在FreeSWITCH数据库的tasks表中进行持久化,这里进行简单描述。
1)函数调用链
调用链如下:
sched_hangup_function
=> switch_ivr_schedule_hangup
=> switch_scheduler_add_task
=> switch_scheduler_add_task_ex
sched_hangup_function函数如下:

switch_ivr_schedule_hangup函数如下:

switch_scheduler_add_task函数和switch_scheduler_add_task_ex函数如下:

数据库写入操作:

2)任务执行
函数调用链如下:
main
=> switch_core_init_and_modload
=> switch_core_init
=> switch_scheduler_task_thread_start
=> switch_scheduler_task_thread
=> task_thread_loop
=> switch_scheduler_execute

switch_scheduler_task_thread函数:

task_thread_loop函数:

switch_scheduler_execute函数:

也可以使用其它工具来实现定时挂机,原理是一样的,如何使用可参考场景实现部分。
三、如何使用定时挂机
FreeSWITCH自身提供的有定时挂机应用,可在拨号方案里面作为app使用,也可以在控制台作为api使用。
拨号方案中使用格式:
<action application="sched_hangup" data="[+]<time>[ <hangup_cause>]"/>
sched_hangup [+]<time> <uuid>[ <hangup_cause>]
更多信息请参考官网wiki:
https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6587061/

比如创建如下任务:
sched_hangup +600 2efce360-2ce2-4470-8e92-01adb048892a
show tasks

四、如何取消定时挂机
可在控制台使用如下命令进行任务删除,进而取消定时挂机:
sched_del <taskid>

五、场景实现
这里以lua脚本为例来实现定时挂机和取消挂机。
1、外呼分机时添加lua脚本回调
可通过 execute_on_answer 来实现,具体如下:
bgapi originate {execute_on_answer='lua inviteToConf.lua'}user/1000 &bridge(loopback/wait)
2、获取任务id
sched_hangup 在创建任务时,会将任务id存放在数据库里面,如果要取消挂机任务,需要获取该id值。可通过如下方式获取:
1)根据session的uuid查询数据库获取任务id值;
2)使用"show tasks"解析获取任务id值;
在lua脚本里面如果想直接通过 executeString 的返回值获取,是无法办到的,因为 sched_hangup 给控制台的返回值只有 "+OK" 这个信息。
获取任务id值的方式,可从如下渠道获取:
3、添加拨号方案
添加转接会议室的拨号方案:
<extension name="conf_test">
<condition field="destination_number" expression="^7001$">
<action application="conference" data="test1"/>
<action application="hangup"/>
</condition>
</extension>
4、运行效果
控制台执行originate后:
1)不按数字1,超时后会执行挂机操作;
2)按数字1,会删除挂机计划,邀请分机入会;
其中,按数字1后的效果如下:

运行效果视频可从如下渠道获取:
六、资源下载

关注微信公众号(聊聊博文,文末可扫码)后回复 20240213 获取。
FreeSWITCH在session上执行定时挂机与取消的更多相关文章
- Yii2 console执行定时脚本
为什么要做crontab脚本 我们的项目使用YII2开发,并不是很大的一个电商平台,pv.IP访问量并不是很高,但客户的数据是日积月累已经产生100万条数据了,之前更新订单等数据使用定时脚本直接访问内 ...
- Oracle 19c Data Guard DML Redirection ADG备库上执行DML重定向(未来更好的进行读写分离)
资料来自官方网站: https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-g ...
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- .Net程序在linux mono环境和WindowsServer上执行测试对比
最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...
- PHP在linux上执行外部命令
PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...
- Linux 在一个命令行上执行多个命令
Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...
- MySQL线上执行大事务或锁表操作
前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...
- Linux 在一个命令行上执行多个命令(转载)
对于单个命令执行我想大多数人都是明了的,也就是在一个命令行上执行一条命令.那对于在一行上执行多个命令怎么办呢,其实也很简单,只需在各命令之间加上特殊命令符号,我们常规使用到的有3个特殊命令符号. 1. ...
- db2的select语句在db2 client上执行正确,JDBC连接数据库时报错
db2的select语句在db2 client上执行正确,JDBC连接数据库时报错. sql语句是:select ...from QUALIFIER.tableName fetch first 21 ...
- 关于在页面上执行sql语句
在页面上执行sql语句,首先在页面上顶一个文本域,让用户输入需要执行的sql语句. html代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML ...
随机推荐
- C++大整数类
用法 把头文件和源代码文件放在同一目录下,然后#include"INT"即可使用.你能对int类的变量进行a=2,a+=3,a%8,a--等等操作,那你就也能对INT进行.INT基 ...
- jmap 查看jvm内存大小并进行dump文件内存分析
本文为博主原创,未经允许不得转载: 1.jmap的使用 Jmap 可以用来查看内存信息,实例个数以及占用内存大小. jmap -histo[:live] 打印每个class的实例数目,内存占用,类全名 ...
- python pip手动安装二进制包
python中使用pip安装扩展包的时候,有时候会遇到如下类似报错: Running setup.py install for mysqlclient ... error ...(中间报错信息省略) ...
- Oracle索引&约束
Oracle索引&约束 1索引的原理 索引是一种允许直接访问数据表某一数据行的树形结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中 索引记录 ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.21)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- [转帖]查询 HTTPS 网站 TLS 版本
参考 检查网站的TLS版本 – wentao's blog Linux curl 命令详解 - 腾讯云开发者社区-腾讯云 TLS 版本查询_天泽岁月的博客-CSDN博客_查看tls版本 使用 Open ...
- [转帖]Load Base Split
https://docs.pingcap.com/zh/tidb/stable/configure-load-base-split#load-base-split Load Base Split 是 ...
- [转帖] jq命令用法总结
https://www.cnblogs.com/codelogs/p/16324928.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果说要给Li ...
- Linux上面Shell简单进行数值计算的办法
1. 自己简单写了一个脚本 来计算 一个服务进程启动的耗时, 精度要求不高 10秒上下就可以. 在程序执行之前和之后的处理 在最前面设置一句time1=`date +%s`在末尾一句设置time2=` ...
- 配置elementuI菜单
:unique-opened="true" 只保留一个菜单 :router="true"开启路由标识 index="users" 是标识 它 ...