操作系统 :CentOS 7.6_x64

FreeSWITCH版本 :1.10.9

日常开发中,会遇到需要在已存在的session上执行特定拨号方案的情况,今天整理下这方面的内容,我将从以下几个方面进行描述:

  • 实验环境准备

  • 基于transfer实现

  • 基于execute_extension实现

  • 基于transfer和execute_extension实现的区别

  • 基于execute_extension实现的改进

  • 提供示例代码及运行效果视频

一、实验环境准备

FreeSWITCH测试机:192.168.137.32

分机:1000

拨号方案(default.xml中添加):

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

二、基于transfer实现

1、使用uuid_transfer转接到特定dialplan

uuid_transfer是一个api命令,可以将指定session转接到特定dialplan,命令格式如下:

uuid_transfer <uuid> [-bleg|-both] <dest-exten> [<dialplan>] [<context>]

完整信息可参考wiki:

https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_commands_1966741/#uuid_transfer

呼叫分机命令:

originate user/1000 &echo

使用示例如下:

uuid_transfer c7a95b91-3fbe-4c0c-8f5a-ff4933279558 7001 xml default

运行效果如下:

可以在会议室里面看到1000这个分机:

演示视频可从如下渠道获取:

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

2、使用transfer转接到特定dialplan

transfer是一个app,可以在xml中使用,也可以在lua脚本中使用,这里演示下如何在lua脚本中使用实现转接特定拨号方案功能。

命令格式如下:

transfer <destination_number> [<dialplan> [<context>]]

完整信息可参考wiki:

https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586616/

在lua脚本中的使用示例如下(transTest1.lua):

local extInfo = "7001 xml default"
session:execute("transfer",extInfo)

添加拨号方案:

<extension name="testTrans">
<condition field="destination_number" expression="^333$">
<action application="lua" data="transTest1.lua"/>
</condition>
</extension>

使用分机1000拨打333即可验证,运行效果如下:

演示视频可从如下渠道获取:

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

三、基于execute_extension实现

execute_extension是个app,可以在xml中使用,也可以在lua脚本中使用,这里演示下如何在lua脚本中实现执行特定拨号方案的功能。

app的命令格式如下:

<action application="execute_extension" data="extension [dialplan] [context]"/>

完整信息可参考wiki:

https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586595/

在lua脚本中的使用示例如下(transTest2.lua):

local extInfo = "7001 xml default"
session:execute("execute_extension",extInfo)

添加拨号方案:

<extension name="testTrans">
<condition field="destination_number" expression="^555$">
<action application="lua" data="transTest2.lua"/>
</condition>
</extension>

使用分机1000拨打555即可验证,运行效果如下:

演示视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2024021103 获取。

四、基于transfer和execute_extension的区别

这里记录下在实际使用过程中,发现的transfer和execute_extension的区别。

需要说明下,在前面提供的例子里面体现不出来transfer和execute_extension的区别,在故障恢复的场景中可以体现:

1)执行transfer时会影响故障恢复,crash前是A dialplan,recover后是B dialplan;

2)转dialplan时,使用 execute_extension 这个app则不会影响故障恢复,crash前是A dialplan,recover后还是A dialplan;

1、准备拨号方案及lua脚本

A dialplan的内容:

<extension name="dp_testA1">
<condition field="destination_number" expression="^7771$">
<action application="answer"/>
<action application="lua" data="apply_extension_test1.lua" />
<action application="sleep" data="60000"/>
<action application="hangup" />
</condition>
</extension> <extension name="dp_testA2">
<condition field="destination_number" expression="^7772$">
<action application="answer"/>
<action application="lua" data="apply_extension_test2.lua" />
<action application="sleep" data="60000"/>
<action application="hangup" />
</condition> </extension>

B dialplan的内容:

<extension name="dp_testB">
<condition field="destination_number" expression="^8001$">
<action application="playback" data="local_stream://moh"/>
<action application="hangup"/>
</condition>
</extension>

apply_extension_test1.lua的内容:

apply_extension_test2.lua的内容:

完整代码及相关文件可从如下渠道获取:

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

2、配置fs的故障恢复

1)开启fs启动时恢复

文件:vars.xml

添加的内容:

<X-PRE-PROCESS cmd="set" data="api_on_startup=fsctl recover"/>

2) 开启profile相关开关

文件:internal.xml  external.xml

添加内容:

<param name="track-calls" value="true"/>

3、使用transfer进行呼叫测试

1)使用originate发起呼叫

命令如下:

originate user/1000 7771 xml default

2)根据语音提示进行按键;

3)执行crash操作

fsctl crash

4) 启动fs进行故障恢复;

5) 观察恢复效果。

恢复后执行的是8001这个dialplan的内容。

演示视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2024021104 获取。

4、使用execute_extension进行呼叫测试

1)使用originate发起呼叫

