FreeSWITCH在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_start 函数:

 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:

mod_dptools: sched hangup | FreeSWITCH Documentation

比如创建如下任务:

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)

originate​的使用可参考我之前写的文章:

https://www.cnblogs.com/MikeZhang/p/originate20230402.html

2、获取任务id

sched_hangup 在创建任务时,会将任务id存放在数据库里面,如果要取消挂机任务,需要获取该id值。可通过如下方式获取:
1)根据session的uuid查询数据库获取任务id值;
2)使用"show tasks"解析获取任务id值;

在lua脚本里面如果想直接通过 executeString 的返回值获取,是无法办到的,因为 sched_hangup 给控制台的返回值只有 "+OK" 这个信息。

获取任务id值的方式,可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240213 获取。

3、添加拨号方案

添加转接会议室的拨号方案:

复制代码

<extension name="conf_test">
    <condition field="destination_number" expression="^7001$">
        <action application="conference" data="test1"/>
        <action application="hangup"/>
    </condition>
</extension>

相关推荐

  1. Avalon总线的AD7656芯片驱动verilog程序实现

    2024-02-16 22:46:01       29 阅读
  2. Linux 使用 cron 定时执行任务的注意事项

    2024-02-16 22:46:01       34 阅读
  3. Ubuntu 取消登录密码和锁屏功能的简易指南

    2024-02-16 22:46:01       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-16 22:46:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-16 22:46:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-16 22:46:01       82 阅读
  4. Python语言-面向对象

    2024-02-16 22:46:01       91 阅读

热门阅读

  1. Spring基础 - Spring和Spring框架组成

    2024-02-16 22:46:01       46 阅读
  2. C++中const关键字详解

    2024-02-16 22:46:01       52 阅读
  3. C/C++中static关键字详解

    2024-02-16 22:46:01       50 阅读
  4. CCF编程能力等级认证GESP—C++1级—20231209

    2024-02-16 22:46:01       100 阅读
  5. Vue语法

    Vue语法

    2024-02-16 22:46:01      38 阅读
  6. 【动态规划】买卖股票问题

    2024-02-16 22:46:01       47 阅读
  7. MTR++论文阅读

    2024-02-16 22:46:01       51 阅读
  8. Leetcode 647. 回文子串

    2024-02-16 22:46:01       54 阅读
  9. 【重要】django默认生成的表的意思记录

    2024-02-16 22:46:01       48 阅读