FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898
前言
在 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拥有的能力
通过配置数据库,即可进行分机注册,见配置文件中的
通过配置文件配置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"/>
通过http响应,包括不限于排队机,通过http event,可以对分机置忙、置闲
内置报工号、满意度评价
如果不在工作时间,则直接回应playback放音即可
如果是黑名单,那么直接回应playback放音即可
如果需要自定义ivr,回应dtmf,那么就可以自动采集按键等
一、安装部署
FreeSWITCH安装:由用户自行安装,当前版本为:1.10.12,操作系统版本为:Debian 12.
文件清单:
config.cfg main.go中的配置项,用于配置本地逻辑处理的端口以及外呼时使用的gateway,排队机可以内部排队,也可以非内部排队,一切由main.go中的返回值决定 main.go 主程序,用于由模块发起请求后的返回值,编译后可以运行在任意系统上,上传文件中包含了一个acd_http_server,即是使用此代码编译的。 mod_nacd.so 主模块,用于处理排机队的相关功能,不局限于排队,也可以处理其它逻辑 nacd.conf.xml 配置文件,用于配置相关业务参数 nway.tar.gz 一些依赖库,以及相关的彩铃文件 output.log 日志文件,用于协助使用者对照消息
部署
将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中添加一条
相关的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实现
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排队机的使用
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