首页 > 其他分享 >FreeSWITCH在session上执行定时挂机与取消

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

时间:2024-02-14 11:33:25浏览次数:54  
标签:task hangup switch session scheduler FreeSWITCH 定时 挂机

操作系统 :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="[+]<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)
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>

4、运行效果

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

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

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

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

六、资源下载

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

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

标签:task,hangup,switch,session,scheduler,FreeSWITCH,定时,挂机
From: https://www.cnblogs.com/MikeZhang/p/18015096/fsSchedHanup20240214

相关文章

  • FreeSWITCH在session上执行特定dialplan
    操作系统:CentOS7.6_x64 FreeSWITCH版本:1.10.9日常开发中,会遇到需要在已存在的session上执行特定拨号方案的情况,今天整理下这方面的内容,我将从以下几个方面进行描述:实验环境准备基于transfer实现基于execute_extension实现基于transfer和execute_extension实现......
  • 十七、Cookie和Session
    1、Cookie:保存在客户端浏览器文件上的键值对当浏览器访问某个网站时,浏览器在COOKIE中拿出属于该网站的键值对来访问这个网站。因此这些键值对是按域名来保存在本地文件。一、cookie和session的介绍1、cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要......
  • NET 7 中使用Session
    NET7中使用Session2024年2月11日net7下测试通过Program.cs关键代码:builder.Services.AddDistributedMemoryCache();builder.Services.AddSession(options=>{options.IdleTimeout=TimeSpan.FromMinutes(30);options......
  • 读论文-基于会话的推荐系统综述(A survey on session-based recommender systems)
    前言今天读的论文是一篇于2021年发表于"ACMComputingSurveys(CSUR)"的论文,文章写到,推荐系统在信息过载时代和数字化经济中非常重要。基于会话的推荐系统(SBRSs)是新的推荐系统范式,不同于其他模型化长期静态用户偏好的推荐系统,SBRSs专注于捕捉短期动态用户偏好。尽管SBRSs已被深......
  • Mybatis 的 SqlSession 和一级缓存为什么失效?
    目录SqlSession是什么SqlSession分类SqlSession的创建为什么和Spring整合后的SqlSession一级缓存偶尔会失效一级缓存和二级缓存总结SqlSession是什么SqlSession是Mybatis中定义的,用来表示与关系数据库的一次会话,会话定义了各种具体的操作,查询、数据更新(包含保存、更新、删......
  • 狂神说Java Web学习笔记_Cookie&Session
    Cookie,Session保存会话的两种技术,Cookie(客户端技术),Session(服务端技术)Cookie服务器端设置token,从客户端获取tokenCookie[]cookies=req.getCookies();//从客户端获取cookiecookie.getName();//获取cookie名字cookie.getValue();//获取cookie值Cookiecookie=newCoo......
  • 第六十三天 cookie, session与Django中间件
    一、cookie与session简介"""HTTP协议四大特性1.基于请求响应2.基于TCP、IP作用于应用层之上协议 3.无状态服务端无法识别客户端的状态 1.互联网刚开始兴起的的时候所有人访问网址都是一样的数据 服务端无法识别客户端问题不大 2.互联网发展淘宝、京东、阿里 服务端......
  • session和token以及cookie作用及区别
    Session、Token和Cookie都是在网络应用中用于身份验证和会话管理的技术。其作用和区别如下:Session:作用:Session是一种在Web服务器和浏览器之间维护状态的机制。当用户在Web应用程序中进行操作时,服务器会为该用户创建一个唯一的SessionID,并通过Cookie或URL将其传递给浏览器。......
  • SparkSQL无法创建多个Session解决方法
    一、问题现象SparkSQL创建多个session报错,不能创建一个链接,链接Spark自带的数据库derby2024-01-2519:50:59.053[INFO]24/01/2519:50:59INFO!PLExecution!:ExecuteSQL:DROPTABLEIFEXISTSibor_nfsd_instjmport2024-01-2519:51:01.628(INFO]24/01/2519:51:01IN......
  • Gin 应用多实例部署session问题、session参数与刷新
    目录一、GinSession存储的实现方案二、memstore:基于内存的实现2.1基本使用2.2关键参数三、使用redis:多实例部署3.1使用redis优势3.2基本使用四、信息安全的三个核心概念五、GinSession参数5.1参数介绍六、Session自动刷新一、GinSession存储的实现方案cookie:基于co......