asterisk 外呼负载均衡

如果你有多条中继,想实现外呼的时候在多条中继之间做负载均衡,那么可以参考下面的方法

该方法通过asterisk的全局变量来实现




[globals]
OUT_1 = DAHDI/g0
OUT_3 = DAHDI/g1


[macro-dialout-trunk]
include => macro-dialout-trunk-custom
exten => s,1,Set(DIAL_TRUNK=${ARG1})
exten => s,n,GosubIf($[$["${ARG3}" != ""] & $["${DB(AMPUSER/${AMPUSER}/pinless)}" != "NOPASSWD"]]?sub-pincheck,s,1)
exten => s,n,GotoIf($["x${OUTDISABLE_${DIAL_TRUNK}}" = "xon"]?disabletrunk,1)
exten => s,n,Set(DIAL_NUMBER=${ARG2})
exten => s,n,Set(DIAL_TRUNK_OPTIONS=${DIAL_OPTIONS})
exten => s,n,Set(OUTBOUND_GROUP=OUT_${DIAL_TRUNK})
exten => s,n,GotoIf($["${OUTMAXCHANS_${DIAL_TRUNK}}foo" = "foo"]?nomax)
exten => s,n,GotoIf($[ ${GROUP_COUNT(OUT_${DIAL_TRUNK})} >= ${OUTMAXCHANS_${DIAL_TRUNK}} ]?chanfull)
exten => s,n(nomax),GotoIf($["${INTRACOMPANYROUTE}" = "YES"]?skipoutcid)
exten => s,n,Set(DIAL_TRUNK_OPTIONS=${TRUNK_OPTIONS})
exten => s,n,Macro(outbound-callerid,${DIAL_TRUNK})
exten => s,n(skipoutcid),ExecIf($["${PREFIX_TRUNK_${DIAL_TRUNK}}" != ""],AGI,fixlocalprefix)
exten => s,n,Set(OUTNUM=${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER})
exten => s,n,Set(custom=${CUT(OUT_${DIAL_TRUNK},:,1)})
exten => s,n,ExecIf($[$["${MOHCLASS}" != "default"] & $["${MOHCLASS}" != ""]],Set,DIAL_TRUNK_OPTIONS=M(setmusic^${MOHCLASS})${DIAL_TRUNK_OPTIONS})
exten => s,n(gocall),Macro(dialout-trunk-predial-hook,)
exten => s,n,GotoIf($["${PREDIAL_HOOK_RET}" = "BYPASS"]?bypass,1)
exten => s,n,GotoIf($["${custom}" = "AMP"]?customtrunk)
exten => s,n,Noop(${ZT_OUT}) ;zhangtuo edit 
exten => s,n,SetGlobalVar(ZT_OUT=${IF($["${ZT_OUT}"="1"]?3:1)})  ;zhangtuo edit 
exten => s,n,Noop(${ZT_OUT})   ;zhangtuo edit 
exten => s,n,Set(DIAL_TRUNK=${ZT_OUT})  ;zhangtuo edit 
exten => s,n,Dial(${OUT_${DIAL_TRUNK}}/${OUTNUM},300,${DIAL_TRUNK_OPTIONS})
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s,n(customtrunk),Set(pre_num=${CUT(OUT_${DIAL_TRUNK},$,1)})
exten => s,n,Set(the_num=${CUT(OUT_${DIAL_TRUNK},$,2)})
exten => s,n,Set(post_num=${CUT(OUT_${DIAL_TRUNK},$,3)})
exten => s,n,GotoIf($["${the_num}" = "OUTNUM"]?outnum:skipoutnum)
exten => s,n(outnum),Set(the_num=${OUTNUM})
exten => s,n(skipoutnum),Dial(${pre_num:4}${the_num}${post_num},300,${DIAL_TRUNK_OPTIONS})
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s,n(chanfull),Noop(max channels used up)
exten => s-BUSY,1,Noop(Dial failed due to trunk reporting BUSY - giving up)
exten => s-BUSY,n,Playtones(busy)
exten => s-BUSY,n,Busy(20)
exten => s-NOANSWER,1,Noop(Dial failed due to trunk reporting NOANSWER - giving up)
exten => s-NOANSWER,n,Playtones(congestion)
exten => s-NOANSWER,n,Congestion(20)
exten => s-CANCEL,1,Noop(Dial failed due to trunk reporting CANCEL - giving up)
exten => s-CANCEL,n,Playtones(congestion)
exten => s-CANCEL,n,Congestion(20)
exten => s-CHANUNAVAIL,1,GotoIf($["x${OUTFAIL_${ARG1}}" = "x"]?noreport)
exten => s-CHANUNAVAIL,n,AGI(${OUTFAIL_${ARG1}})
exten => s-CHANUNAVAIL,n(noreport),Noop(TRUNK Dial failed due to ${DIALSTATUS} (hangupcause: ${HANGUPCAUSE}) - failing through to other trunks)
exten => _s-.,1,GotoIf($["x${OUTFAIL_${ARG1}}" = "x"]?noreport)
exten => _s-.,n,AGI(${OUTFAIL_${ARG1}})
exten => _s-.,n(noreport),Noop(TRUNK Dial failed due to ${DIALSTATUS} - failing through to other trunks)
exten => disabletrunk,1,Noop(TRUNK: ${OUT_${DIAL_TRUNK}} DISABLED - falling through to next trunk)
exten => bypass,1,Noop(TRUNK: ${OUT_${DIAL_TRUNK}} BYPASSING because dialout-trunk-predial-hook)
exten => h,1,Macro(hangupcall,)


