2

FreeSWITCH在session上执行特定dialplan - Mike_Zhang

 7 months ago
source link: https://www.cnblogs.com/MikeZhang/p/18013703/fsExecDP20240212
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

操作系统 :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

300959-20240212090228728-1078845810.png

 呼叫分机命令:

originate user/1000 &echo

使用示例如下:

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

运行效果如下:

300959-20240212090358864-1796931037.png

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

300959-20240212090420731-1296199069.png

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

关注微信公众号(聊聊博文,文末可扫码)后回复 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/

300959-20240212091608849-795280826.png

 在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即可验证,运行效果如下:

300959-20240212091547337-316699867.png

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

关注微信公众号(聊聊博文,文末可扫码)后回复 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/

300959-20240212091804152-1523278147.png

在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即可验证,运行效果如下:

300959-20240212091951889-928700156.png
演示视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 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的内容:

300959-20240212092221239-1414602145.png

 apply_extension_test2.lua的内容:

300959-20240212092243656-325304170.png

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

关注微信公众号(聊聊博文,文末可扫码)后回复 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的内容。

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

4、使用execute_extension进行呼叫测试

1)使用originate发起呼叫

命令如下:

originate user/1000 7772 xml default

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

3)执行crash操作

fsctl crash

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

5) 观察恢复效果。

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

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

五、基于execute_extension实现的改进

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

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

300959-20240212092747023-187938194.png
完整代码及相关文件可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 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

运行效果如下:

300959-20240212092845913-1636342356.png

六、资源下载

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK