很多時候我們打電話到公司前台,會聽到類似“歡迎致電XXX,辦公電話請直撥分機,咨詢XX請按1,咨詢YY請按2”這樣的語音提示。在一些特定流程中,系統自動發起呼叫打到前台,希望實現自動按鍵(即:不用人手動按鍵),FreeSwitch提供了2個基本命令: send_dtmf及uuid_send_dtmf ,這2個基本功能一樣,send_dtmf常用於ESL Outbound外聯模式,不需要指定uuid,而uuid_send_dtmf則需要指定uuid.
以uuid_send_dtmf為例,演示下基本用法:(FreeSwitch控制台模式下)
1、先發起一個呼叫
1 freeswitch@xxx> create_uuid 2 4841d610-fba3-46b3-9432-4a4ebc164b36 3 4 freeswitch@xxx> originate {origination_uuid=4841d610-fba3-46b3-9432-4a4ebc164b36}user/1000 &park()
先生成一個uuid(方便后面uuid_send_dtmf時指定),然后用這個uuid,向內置用戶1000發起呼叫,接通后park住,這樣就有一個進行的通話了
2、模擬按鍵
uuid_send_dtmf 4841d610-fba3-46b3-9432-4a4ebc164b36 12
上圖是freeswitch控制台的輸出,有幾個細節注意一下:
a) 按鍵是1個1個送出去的,即先送完1,再送2
b) 單個key發送完,會默認delay 40ms.
看上去很簡單,對吧?繼續折騰,uuid_send_dtmf 命令在按鍵后,還可以附加一個可選參數 tone_duration,
可以試下效果:
uuid_send_dtmf 4841d610-fba3-46b3-9432-4a4ebc164b36 12 300
猜猜是啥效果?
相當於發送了12300,是不是有點意外?
再試一下:
uuid_send_dtmf 4841d610-fba3-46b3-9432-4a4ebc164b36 12 @5000
這時候輸出的內容太多,就不截完整的圖了,輸出片段如下:
---------------------------------------------------------------------------
freeswitch@xxx> uuid_send_dtmf 4841d610-fba3-46b3-9432-4a4ebc164b36 12 @5000
-ERR no reply
2021-08-29 16:27:05.188770 [DEBUG] switch_core_io.c:1894 sofia/internal/1000@10.32.26.25:64045 send dtmf
digit=1 ms=5000 samples=40000
2021-08-29 16:27:05.188770 [DEBUG] switch_core_io.c:1894 sofia/internal/1000@10.32.26.25:64045 send dtmf
digit=2 ms=5000 samples=40000
freeswitch@xxx> 2021-08-29 16:27:05.199769 [DEBUG] switch_rtp.c:5228 Send start packet for [1] ts=247200 dur=160/160/40000 seq=21903 lw=247200
2021-08-29 16:27:05.218781 [DEBUG] switch_rtp.c:5127 Send middle packet for [1] ts=247200 dur=320/320/40000 seq=21904 lw=247360
2021-08-29 16:27:05.238804 [DEBUG] switch_rtp.c:5127 Send middle packet for [1] ts=247200 dur=480/480/40000 seq=21905 lw=247520
2021-08-29 16:27:05.258771 [DEBUG] switch_rtp.c:5127 Send middle packet for [1] ts=247200 dur=640/640/40000 seq=21906 lw=247680
...
2021-08-29 16:27:10.178511 [DEBUG] switch_rtp.c:5127 Send end packet for [1] ts=247200 dur=40000/40000/40000 seq=22154 lw=286880
2021-08-29 16:27:10.178511 [DEBUG] switch_rtp.c:5075 Queue digit delay of 40ms
2021-08-29 16:27:10.579417 [DEBUG] switch_rtp.c:5228 Send start packet for [2] ts=287360 dur=160/160/40000 seq=22155 lw=287360
2021-08-29 16:27:10.598623 [DEBUG] switch_rtp.c:5127 Send middle packet for [2] ts=287360 dur=320/320/40000 seq=22156 lw=287520
2021-08-29 16:27:10.619422 [DEBUG] switch_rtp.c:5127 Send middle packet for [2] ts=287360 dur=480/480/40000 seq=22157 lw=287680
2021-08-29 16:27:10.639406 [DEBUG] switch_rtp.c:5127 Send middle packet for [2] ts=287360 dur=640/640/40000 seq=22158 lw=287840
...
---------------------------------------------------------------------------
指定了@5000后,每個按鍵的持續時間就變成了5秒了。
最后1個細節,實際使用中可能會遇到對方收的按鍵丟失,通常是發送太快,特別是號碼中間有連續數字時,比如: 700001,發過去后,對方可能收到的是70001(少1個0)
uuid_send_dtmf Send DTMF digits to <uuid> Usage: uuid_send_dtmf <uuid> <dtmf digits>[@<tone_duration>] Use the character w for a .5 second delay and the character W for a 1 second delay. Default tone duration is 2000ms .
再反復閱讀這段惜墨如金的官網文檔(也沒個示例,確實有點高深晦澀),其實這里給出了1個方法,在每個鍵后加小寫w,可以在每次按鍵后,多delay 0.5s,如果是W,則多delay 1s,把剛才發送的按鍵12,改成1w2W試下
從圖上看,1發送完后,多延時了500ms,而2發送完后,多延時了1000ms
小結一下:
1. 不加w或W, 每個按鍵默認delay 40ms間隔
2. 加W, 可delay 1s, 加w可delay 0.5s ,可以連續加, 比如1Ww2, 表示1之后delay 1+0.5s
3. @后的參數, 表示每個按鍵的持續時間
參考:https://freeswitch.org/confluence/display/FREESWITCH/mod_commands