没有合适的资源?快使用搜索试试~ 我知道了~
首页freeswitch之mod_callcenter介绍
freeswitch之mod_callcenter介绍
需积分: 50 649 浏览量
更新于2023-03-16
评论
收藏 283KB PDF 举报
针对mod_callcenter的总结,详细介绍的callcenter模块中通道变量
资源详情
资源评论
资源推荐

mod_callcenter
本文英文部分是来自https://freeswitch.org/confluence/display/FREESWITCH/mod_callcenter,中文部分是通过分析mod_callcenter.c的代码根据个人
的理解整理而成。
关于作者关于作者
鼎鼎:cdevelop@qq.com qq:1280791187。 本文会不定期更新,最新版本在http://www.ddrj.com/?p=79。
配置配置
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="$${hold_music}"/>
<!--<param name="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数据源,需要配置这个参数

1. 使用odbc.ini配置的数据源:dsn:user:pass或者dns
2. 不配置数据源直接连接方法: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
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
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

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
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
random: Rings agents in random order.(随机)
按照tiers.level 顺序然后随机排序。
如果连接mysql数据库,mod_callcenter.源代码需要修改一下。
2550 sql_order_by = switch_mprintf("level, random()");
修改为
2550 sql_order_by = switch_mprintf("level, rand()");
派话SQL
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, random()
ring-progressively: Rings agents in the same way as top-down, but keeping the previous members ringing (it basically leads to ring-all in
the end).(渐进)
按照tiers.level 和tiers.position 排序坐席。每ring_progressively_delay秒,增加分配一个坐席。
派话SQL
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
默认值longest-idle-agent.
moh-sound
The system will playback whatever you specify to incoming callers. You can use any type of input here that is supported by the FreeSWITCH
playback system:
1. A direct path to a .wav file will play in a loop indefinitely.
2. The local stream, e.g. (localstream://moh) or use $${holdmusic} as defined in the default configuration.
3. The FreeSWITCH phrase system, e.g., (phrase:my-special-phrase). (I use this to play multiple prompts after each other.)
4. A tone stream as with ringing, e.g., (tone_stream://${us-ring};loops=-1).
等待音乐,通道变量cc_moh_override 可以覆盖这个设置。
剩余10页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0