; end of [macro-dialout-trunk]
<think>好的,我现在需要帮助用户查找关于呼叫系统网络拓扑图的设计与实现的资料或教程。首先,用户的问题明确指向呼叫系统的网络拓扑结构,可能涉及硬件布局、软件交互以及网络要求等方面。 首先,我应该回顾用户提供的引用内容,特别是引用[2]和引用[3],因为它们提到了外呼平台的网络拓扑图和网络需求。引用[2]详细描述了外呼平台的结构,包括运营商网络、坐席部分和呼叫中心服务器的交互。而引用[3]讨论了网络环境的要求,如带宽、时延、丢包率等,这对设计呼叫系统至关重要。 接下来,我需要确定用户的需求层次。用户可能不仅需要拓扑图的结构,还想了解设计时的关键因素和实现步骤。因此,回答应包括拓扑图的基本组成、设计要点、实现步骤以及可能遇到的问题。同时,用户可能对技术选型、开源工具和性能优化感兴趣,所以相关问题需要涵盖这些方面。 然后,我需要确保回答结构清晰,符合用户要求的格式。使用分点说明,结合引用内容,自然地插入引用标识。例如,在讨论网络拓扑结构时,引用[2]中的内容可以作为支撑;在提及网络要求时,引用[3]的相关部分应被引用。 另外,考虑到用户可能希望自行搭建或优化呼叫系统,提供开源工具如Asterisk和Kamailio会很有帮助。同时,需要强调网络性能的重要性,引用[3]中的具体指标来增强可信度。 最后,生成的相关问题应引导用户进一步探索,如技术选型、安全性、性能优化等,这些问题需基于回答中的内容,确保连贯性和实用性。需要避免使用Markdown,保持口语化,同时逻辑清晰,信息准确。 总结步骤: 1. 分析用户需求,明确重点在拓扑图设计与实现。 2. 结合引用[2]和[3]中的信息,构建回答的结构。 3. 分点阐述拓扑结构、设计要点、实现步骤,并引用相关引用内容。 4. 提供开源工具和网络要求的具体数据,增强实用性。 5. 生成相关问题,覆盖设计、实现、优化等方面。</think>### 呼叫系统网络拓扑图设计与实现 #### 1. 网络拓扑结构解析 典型的呼叫系统网络拓扑包含以下核心组件(参考外呼平台结构[^2]): - **运营商网络**:提供线路资源(如三大运营商或代理运营商),负责电话信号传输 - **呼叫中心服务器**:开源系统(如Asterisk、FreeSWITCH)作为核心控制节点 - **坐席终端**:支持SIP话机、软电话、Web话机等多种接入方式 - **外呼平台**:实现通话控制(建立/挂断)、语音播放、数据交互等功能 $$拓扑关系:运营商网络 \leftrightarrow 呼叫中心服务器 \leftrightarrow 坐席终端$$ #### 2. 设计关键要点 - **协议选择**:SIP协议用于会话控制,RTP/RTCP协议处理媒体流传输 - **网络隔离**:建议将信令通道与媒体流通道分离(参考网络分层设计[^3]) - **高可用设计**: - 服务器集群部署 - 双运营商线路冗余 - 数据库主从复制 #### 3. 实现步骤 1. **需求分析**:确定并发通话量(如50路/100路)、功能需求(IVR、录音等) 2. **开源系统选型**:常用方案对比: | 系统 | 协议支持 | 扩展性 | |------------|------------|--------| | Asterisk | SIP/IAX | 高 | | Kamailio | SIP/WebRTC | 中 | 3. **网络部署**: - 配置SBC(会话边界控制器)保障网络安全 - 设置QoS策略保障语音质量(时延<150ms,抖动<50ms,丢包率<1%) 4. **功能开发**: ```python # 示例:使用Python实现简单呼叫控制 import pjsua def make_call(dest_uri): acc = lib.acc_get_default() call = acc.make_call(dest_uri, cb=MyCallCallback()) ``` #### 4. 常见问题解决 - **回声消除**:采用Speex或WebRTC回声消除算法 - **网络抖动**:配置jitter buffer(建议大小30-60ms) - **高并发瓶颈**:通过负载均衡分散媒体服务器压力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值