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 ...
随机推荐
- python · SQL | MySQL 配置与 python 连接数据库
来存档一下搞 sql 的过程,方便以后查阅. 安装与配置 mysql server:https://blog.csdn.net/zhende_lan/article/details/129318514 ...
- 解决python报错:ModuleNotFoundError: No module named '_sysconfigdata_x86_64_conda_linux_gnu'
技术背景 在上一篇博客中执行过conda的更新以及用conda安装了gxx_linux-64之后,再执行pip的一些指令时,就会给出如下所示的报错: $ python3 -m pip list Tra ...
- java - 类属性 初始化的三种形式及顺序
package chushihua; public class Hello { public static String name = getValue("属性"); { name ...
- ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes
ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes 背景 duckdb 是一个很流行的单机版数据库引擎 同事下载了相关的预 ...
- [转帖]JSR223控件简介
JSR223控件简介 1.调用内置函数 2.执行外部java文件 3.执行jar包 JSR223取样器允许执行JSR223脚本代码用于创建/更新所需的某些变量. 由于JSR223脚本编译方式基本相同, ...
- [转贴]Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...
- [转帖]Shell~echo -e 颜色输出
https://www.cnblogs.com/ElegantSmile/p/11144879.html echo -e 可以控制字体颜色和背景颜色输出 从一个例子开始: # echo -e &quo ...
- Nginx拆分配置文件的办法
Nginx拆分配置文件的办法 摘要 最近公司使用Nginx进行微服务的路由处理 但是发现随着业务发展, 配置文件越来越复杂. 修改起来也很容易出现错误. 基于此. 想通过拆分配置文件的方式来提高修改效 ...
- [转帖]/etc/profile 和 /etc/profile.d/ 的区别
https://my.oschina.net/calmsnow/blog/2989570 /etc/profile 是文件, /etc/profile.d/ 是目录,用在设置环境变量方面,/etc ...
- 每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
写在开头 请聊一聊Java中方法的重写和重载? 这个问题应该是各大厂面试时问的最多的话题之一了,它们几乎贯穿了我们日常的开发工作,在过往的博客中我们多多少少都提到过重载与重写,而今天我们就一起来详细的 ...