FreeSWITCH在session上执行特定dialplan
操作系统 :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:

呼叫分机命令:
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即可验证,运行效果如下:

演示视频可从如下渠道获取:
三、基于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即可验证,运行效果如下:

四、基于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的内容:

完整代码及相关文件可从如下渠道获取:
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的内容。

4、使用execute_extension进行呼叫测试
1)使用originate发起呼叫
命令如下:
originate user/1000 7772 xml default
2)根据语音提示进行按键;
3)执行crash操作
fsctl crash
4) 启动fs进行故障恢复;
5) 观察恢复效果。
恢复后执行的是7772这个dialplan的内容。

五、基于execute_extension实现的改进
如果故障恢复后需要走原来的拨号方案,则execute_extension是更好的选择,可以结合故障恢复的标志进行改进。
这里进行简单的示例,捕获该session是故障恢复的呼叫,代码如下(apply_extension_test22.lua):

配套的拨号方案如下:
<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
运行效果如下:

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

好,就这么多了,别忘了点赞哈!
FreeSWITCH在session上执行特定dialplan的更多相关文章
- PHP在linux上执行外部命令
PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...
- springboot 学习之路 9 (项目启动后就执行特定方法)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- php -- PHP在linux上执行外部命令,system(),exec(),shell_exec()
目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,有三种方法: 1. 调用专门函 ...
- Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)
一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数 ...
- Oracle 19c Data Guard DML Redirection ADG备库上执行DML重定向(未来更好的进行读写分离)
资料来自官方网站: https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-g ...
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- .Net程序在linux mono环境和WindowsServer上执行测试对比
最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...
- Linux 在一个命令行上执行多个命令
Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...
- MySQL线上执行大事务或锁表操作
前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...
- Linux 在一个命令行上执行多个命令(转载)
对于单个命令执行我想大多数人都是明了的,也就是在一个命令行上执行一条命令.那对于在一行上执行多个命令怎么办呢,其实也很简单,只需在各命令之间加上特殊命令符号,我们常规使用到的有3个特殊命令符号. 1. ...
随机推荐
- P2895(未解决)
这是一道略复杂的常规BFS题,但我想用DFS来解决,结果写出代码却总是主函数异常返回,不知哪里错了,检查半天也没发现,以后再看看吧. Code #include<iostream> #in ...
- 简单剖析Hashmap
剖析 Java Hashmap 源码 在 Java 的集合框架中,HashMap 是一颗璀璨的明珠.通过深入挖掘其源码,我们将揭开 HashMap 的神秘面纱,理解其底层原理.扩容机制和数据结构. 1 ...
- 【BUS】动画图解嵌入式常见的通讯协议:SPI、I²C、UART、红外 ......
SPI传输 SPI数据传输 SPI数据传输 SPI时序信号 I2C传输 2C总线寻址 UART传输 PC-UART-MCU RS-232电平转换 红外控制 红外通信 红外信号接收.放大.整形 红外控制 ...
- 【中介者模式(Mediator)】使用Java实现中介者模式
引言 中介者,何为中介者,顾名思义就是我们的在处理A和B之间的关系的时候,引入一个中间人,来处理这两者之间的关系,例如生活中我们需要去租房,买房,都会有中介,来处理房东和租客之间的协调关系,这个就是中 ...
- Python 变量?对象?引用?赋值?一个例子解释清楚
哈喽大家好,我是咸鱼. 前天有个小伙伴找到我,给了我一段 python 代码: a = [1, 2] a[1] = a print(a[1]) 然后问我为什么结果是 [1, [...]],我一看这个问 ...
- Python学习之十六_virsh批量获取虚拟机IP地址的方法
Python学习之十六_virsh批量获取虚拟机IP地址的方法 Linux命令说明 for j in \ $(for i in `virsh list |grep -v Id |grep runnin ...
- [转帖]手摸手搭建简单的jmeter+influxdb+grafana性能监控平台
我安装的机器是阿里云的centos8机器,其他的系统暂未验证 1.安装influxdb influxdb 下载地址https://portal.influxdata.com/downloads/,也可 ...
- [转帖]利用Python调用outlook自动发送邮件
↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 使用Python发送邮件有两种方式,一种是使用smtp调用邮箱的smtp服务器,另一种是直接调用程序直接发送邮件.而在outlo ...
- [转帖]Python模块winRM
https://www.jianshu.com/p/ac095497bad4 一.介绍 winRM服务是windows server下PowerShell的远程管理服务.Python脚本通过连接win ...
- 【小实验】使用 wrk 的 docker 容器来压测另一个容器
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 GET 请求 想压测容器环境的服务性能,发现两个麻烦: 本 ...