文章目录

  • 1. 呼入处理方案
  • 2. 细节处理
  • 1. a-leg 的拨号计划
  • 2. originate 呼叫坐席


1. 呼入处理方案

使用 FreeSWICTH 的 ESL 模块,一个简单的呼入处理时序如下图所示,关键步骤做如下补充:

  1. 用户呼入到 FreeSWITCH 实例,a-leg 创建
  2. FreeSWITCH 根据用户呼叫的号码路由匹配拨号计划,该拨号计划最好配置上 ESL 外连的 socket APP
  3. esl 外连目标 esl 客户端,esl 客户端接收连接后需订阅 a-leg 上的相应事件
  4. esl 客户端根据业务规则分配一个示闲的坐席接待用户
  5. esl 客户端获取目标坐席的 SIP 账户,向 FreeSWITCH 下发 originate 命令,呼叫目标坐席。这里之所以不在 a-leg 的 outbound 连接上直接执行 bridge APP 桥接坐席,是因为坐席可能暂时忙其他事情直接挂断电话,这样用户会感知到对方挂断但自己这一端的电话还没有挂,影响体验
  6. 对于坐席可以采用 inbound 模式监听其应答状态,如无特殊需求一般不需要为坐席单独配置拨号计划 outbound 外连
  1. 坐席的呼叫命令中可以带上超时参数,如果坐席超时未接听则自动挂断,从步骤4开始重新执行,继续分配另外一个坐席
  2. 如果目标坐席接了电话,则 b-leg 接通,此时在用户来电的 a-leg 上执行 answer APP 通知对方已接通即可
  1. a/b leg 都已经接通,接下来使用 uuid_bridge API 桥接两条腿就可以通话了

freeswitch 计费 lua freeswitch 客户端_网络

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 呼叫坐席

呼叫坐席的命令示例如下,需要注意的有以下几点:

  1. 通过 originate_timeout
  2. 通过 origination_uuid 指定 b-leg 的会话 id,会话 id 可以自行生成保存,方便之后执行 uuid_bridge
  3. 在 b-leg 接通后执行 park 程序把坐席端的电话保持住,否则呼叫可能会超时自动挂断
originate {originate_timeout=10,origination_uuid=888888,origination_caller_id_number=1008611,origination_caller_id_name=1008611}user/1018 &park()