跳到主要内容

路由、SIP Trunk 与计费模板

RustPBX 将线路控制拆分为「Trunk(承载)」与「Routing(策略)」两个层,计费模板则为线路和业务提供财务抽象。本篇从规划、配置到验证,完整呈现线路管理方法。

1. SIP Trunk 管理

1.1 建模思路

  • Trunk = 线路资源:对应一个运营商、批发线路或内部 SBC,包含访问地址、鉴权方式、支持编码。
  • 多 Trunk 编排:可针对成本、地域或冗余需求配置多个 Trunk,并在路由策略中按优先级或轮询使用。

1.2 创建步骤

  1. 控制台「SIP Trunk → 新建」,填写名称、SIP URI(sip:host:port)。
  2. 选择鉴权方式:
    • IP 信任:配置运营商出口 IP 与允许的编解码。
    • 账号密码:输入 username/password,可启用 TLS/SRTP。
  3. 配置运行细节:codec 列表、max_calls 并发、允许的 inbound_hosts、方向(direction)及备份目的地 backup_dest
  4. 保存后系统生成 trunk_id,可在路由或计费中引用。

(此处可插入「Trunk 表单」截图)

1.3 文件配置

若使用 GitOps,可在 config/trunks/*.toml 定义:

name = "carrier-a"
uri = "sip:1.2.3.4:5060"
auth = { type = "ip", cidr = ["1.2.3.4/32"] }
codecs = ["g711a", "g729", "opus"]
concurrency_limit = 200

修改后需执行 Reload(详见《诊断工具》)。

2. Routing 策略

2.1 规则结构

字段说明
directioninbound/outbound,区分入站与出站场景
matchers主叫、被叫、时间、地区、业务标签等条件
actions调用分机、队列、IVR、外呼 Trunk、播放提示等
fallback主动作失败时的备选策略

2.2 配置流程

  1. 梳理入口:按 DID、SIP URI、外呼目的地整理业务入口,并与 Trunk 的 directioninbound_hosts 保持一致。
  2. 编写规则:在控制台或 config/routes/*.toml 中设置 match 字段,可匹配 from.*to.*request_uri.* 以及指定 SIP header;支持正则表达式。
  3. 绑定动作action.dest 用于转发到一个或多个 Trunk,action.queue/action.ivr 对应队列或 IVR 文件,action.reject 则直接返回 SIP 4xx/5xx。
  4. 多级策略:利用 prioritysource_trunks(或 source_trunk_ids)对不同入口分层;若主 Trunk 不可用,可在 dest 中列出备份次序。

示例:

[[routes]]
name = "vip-outbound"
direction = "outbound"
matchers = { callee_prefix = ["0086", "+86"], extension_group = "vip" }
actions = [
{ type = "send_trunk", trunk_id = "carrier-a", timeout = 30 },
{ type = "send_trunk", trunk_id = "carrier-b", timeout = 30 }
]
fallback = { type = "play_prompt", prompt = "vip_no_route.wav" }

2.3 变更发布

  1. 保存草稿后务必执行 Reload,使最新路由生效。
  2. 在 Diagnostics → Routing 中使用 Evaluate,分别对 runtimedatabase 数据集进行验证,确认即将发布的规则逻辑正确。
  3. 结合 examples/voice_demo.rs 或内置 Web Dialer 做真实呼叫测试,并在 CDR 中核对计费。

3. 计费模板

RustPBX 通过 models/bill_template.rs 定义计费模板,可在 UI 中以可视化方式管理。

3.1 设计要点

  • 费率结构:支持按秒计费、分段计费、最低消费、峰谷平价差。
  • 币种与税率:可自定义币种、税率,方便与财务系统对接。
  • 绑定入口:模板可在 routing、queue、extension 模块中引用,实现“策略+计费”一体化。

3.2 示例

[bill_template.vip]
currency = "CNY"
billing_step = 6
free_seconds = 60
rates = [
{ prefix = "0086", price = 0.05 },
{ prefix = "001", price = 0.15 }
]

3.3 校验与对账

  1. 使用 Call Records 导出 CDR,与计费模板中的费率核对。
  2. Diagnostics → Billing 检查器可快速发现缺失模板或匹配失败的通话。
  3. 若需自定义分账,可结合 addons/wholesale 插件扩展。

4. 最佳实践

  • 多活线路:为不同运营商创建独立 Trunk,并在路由中设置优先级+失败转移,提高成功率。
  • 差异化计费:一个路由可根据业务标签切换计费模板,实现 VIP/普通用户的不同费率。
  • 灰度变更:在 routes 文件中添加 enabled = false 字段进行预配置,Reload 后通过控制台手动启用,实现快速切换。
  • 合规审计:所有 Trunk、Routing、Billing 的调整都建议走 PR/审批,配合 Git 记录。

(此处可放“Trunk+Routing 流程图”与“计费模板”截图)