FreeSWITCH中文网,电话机器人开发网 ,微信订阅号:

FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898

nacd为客服排队(FreeSWITCH排队机、呼叫中心)-使用说明


tags:FreeSWITCH 呼叫中心 排队机 nacd 报工号 满意度 创建时间:2024-11-13 16:45:38

前言

  在 FreeSWITCH 中,实现排队功能通常采用 mod_callcenter 或 mod_fifo 等模块。我们在早期也使用过这些模块,但发现它们在某些场景下的表现不够理想,因此开始不断优化和改进自己的实现。最初,我们在使用如 Dialogic、东进、三汇等硬件板卡实现排队系统,后来逐步使用 C/C++ 结合 FreeSWITCH 的 ESL 进行开发(包括 inbound 和 outbound)。最终,我们在 fsgui 中结合系统数据库实现了业务接口,推出了 mod_nwayacd 模块,并发布了开源版本。然而,mod_nwayacd 有一些局限性:

  • 使用难度较高。

  • 业务整合较为复杂。

  • 必须依赖 PostgreSQL 数据库,且不再支持 MySQL,导致一些用户无法使用。

  为解决这些问题,我们开发了 mod_nacd,它能够跨数据库使用,并将业务层完全剥离,使得用户可以更方便地上手。目前支持的数据库包括 MySQL 和 PostgreSQL(配置文件需指定为 postgres)。如有其他 Golang 支持的数据库需求,欢迎联系我:lihao@nway.com.cn。

nacd拥有的能力

  1. 通过配置数据库,即可进行分机注册,见配置文件中的

  2. 通过配置文件配置sql,即可实现did呼入呼出

    <param name="out_did_sql" value="SELECT callout_number,gateway_name FROM nway_extension WHERE extension_type=1 and extension_number = $1"/>
    <!-- 使用did号码外呼时的查询语句,必须要两个返回值-->
    <param name="in_did_sql" value="SELECT extension_number FROM nway_extension WHERE extension_type=1 and callout_number = $1"/>
    
  3. 通过http响应,包括不限于排队机,通过http event,可以对分机置忙、置闲

  4. 内置报工号、满意度评价

  5. 如果不在工作时间,则直接回应playback放音即可

  6. 如果是黑名单,那么直接回应playback放音即可

  7. 如果需要自定义ivr,回应dtmf,那么就可以自动采集按键等

