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:

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"/>
  1. 开启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

  1. 启动fs进行故障恢复;

  2. 观察恢复效果。

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


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

4、使用execute_extension进行呼叫测试

1)使用originate发起呼叫

命令如下:

复制代码
originate user/1000 7772 xml default

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

3)执行crash操作

fsctl crash

  1. 启动fs进行故障恢复;

  2. 观察恢复效果。

恢复后执行的是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 获取。

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

相关推荐
Mike_Zhang8 天前
使用pjsip封装自定义软电话sdk
voip·pjsip·pjsua
代码浪人13 天前
docker 基于Debian镜像安装FreeSwitch1.10.7
docker·容器·debian·freeswitch
new_abc24 天前
Sofia-SIP 使用教程
freeswitch·sofia
戴草帽的大z1 个月前
Kamailio SIP服务器的配置与运行
kamailio·voip·sip
hongkid1 个月前
docker 部署freeswitch(非编译方式)
docker·容器·freeswitch
Mike_Zhang1 个月前
pjsip编译、说明及vs2022使用示例
voip·pjsua
异域天使phy1 个月前
树莓派安装FreeSWITCH
树莓派·freeswitch
筑梦之路2 个月前
Debian 12 安装freeswitch 1.10.12对接Volte视频通话——筑梦之路
debian·voip
贾宝玉的玉宝贾2 个月前
FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误
android·adb·voip·freeswitch·ippbx·sip测试
贾宝玉的玉宝贾3 个月前
FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据
数据库·voip·freeswitch·ippbx·sip测试