freeswitch筆記(5)-小型呼叫中心設計思路
- 2020 年 2 月 24 日
- 筆記
這一篇用esl實戰一把,利用esl client來實現一個小型呼叫中心的原型,先看看下面這張圖:

企業通常會對外公布一個400之類的服務電話,當用戶撥打這個電話時,實際上背後是一堆客服妹紙帶着耳麥通過電腦連着自己的電話分機。客人進線時,系統會根據一定的規則(比如挑1個當前空閑的客服),然後把電話轉接過去,當然轉接有可能不成功(比如目標客服沒接聽,或者當時走開了,或者誤操作按了掛機…),系統要監聽這些異常情況,然後再分配1個其它客服,直到接通(或客人等得不耐煩,主動掛機)

這是大致的時序圖,解釋一下:
1、客人來電後,數據會到過freeswitch
2、fs上配置outbound規則(見之前的文章)後,會把一些關鍵信息(比如客人來電號碼),傳到esl client
3、esl client根據自己的業務規則,分配一個客服(即:分機號)
4、fs主動向該客服發起呼叫(originate命令) –問題1:為啥這裡不直接用bridge命令?
5、考慮到客服可能正好離開位置(比如:起身去倒杯水),或者比較忙,直接掛斷了電話,步驟4的呼叫肯定失敗。這裡要用inbound模式,監聽目標客服的分機狀態,才能知道應答情況
6、如果目標客服無應答(掛機或一直振鈴不接),則掛斷客服這一頭的電話(註:uuid_kill 客服通話的uuid),然後重複步驟2,繼續分配另外一個客服 (註:這個重複分配的過程,客人是感知不到的)
7、如果目標客服接起了電話(即:應答),則先將客人來電應答(answer指令,否則客人那邊還會一直聽到等待音),然後將兩頭的電話接通(uuid_bridge uuid1 uuid2)
回答下剛才提到的一個小問題:步驟4為什麼不用bridge命令?
答案:bridge也可用於轉接,正常情況是沒問題的,但是bridge命令執行成功,並不代表對方一定就接通了(見上面未接聽情況的各種分析),如果對方掛斷了,客人會先聽到對方的振鈴聲,然後聽到掛斷,但是自己這一頭的電話並未斷,接下來又會聽到排隊的等待聲,體驗很不好,所以這個方式不推薦。
時序圖中涉及的freeswitch命令列一下:
1、originate 向客服發起呼叫
tips: 可以在發起呼叫時,就指定uuid(避免fs自動生成),方便後面uuid_kill或uuid_bridge,示例如下
originate {ignore_early_media=true,call_timeout=60,hangup_after_bridge=false,origination_uuid=新的uuid,origination_caller_id_number=主叫號碼,origination_caller_id_name=主叫號碼顯示名稱}user/目標號碼 &park()
註:最後的&park()不要忘了加,這個相當於系統自動應答,把客服端的電話先保持住,否則會超時自動掛斷;另外新的uuid,可以通過create_uuid先生成。
2、answer 自動應答
用於客服撥通後,自動應答客人電話,否則客人那邊一直播等待聲音,沒人接聽,最終會超時。
3、uuid_kill 結束某一些的通話
如果目標客服一直振鈴未接聽,可以用該命令直接掐掉。
4、uuid_bridge
接通二邊的電話
參考:
https://freeswitch.org/confluence/display/FREESWITCH/Originate+Example
https://freeswitch.org/confluence/display/FREESWITCH/mod_commands
https://freeswitch.org/confluence/display/FREESWITCH/Event+List#EventList-3.21CHANNEL_UUIDevent