日常開發中,會遇到需要在已存在的session上執行定時掛機和取消掛機的情況,今天整理下這方面的內容,我將從以下幾個方面進行描述:
- 實驗場景環境描述
- 定時掛機描述
- 如何使用定時掛機
- 如何取消定時掛機
- 提供示例代碼及運行效果視頻
一、實驗場景環境描述
FreeSWITCH測試機:192.168.137.32
會議室: test1
分機: 1000
模擬的場景:
1)會議室test1邀請分機1000加入會議室
在邀請時,添加定時掛機任務。
2)分機1000接通後,需要按數字1加入會議;
3)如果分機1000在特定時間內按數字1鍵,則正常入會
同時,取消定時掛機任務。
4)如果分機1000未在特定時間內按數字1鍵,則執行超時掛機操作。
二、定時掛機描述
FreeSWITCH提供了個定時掛機的工具,工具名稱: sched_hangup
sched_hangup是dptools模塊提供的工具,該工具會創建一個任務,用於執行定時掛機操作,該任務的信息存儲在FreeSWITCH數據庫的tasks表中進行持久化,這裏進行簡單描述。
1)函數調用鏈
調用鏈如下:
sched_hangup_function
=> switch_ivr_schedule_hangup
=> switch_scheduler_add_task
=> switch_scheduler_add_task_ex
sched_hangup_function函數如下:
switch_ivr_schedule_hangup函數如下:
switch_scheduler_add_task函數和switch_scheduler_add_task_ex函數如下:
數據庫寫入操作:
2)任務執行
函數調用鏈如下:
main
=> switch_core_init_and_modload
=> switch_core_init
=> switch_scheduler_task_thread_start
=> switch_scheduler_task_thread
=> task_thread_loop
=> switch_scheduler_execute
switch_scheduler_task_thread函數:
task_thread_loop函數:
switch_scheduler_execute函數:
也可以使用其它工具來實現定時掛機,原理是一樣的,如何使用可參考場景實現部分。
三、如何使用定時掛機
FreeSWITCH自身提供的有定時掛機應用,可在撥號方案裏面作爲app使用,也可以在控制檯作爲api使用。
撥號方案中使用格式:
<action application="sched_hangup" data="[+]<time>[ <hangup_cause>]"/>
sched_hangup [+]<time> <uuid>[ <hangup_cause>]
更多信息請參考官網wiki:
https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6587061/
比如創建如下任務:
sched_hangup +600 2efce360-2ce2-4470-8e92-01adb048892a
show tasks
四、如何取消定時掛機
可在控制檯使用如下命令進行任務刪除,進而取消定時掛機:
sched_del <taskid>
五、場景實現
這裏以lua腳本爲例來實現定時掛機和取消掛機。
1、外呼分機時添加lua腳本回調
可通過 execute_on_answer 來實現,具體如下:
bgapi originate {execute_on_answer='lua inviteToConf.lua'}user/1000 &bridge(loopback/wait)
2、獲取任務id
sched_hangup 在創建任務時,會將任務id存放在數據庫裏面,如果要取消掛機任務,需要獲取該id值。可通過如下方式獲取:
1)根據session的uuid查詢數據庫獲取任務id值;
2)使用"show tasks"解析獲取任務id值;
在lua腳本里面如果想直接通過 executeString 的返回值獲取,是無法辦到的,因爲 sched_hangup 給控制檯的返回值只有 "+OK" 這個信息。
獲取任務id值的方式,可從如下渠道獲取:
3、添加撥號方案
添加轉接會議室的撥號方案:
<extension name="conf_test"> <condition field="destination_number" expression="^7001$"> <action application="conference" data="test1"/> <action application="hangup"/> </condition> </extension>
4、運行效果
控制檯執行originate後:
1)不按數字1,超時後會執行掛機操作;
2)按數字1,會刪除掛機計劃,邀請分機入會;
其中,按數字1後的效果如下:
運行效果視頻可從如下渠道獲取:
六、資源下載
關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20240213 獲取。