• FreeSWITCH在session上执行定时挂机与取消


    操作系统 :CentOS 7.6_x64  
    FreeSWITCH版本 :1.10.9  

    日常开发中,会遇到需要在已存在的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="[+]/>
    控制台中使用格式:
    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)
    originate​的使用可参考我之前写的文章:

    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>
    复制代码

    4、运行效果

    控制台执行originate后:
    1)不按数字1,超时后会执行挂机操作;
    2)按数字1,会删除挂机计划,邀请分机入会;

    其中,按数字1后的效果如下:

    运行效果视频可从如下渠道获取:

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

    六、资源下载

     本文涉及资源可从如下渠道获取:

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

  • 相关阅读:
    颜色遍历法非递归遍历二叉树
    LVGL可视化设计-Gui Guider
    ArduPilot开源飞控之AP_Baro_SITL
    动手学习深度学习 05:深度学习计算
    STM32的HAL库及其使用
    k8s网络模型介绍:pod内/间通信
    windows 任务计划自动提交 笔记到github 、gitee
    注意力机制的qkv
    39 WEB漏洞-XXE&XML之利用检测绕过全解
    topk算法-leetcode java题解
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/18015096/fsSchedHanup20240214