1. nacd为客服排队(FreeSWITCH排队机、呼叫中心)-使用说明:
  2. 宁卫通信
  3. 新闻动态
  4. 宁卫新闻
  5. nacd为客服排队(FreeSWITCH排队机、呼叫中心)-使用说明

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

前言

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

  1. 使用难度较高。

  2. 业务整合较为复杂。

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

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

nacd拥有的能力

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

    <param name="ext_query_string" value="SELECT extension_pswd FROM nway_extension WHERE extension_number = $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中添加一条

<load module="mod_nacd"/>

4. 相关的api和app说明

 此处api和app,是指FreeSWITCH内的api和appapi,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时,一定要用noriginateapi,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配置文件说明

<configuration name="nacd.conf" description="nway acd control module for FreeSWITCH"> <settings>  <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"/> </settings></configuration>

二、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进入排队时,会向我们在<param name="default_get_info_http_server" value="http://127.0.0.1:8988/call_flow"/>中配的路径发请求:

收到:

{"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:57554received 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:59948received 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

图片

实时质检-半实时质检(实时辅助中间件)

nacd为客服排队、客户自有数据库进行注册和DID外呼和接入(三)-号码直接拨入拨出

nacd为客服排队、客户自有数据库进行注册和DID外呼和接入、为线路寻求最佳路由、为目标地址CPS控制流量(一)

NwayAI6.8.5发布