FreeSWITCH配置外呼全攻略:从基础到进阶

FreeSWITCH配置外呼全攻略:从基础到进阶

一、外呼配置核心概念解析

FreeSWITCH的外呼功能本质是通过SIP协议与运营商网关或第三方SIP中继建立连接,实现号码拨出与媒体流传输。其核心组件包括:

  1. SIP Profile:定义SIP协议参数(如端口、编码格式),通常使用internal(内部分机)和external(外部中继)两种配置
  2. 网关配置:指定运营商提供的SIP服务器地址、认证信息及编码参数
  3. 拨号计划(Dialplan):定义号码路由规则,使用正则表达式匹配被叫号码并触发外呼动作
  4. ACL控制:通过IP白名单限制可发起外呼的源地址

典型外呼流程:分机发起呼叫→SIP Profile接收请求→拨号计划匹配路由→通过网关转发至PSTN网络→返回通话状态。

二、基础配置四步法

1. 网关配置

autoload_configs/sip_profiles/external.xml中添加网关定义:

  1. <gateway name="carrier_gateway">
  2. <param name="proxy" value="sip.carrier.com:5060"/>
  3. <param name="register" value="true"/>
  4. <param name="username" value="your_account"/>
  5. <param name="password" value="your_pass"/>
  6. <param name="realm" value="carrier.com"/>
  7. <param name="from-user" value="13800000000"/>
  8. <variables>
  9. <variable name="caller_id_number" value="13800000000"/>
  10. </variables>
  11. </gateway>

关键参数说明:

  • register:是否向网关注册(动态IP需设为true)
  • from-user:显示的主叫号码(需与运营商备案一致)
  • caller_id_number:强制覆盖的主叫号码(用于号码伪装)

2. 拨号计划设计

dialplan/default.xml中添加外呼路由规则:

  1. <extension name="outbound_call">
  2. <condition field="destination_number" expression="^9(1\d{10})$">
  3. <action application="set" data="effective_caller_id_number=13800000000"/>
  4. <action application="bridge" data="[outbound_route]sofia/gateway/carrier_gateway/$1"/>
  5. </condition>
  6. </extension>

正则表达式解析:

  • ^9:匹配前缀9(可选,用于区分内外线)
  • (1\d{10}):捕获11位手机号码
  • $1:引用捕获组作为被叫号码

3. ACL权限控制

autoload_configs/acl.conf.xml中配置:

  1. <list name="outbound_allow" default="deny">
  2. <node type="allow" cidr="192.168.1.0/24"/>
  3. </list>

通过fs_cli执行reloadacl生效,限制仅内网IP可发起外呼。

4. 编码格式优化

在网关配置中添加:

  1. <param name="codec-prefs" value="PCMU,PCMA,G729,OPUS"/>
  2. <param name="inbound-codec-prefs" value="PCMU,PCMA"/>

建议优先使用G.711(PCMU/PCMA)保证音质,G.729用于带宽受限场景。

三、进阶配置技巧

1. 动态路由选择

通过Lua脚本实现根据被叫号码选择最优网关:

  1. local number = argv[1]
  2. local gateway
  3. if string.sub(number, 1, 2) == "01" then
  4. gateway = "carrier_gateway_beijing"
  5. else
  6. gateway = "carrier_gateway_shanghai"
  7. end
  8. freeswitch.consoleLog("INFO", "Selecting gateway: " .. gateway .. "\n")
  9. session:execute("bridge", "sofia/gateway/" .. gateway .. "/" .. number)

2. 呼叫限制策略

在拨号计划中添加计费限制:

  1. <extension name="limited_call">
  2. <condition field="${limit_db}" expression="^user/(\d+)$">
  3. <action application="set" data="limit_database=calls"/>
  4. <action application="limit" data="execute !user_$1 !outbound 1800"/>
  5. </condition>
  6. </extension>

该配置限制每个用户每日外呼时长不超过1800秒。

3. 失败重试机制

在网关配置中添加:

  1. <param name="fail-route" value="fallback_gateway"/>
  2. <param name="retry-seconds" value="30"/>
  3. <param name="max-retries" value="3"/>

当主网关故障时自动切换至备用网关。

四、常见问题排查

1. 407 Proxy Authentication Required

  • 原因:网关认证失败
  • 解决方案:
    1. 检查username/password参数
    2. 确认realm与运营商要求一致
    3. 使用sofia profile external siptrace on抓包分析

2. 486 Busy Here

  • 原因:被叫忙或号码错误
  • 解决方案:
    1. 检查被叫号码格式
    2. 在拨号计划中添加^9(1\d{10})$严格匹配
    3. 启用<param name="debug" value="9"/>查看详细日志

3. 单向语音问题

  • 原因:NAT穿透失败或编码不匹配
  • 解决方案:
    1. 网关侧配置ext-rtp-ipext-sip-ip为公网IP
    2. 确认双方支持相同编码
    3. 关闭SIP ALG功能(路由器设置)

五、性能优化建议

  1. 连接池管理:对高频外呼场景,在网关配置中添加:

    1. <param name="contact-params" value="transport=udp;expire=3600"/>
    2. <param name="register-ttl" value="3600"/>

    减少重复注册开销

  2. 媒体处理优化

    • 禁用视频支持:<param name="disable-video" value="true"/>
    • 启用Jitter Buffer:<param name="jitterbuffer-msec" value="20"/>
  3. 监控告警

    1. fs_cli -x "show channels" | grep OUTBOUND_
    2. fs_cli -x "sofia status profile external reg"

    设置cron任务定期检查注册状态

通过系统化的配置管理,FreeSWITCH可实现稳定高效的外呼服务。建议配置完成后使用sngrep工具监控SIP信令流程,确保各环节正常通信。对于企业级部署,建议结合FusionPBX等管理界面简化运维操作。