一、安装部署

  1. FreeSWITCH安装:由用户自行安装,当前版本为:1.10.12,操作系统版本为:Debian 12.

  2. 文件清单:

    config.cfg main.go中的配置项,用于配置本地逻辑处理的端口以及外呼时使用的gateway,排队机可以内部排队,也可以非内部排队,一切由main.go中的返回值决定 main.go 主程序,用于由模块发起请求后的返回值,编译后可以运行在任意系统上,上传文件中包含了一个acd_http_server,即是使用此代码编译的。 mod_nacd.so 主模块,用于处理排机队的相关功能,不局限于排队,也可以处理其它逻辑 nacd.conf.xml 配置文件,用于配置相关业务参数 nway.tar.gz 一些依赖库,以及相关的彩铃文件 output.log 日志文件,用于协助使用者对照消息

  3. 部署

    将mod_nacd.so置于$FS_PATH/mod/下,如/usr/local/freeswitch/mod

    将nacd.conf.xml 置于$FS_PATN/conf/autoload_configs/下,如/usr/local/freeswitch/conf/autoload_configs下

    将nway.tar.gz 解压到 /opt/下,确认是 /opt/nway/下有各目录

    将编译好的main.go的文件,结合config.cfg一起运行起来

    在运行的freeswitch中加载模块 load mod_nacd ,如果需要自动加载,则在/usr/local/freeswitch/conf/autoload_configs/modules.conf中添加一条

  4. 相关的api和app说明

    此处api和app,是指FreeSWITCH内的api和app api,nacd,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于将正在通话通过api转进nacd排队 api,nacd_max,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于显示最大并发 api,nacd_transfer,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 当前版本不要用 api,nacd_version,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于显示版本 api,noriginate,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于替代系统的originate,切记,由于nacd的实现,调用originate时,一定要用noriginate api,nway_threeway,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 当前版本不要用 api,nway_uuid_hold,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 当前版本不要用 api,nway_uuid_transfer,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 当前版本不要用 api,nway_uuid_unhold,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 当前版本不要用 application,nacd,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于将当前通话转进nacd排队 application,nbridge,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于替代系统的bridge这个app,同noriginate一样,使用这个 application,nin_did,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于当有外线呼入时,直接按sql语句查询,转进查询结果的分机号 application,nout_did,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于当有内线呼出时,直接按sql语句查询,按指定的号码和网关呼给被叫 application,nwaycallout,mod_nacd,/usr/local/freeswitch/mod/mod_nacd.so 用于内线呼出,不过可以直接使用nbridge实现或nin_did及nout_did实现

  5. nacd.conf.xml配置文件说明

    <param name="license-file" value="/opt/nway/license/acd_license.txt"/>
    <param name="log_dir" value="/opt/nway/mod_log"/>
    <param name="jn-prefix" value="/opt/nway/voices/prefix.wav"/>
    <!--报工号前缀语音-->
    <param name="jn-suffix" value="/opt/nway/voices/suffix.wav"/>
    <!--报工号后缀语音-->
    <!-- 以下为工号数字音-->
    <param name="jn-0" value="/opt/nway/voices/0.wav"/>
    <param name="jn-1" value="/opt/nway/voices/1.wav"/>
    <param name="jn-2" value="/opt/nway/voices/2.wav"/>
    <param name="jn-3" value="/opt/nway/voices/3.wav"/>
    <param name="jn-4" value="/opt/nway/voices/4.wav"/>
    <param name="jn-5" value="/opt/nway/voices/5.wav"/>
    <param name="jn-6" value="/opt/nway/voices/6.wav"/>
    <param name="jn-7" value="/opt/nway/voices/7.wav"/>
    <param name="jn-8" value="/opt/nway/voices/8.wav"/>
    <param name="jn-9" value="/opt/nway/voices/9.wav"/>
    <param name="default-blacklistwav" value="/opt/nway/voices/blacklist.wav"/>
    <!--默认黑名单语音-->
    <param name="default-agent-busy" value="/opt/nway/voices/busy.wav"/>
    <!--默认忙语音-->
    <param name="default-agent-transfer" value="/opt/nway/voices/bridging.wav"/>
    <!--默认转接语音-->
    <param name="default-agent-welcome" value="/opt/nway/voices/welcome.wav"/>
    <!--默认欢迎语音-->
    <param name="default_welcome_play_interval" value="7"/>
    <!-- 默认播放欢迎语的时长 -->
    <param name="default-agent-goodbye" value="/opt/nway/voices/goodbye.wav"/>
    
     <!--默认结束语音-->
    <param name="survey_intro" value="/opt/nway/voices/survey_intro.wav"/>
    <param name="survey_thank_you" value="/opt/nway/voices/survey_thank_you.wav"/>
    
    <!-- 满意度评价 -->
    <param name="recover-seconds" value="300"/>
    <!--从记录态恢复到空闲态时间长度,默认 300秒5分钟-->
    <param name="recover-auto" value="false"/>
    <!--自动由模块切换记录态到空闲态,true为自动按以上的时间去自动更新-->
    <param name="noanswer-to-ready" value="false"/>
    <!-- 呼转不应答是否自动转为空闲态,默认为一定要座席手工,true转为空闲-->
    <param name="typing-auto" value="true"/>
    <!--自动将接听的座席状态切换为记录态,true为自动进入typing,否则ready-->
    <param name="auto-answer" value="true"/>
    <!--要求座席侧由系统送过来即自动应答,sip_auto_answer及对ip话机的-->
    
    <param name="debug" value="true"/>
    
    <param name="local-ip" value="10.0.0.21"/>
     <!--定义每台服务器的ip,用于排队中 -->
    <param name="default_get_info_http_server" value="http://127.0.0.1:8988/call_flow"/>
    <param name="default_push_event_http_server" value="http://127.0.0.1:8988/push_events"/>
    <!-- 分机注册相关,db_type : postgres,mysql 两种-->
    <param name="db_type" value="postgres"/>
    <param name="db_string" value="postgres://postgres:Nway2017@127.0.0.1/cloudcc_web?sslmode=disable"/>
    <param name="ext_query_string" value="SELECT extension_pswd FROM nway_extension WHERE extension_number = $1"/>
    <param name="out_did_sql" value="SELECT callout_number,gateway_name FROM nway_extension WHERE extension_type=1 and extension_number = $1"/>
    <!-- 使用did号码外呼时的查询语句,必须要两个返回值-->
    <param name="in_did_sql" value="SELECT extension_number FROM nway_extension WHERE extension_type=1 and callout_number = $1"/>
    <!-- 使用did号码呼入时的查询语句,必须只要一个返回值-->
    <param name="use_call_center" value="true"/>
    <!-- 使用在呼叫中心中,进行排队,可以报工号、满意度评价等,true /false -->
    <param name="queue_sleep" value="10000"/>
    <!-- 处理队列时,中间需要停顿的时长,以switch_yield为函数调用,微秒-->
    <param name="max_bridge_time" value="10"/>
    

