操作系統 :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
運行效果如下:
六、資源下載
本文涉及資源可從如下渠道獲取:
好,就這麼多了,別忘了點贊哈!