文章目录
- 1. 呼入处理方案
- 2. 细节处理
- 1. a-leg 的拨号计划
- 2. originate 呼叫坐席
1. 呼入处理方案
使用 FreeSWICTH 的 ESL 模块,一个简单的呼入处理时序如下图所示,关键步骤做如下补充:
- 用户呼入到 FreeSWITCH 实例,a-leg 创建
- FreeSWITCH 根据用户呼叫的号码路由匹配拨号计划,该拨号计划最好配置上 ESL 外连的 socket APP
- esl 外连目标 esl 客户端,esl 客户端接收连接后需订阅 a-leg 上的相应事件
- esl 客户端根据业务规则分配一个示闲的坐席接待用户
- esl 客户端获取目标坐席的 SIP 账户,向 FreeSWITCH 下发
originate
命令,呼叫目标坐席。这里之所以不在 a-leg 的 outbound 连接上直接执行 bridge APP 桥接坐席,是因为坐席可能暂时忙其他事情直接挂断电话,这样用户会感知到对方挂断但自己这一端的电话还没有挂,影响体验- 对于坐席可以采用 inbound 模式监听其应答状态,如无特殊需求一般不需要为坐席单独配置拨号计划 outbound 外连
- 坐席的呼叫命令中可以带上超时参数,如果坐席超时未接听则自动挂断,从步骤4开始重新执行,继续分配另外一个坐席
- 如果目标坐席接了电话,则 b-leg 接通,此时在用户来电的 a-leg 上执行 answer APP 通知对方已接通即可
- a/b leg 都已经接通,接下来使用
uuid_bridge
API 桥接两条腿就可以通话了
2. 细节处理
1. a-leg 的拨号计划
用户呼入的拨号计划示例如下,当用户呼入到 FreeSWITCH 时可以先执行 ring_ready APP 回一个 180 给到用户终端,然后直接执行 esl 外连将 a-leg 交给目标服务器控制,由业务系统决定在 a-leg 上的响应行为
<extension name="inbound">
<condition field="destination_number" expression="^9000(\d+)$">
<action application="ring_ready"/>
<action application="socket" data="127.0.0.1:9000 async full"/>
</condition>
</extension>
2. originate 呼叫坐席
呼叫坐席的命令示例如下,需要注意的有以下几点:
- 通过 originate_timeout
- 通过 origination_uuid 指定 b-leg 的会话 id,会话 id 可以自行生成保存,方便之后执行
uuid_bridge
- 在 b-leg 接通后执行 park 程序把坐席端的电话保持住,否则呼叫可能会超时自动挂断
originate {originate_timeout=10,origination_uuid=888888,origination_caller_id_number=1008611,origination_caller_id_name=1008611}user/1018 &park()