二、nacd排队机的使用

  1. nacd在FreeSWITCH中的使用

a. 配置Dialplan

     <extension name="Local_ExtensionNin">
           <condition field="destination_number" expression="^10002$">
              <action application="nin_did" data=""/>
          </condition>
      </extension>

       <extension name="Local_ExtensionNout">
            <condition field="destination_number" expression="^18621(\d+)$">
               <action application="nout_did" data=""/>
           </condition>
       </extension>

    <extension name="Local_ExtensionNacd">
           <condition field="destination_number" expression="^(.*)$">
                   <action application="answer"/>
                   <action application="nacd" data="120"/>
                   <!--这里的120是指组号,当然如果有通道随路数据,可以配在后边-->
            </condition>
    </extension>

b. 使用

当有nacd进入排队时,会向我们在中配的路径发请求:

收到:

{"timestamp":"2024-11-13 15:10:37","event":"incoming","caller_number":"10004","call_uuid":"87891ea7-5246-4d22-ab53-4962d3a1f49a","callee_number":"120","group_number":"120","dtmf":""}

如果我们配置了随路数据,也会跟着送过来,这里的环境不需要随路数据

需要业务回复:

{"uuid":"87891ea7-5246-4d22-ab53-4962d3a1f49a","caller":"10004","callee":"120","action":"bridge","action_data":{"ad_data":"","ad_display_number":"10004","ad_gateway":"","ad_number":"10002","ad_timeout":"30"},"after_bridge":"playback","after_bridge_data":"10086","use_survey":true,"bridge_fail_ring":"bridge_fail_ring.wav","wait_for_answer_ring":"wait_for_answer_ring.wav","transfer_ring":"transfer_ring.wav","survey_ring":null,"associate_data":null}

c. nacd中事件通知消息:

received json event as string: {"timestamp":"2024-11-13 15:10:37","direction":"IN","event":"incoming","caller_number":"10004","call_uuid":"6d331838-f42f-47c2-9148-8d11f5d3b768","callee_number":"10002","middle_number":"120"}
From ip: 127.0.0.1:57554
received json event as string: {"timestamp":"2024-11-13 15:10:38","direction":"IN","event":"answered","caller_number":"10004","call_uuid":"6d331838-f42f-47c2-9148-8d11f5d3b768","callee_number":"10002","middle_number":"120"}
From ip: 127.0.0.1:59948
received json event as string: {"timestamp":"2024-11-13 15:10:52","direction":"IN","event":"hangup","caller_number":"10004","call_uuid":"6d331838-f42f-47c2-9148-8d11f5d3b768","callee_number":"10002","middle_number":"120"}
From ip: 127.0.0.1:55374

三、下载地址

链接: https://pan.baidu.com/s/1F4ZF65Evf9gt5Fzb4FMcHg?pwd=j95c 提取码: j95c



上海老李,QQ:1354608370,FreeSWITCH QQ群: