FreeSWITCH mod_callcenter 整理

mod_callcenter
本文英文部分是来自https://freeswitch.org/confluence/display/FREESWITCH/mod_callcenter,中文部分是通过分析mod_callcenter.c的代码根据个人的理解整理而成。

配置
callcenter.conf.xml 范例
    <configuration name="callcenter.conf" description="CallCenter">
      <settings>
        <!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
        <!--<param name="dbname" value="/dev/shm/callcenter.db"/>-->
        <!--<param name="reserve-agents" value="true"/>-->
      </settings>

      <queues>

        <queue name="support@default">
          <param name="strategy" value="longest-idle-agent"/>
          <param name="moh-sound" value="
holdmusic"/><!−−<paramname="record−template"value="
holdmusic"/><!−−<paramname="record−template"value="
{base_dir}/recordings/${strftime(%Y-%m-%d-%H-%M-%S)}.${destination_number}.${caller_id_number}.${uuid}.wav"/>-->
          <param name="time-base-score" value="system"/>
          <param name="max-wait-time" value="0"/>
          <param name="max-wait-time-with-no-agent" value="0"/>
          <param name="max-wait-time-with-no-agent-time-reached" value="5"/>
          <param name="tier-rules-apply" value="false"/>
          <param name="tier-rule-wait-second" value="300"/>
          <param name="tier-rule-wait-multiply-level" value="true"/>
          <param name="tier-rule-no-agent-no-wait" value="false"/>
          <param name="discard-abandoned-after" value="60"/>
          <param name="abandoned-resume-allowed" value="false"/>
        </queue>

      </queues>

    <!-- WARNING: Configuration of XML Agents will be updated into the DB upon restart. -->
    <!-- WARNING: Configuration of XML Tiers will reset the level and position if those were supplied. -->
    <!-- WARNING: Agents and Tiers XML config shouldn't be used in a multi FS shared DB setup (Not currently supported anyway) -->
      <agents>
        <!--<agent name="1000@default" type="callback" contact="[leg_timeout=10]user/1000@default" status="Available" max-no-answer="3" wrap-up-time="10" reject-delay-time="10" busy-delay-time="60" />-->
      </agents>
      <tiers>
        <!-- If no level or position is provided, they will default to 1.  You should do this to keep db value on restart. -->
        <!-- <tier agent="1000@default" queue="support@default" level="1" position="1"/> -->
      </tiers>

    </configuration>

settings 配置详解
odbc-dsn
The callcenter will use the supplied ODBC database instead of the default behavior, which is to use the internal SQLite database.

使用ODBC数据源,需要配置这个参数

使用odbc.ini配置的数据源:dsn:user:pass或者dns
不配置数据源直接连接方法:odbc://DRIVER=driver;SERVER=host;UID=username;PWD=password;DATABASE=db;OPTION=67108864。 driver(驱动,windows系统在ODBC数据源可以看到如“MySQL ODBC 5.3 Unicode Driver”,linux系统odbcinst.ini里面配置),host(数据库主机IP,本机:localhost),username(数据库用户名),password(数据库密码),db(数据库名)。
dbname
This is to specify a different name or path and name of the SQLite database. Useful to put into a ram disk for better performance.

使用SQLite数据库时,用来设置SQLite 数据库文件路径。如果odbc-dsn和dbname都不设置,会使用SQLite数据库,默认路径是.\db\callcenter。

reserve-agents
If defined to true, agent state is changed to Reserved if the old state is Receiving, the call will only be sent to him if the state get’s changed.

This is useful if you’re manipulating agent state external to mod_callcenter. false by default.

这个参数的作用是在呼叫坐席之前把agents.state设置为Reserved。默认值是false,就是不启动这个功能。

truncate-tiers-on-load
If defined to true, we’ll delete all the agents when the module is loaded. false by default.

默认false,设置true时,load的时候清空数据库里的tiers表。

truncate-agents-on-load
If defined to true, we’ll delete all the tiers when the module is loaded. false by default.

默认false,设置true时load的时候清空数据量里的agetns表。

queues 配置详解
strategy
The strategy defines how calls are distributed in a queue. A table of different strategies can be found below.

ring-all: Rings all agents simultaneously.(全响)

全部坐席响铃。

longest-idle-agent: Rings the agent who has been idle the longest taking into account tier level.(空闲时间)

下面是longest-idle-agent模式派话使用的SQL,通过分析下面的SQL,可以看出是 根据 tiers.level, agents.last_bridge_end, tiers.position 这3个参数来排序的。last_bridge_end是坐席最后通话结束时间。

SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, agents.last_bridge_end, position
1
round-robin: Rings the agent in position but remember last tried agent.(循环)

下面是round-robin模式派话使用的SQL,通过分析下面的SQL,可以看出是按照 tiers_level 从小到大, tiers_position 从小到大,agents_last_offered_call 从小到大 循环分配坐席的。 。agents.last_offered_call 是最近一次呼叫坐席的时间。

SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 1 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') AND tiers.position > (SELECT tiers.position FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND agents.last_offered_call > 0 ORDER BY agents.last_offered_call DESC LIMIT 1) AND tiers.level = (SELECT tiers.level FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND agents.last_offered_call > 0 ORDER BY agents.last_offered_call DESC LIMIT 1) UNION SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 2 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY dyn_order asc, tiers_level, tiers_position, agents_last_offered_call
1
top-down: Rings the agent in order position starting from 1 for every member.(指定开始位置)

通道变量 cc_last_agent_tier_level 和 cc_last_agent_tier_position 默认值为0.

查找座席的排序算法为,先查找 level 等于 cc_last_agent_tier_level ,position 大于 cc_last_agent_tier_position 的坐席,然后按照 tiers_level , tiers_position , agents_last_offered_call 排序所有坐席。

SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 1 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') AND tiers.position > 0 AND tiers.level = 0 UNION SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 2 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY dyn_order asc, tiers_level, tiers_position, agents_last_offered_call
1
agent-with-least-talk-time: Rings the agent with least talk time.(通话时间)

按照tiers.level, agents.talk_time, tiers.position排序坐席。agents.talk_time是坐席的通话时间。

启动或者坐席签入时agents.talk_time会复位为0.

SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, agents.talk_time, position
1
agent-with-fewest-calls: Rings the agent with fewest calls.(通话次数)

按照tiers.level, agents.calls_answered, tiers.position排序坐席。agents.calls_answered是坐席的通话次数。

启动或者坐席签入时agents.calls_answered会复位为0.

sequentially-by-agent-order: Rings agents sequentially by tier & order.(顺序)

按照 tiers_level , tiers_position , agents_last_offered_call 排序所有坐席

SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, position, agents.last_offered_call
1
random: Rings agents in random order.(随机)

按照tiers.level顺序然后随机排序。
如果连接mysql数据库,mod_callcenter.源代码需要修改一下。

2550    sql_order_by = switch_mprintf("level, random()");

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值