FreeSWITCH在session上執行定時掛機與取消

操作系統 :CentOS 7.6_x64  
FreeSWITCH版本 :1.10.9  

日常開發中,會遇到需要在已存在的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_start 函數:

 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)
originate​的使用可參考我之前寫的文章:

2、獲取任務id

sched_hangup 在創建任務時,會將任務id存放在數據庫裏面,如果要取消掛機任務,需要獲取該id值。可通過如下方式獲取:
1)根據session的uuid查詢數據庫獲取任務id值;
2)使用"show tasks"解析獲取任務id值;

在lua腳本里面如果想直接通過 executeString 的返回值獲取,是無法辦到的,因爲 sched_hangup 給控制檯的返回值只有 "+OK" 這個信息。

獲取任務id值的方式,可從如下渠道獲取:

關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20240213 獲取。

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後的效果如下:

運行效果視頻可從如下渠道獲取:

關注微信公衆號(聊聊博文,文末可掃碼)後回覆 2024021301 獲取。

六、資源下載

 本文涉及資源可從如下渠道獲取:

關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20240213 獲取。

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