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"/>

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 獲取。

 好,就這麼多了,別忘了點贊哈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章