命令如下:

originate user/1000 7772 xml default

2)根据语音提示进行按键;

3)执行crash操作

fsctl crash

4) 启动fs进行故障恢复;

5) 观察恢复效果。

恢复后执行的是7772这个dialplan的内容。

演示视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2024021105 获取。

五、基于execute_extension实现的改进

如果故障恢复后需要走原来的拨号方案,则execute_extension是更好的选择,可以结合故障恢复的标志进行改进。

这里进行简单的示例,捕获该session是故障恢复的呼叫,代码如下(apply_extension_test22.lua):

完整代码及相关文件可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240211 获取。

配套的拨号方案如下:

<extension name="dp_testA3">
<condition field="destination_number" expression="^7773$">
<action application="answer"/>
<action application="lua" data="apply_extension_test22.lua" />
<action application="sleep" data="60000"/>
<action application="hangup" />
</condition> </extension>

配套呼叫命令如下:

originate user/1000 7773 xml default

运行效果如下:

六、资源下载

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

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

好,就这么多了,别忘了点赞哈!

FreeSWITCH在session上执行特定dialplan的更多相关文章

  1. PHP在linux上执行外部命令

    PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...

  2. springboot 学习之路 9 (项目启动后就执行特定方法)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  3. php -- PHP在linux上执行外部命令,system(),exec(),shell_exec()

    目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,有三种方法: 1. 调用专门函 ...

  4. Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)

    一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数 ...

  5. Oracle 19c Data Guard DML Redirection ADG备库上执行DML重定向(未来更好的进行读写分离)

    资料来自官方网站: https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-g ...

  6. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  7. .Net程序在linux mono环境和WindowsServer上执行测试对比

    最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...

  8. Linux 在一个命令行上执行多个命令

    Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...

  9. MySQL线上执行大事务或锁表操作

    前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...

  10. Linux 在一个命令行上执行多个命令(转载)

    对于单个命令执行我想大多数人都是明了的,也就是在一个命令行上执行一条命令.那对于在一行上执行多个命令怎么办呢,其实也很简单,只需在各命令之间加上特殊命令符号,我们常规使用到的有3个特殊命令符号. 1. ...

随机推荐

  1. 如何通过canvas实现电子签名

    想要实现一个电子签名,可以支持鼠标签名,还能类似书法效果线条有粗有细,同时可以导出成图片. 一.实现连贯的划线 1)首先需要注册鼠标下压.鼠标放开.鼠标移出和鼠标移动事件,通过鼠标下压赋值downFl ...

  2. 自动化测试复习巩固第一天,requests的用法

    如何快速发送post请求 因为我用的python语言,所以大家需要在本地安装python语言和pycharm,如何安装请自行查找教程,这里不做过多赘述 这里需要提前下载安装好需要的第三方库reques ...

  3. apache mina

    本文为博主原创,未经允许不得转载: Apache Mina(Apache Multipurpose Infrastructure for Network Applications)是一个基于Java的 ...

  4. spring IoC 源码

    spring IoC 容器的加载过程 1.实例化容器: AnnotationConfigApplicationContext 实例化工厂: DefauiltListableBeanFactory 实例 ...

  5. [转帖]Linux命令之——rsync

    文章目录 1 rsync是干什么用的 2 rsync和scp有什么区别 3 rsync简单用法介绍 rsync四种工作方式 1. 本地文件系统上实现同步 2. 本地主机使用远程shell和远程主机通信 ...

  6. [转帖]ORACLE新参数MAX_IDLE_TIME和MAX_IDLE_BLOCKING_TIME简介

    https://www.cnblogs.com/kerrycode/p/16856171.html Oracle 12.2 引入了新参数MAX_IDLE_TIME.它可以指定会话空闲的最大分钟数.如果 ...

  7. [转帖]OceanBase 中租户管理

    https://zhuanlan.zhihu.com/p/464504887 概述 租户的概念类似于传统数据库的数据库实例.租户也叫实例,拥有一定的资源能力(如CPU.内存和空间).租户下可以建立数据 ...

  8. [转帖]shell 使用sed或awk将文本中的上下两行合并为一行

    例如要装下面文本上下两行合并为一行 文件test内容: # cat test a1 ce ef 12 45 57 efef 5656 gfg 455 上下两行合并为一行: # sed -n '{N;s ...

  9. [转帖]详解:Linux Chrony 设置服务器集群同步时间

    https://www.linuxprobe.com/centos7-chrony-time.html 导读 Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认 ...

  10. [转帖]SpringBoot配置SSL 坑点总结【密码验证失败、连接不安全】

    文章目录 前言 1.证书绑定问题 2.证书和密码不匹配 3.yaml配置文件问题 3.1 解密类型和证书类型是相关的 3.2 配置文件参数混淆 后记 前言 在SpringBoot服务中配置ssl,无非 ...