2

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

 7 months ago
source link: https://www.cnblogs.com/MikeZhang/p/18015096/fsSchedHanup20240214
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

日常开发中,会遇到需要在已存在的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函数如下:

300959-20240214110359069-728681138.png

 switch_ivr_schedule_hangup函数如下:

300959-20240214110459068-1430171671.png

 switch_scheduler_add_task函数和switch_scheduler_add_task_ex函数如下:

300959-20240214110517486-174335745.png

 数据库写入操作:

300959-20240214110536220-1097510630.png

 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 函数:
300959-20240214110626547-1651476143.png

 switch_scheduler_task_thread函数:

300959-20240214110700665-750320128.png

 task_thread_loop函数:

300959-20240214110723300-2088778844.png

 switch_scheduler_execute函数:

300959-20240214110745904-2055895349.png

 也可以使用其它工具来实现定时挂机,原理是一样的,如何使用可参考场景实现部分。

三、如何使用定时挂机

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/

300959-20240214110920712-650698465.png

比如创建如下任务:

sched_hangup +600 2efce360-2ce2-4470-8e92-01adb048892a
可在数据库和控制台看到,其中在控制台使用如下命令查询:
show tasks
具体效果如下:
300959-20240214111026840-347463173.png

四、如何取消定时挂机

可在控制台使用如下命令进行任务删除,进而取消定时挂机:

sched_del <taskid>
300959-20240214111129763-1081756216.png

五、场景实现

这里以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后的效果如下:

300959-20240214111621339-2118786224.png

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

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

六、资源下载

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

300959-20240214111716023-693923880.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK