路由、SIP Trunk 与计费模板
RustPBX 将线路控制拆分为「Trunk(承载)」与「Routing(策略)」两个层,计费模板则为线路和业务提供财务抽象。本篇从规划、配置到验证,完整呈现线路管理方法。
1. SIP Trunk 管理
1.1 建模思路
- Trunk = 线路资源:对应一个运营商、批发线路或内部 SBC,包含访问地址、鉴权方式、支持编码。
- 多 Trunk 编排:可针对成本、地域或冗余需求配置多个 Trunk,并在路由策略中按优先级或轮询使用。
1.2 创建步骤
- 控制台「SIP Trunk → 新建」,填写名称、SIP URI(
sip:host:port)。 - 选择鉴权方式:
- IP 信任:配置运营商出口 IP 与允许的编解码。
- 账号密码:输入
username/password,可启用 TLS/SRTP。
- 配置运行细节:
codec列表、max_calls并发、允许的inbound_hosts、方向(direction)及备份目的地backup_dest。 - 保存后系统生成
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 规则结构
| 字段 | 说明 |
|---|---|
direction | inbound/outbound,区分入站与出站场景 |
matchers | 主叫、被叫、时间、地区、业务标签等条件 |
actions | 调用分机、队列、IVR、外呼 Trunk、播放提示等 |
fallback | 主动作失败时的备选策略 |
2.2 配置流程
- 梳理入口:按 DID、SIP URI、外呼目的地整理业务入口,并与 Trunk 的
direction、inbound_hosts保持一致。 - 编写规则:在控制台或
config/routes/*.toml中设置match字段,可匹配from.*、to.*、request_uri.*以及指定 SIP header;支持正则表达式。 - 绑定动作:
action.dest用于转发到一个或多个 Trunk,action.queue/action.ivr对应队列或 IVR 文件,action.reject则直接返回 SIP 4xx/5xx。 - 多级策略:利用
priority和source_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 变更发布
- 保存草稿后务必执行 Reload,使最新路由生效。
- 在 Diagnostics → Routing 中使用 Evaluate,分别对
runtime与database数据集进行验证,确认即将发布的规则逻辑正确。 - 结合
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 校验与对账
- 使用 Call Records 导出 CDR,与计费模板中的费率核对。
- Diagnostics → Billing 检查器可快速发现缺失模板或匹配失败的通话。
- 若需自定义分账,可结合
addons/wholesale插件扩展。
4. 最佳实践
- 多活线路:为不同运营商创建独立 Trunk,并在路由中设置优先级+失败转移,提高成功率。
- 差异化计费:一个路由可根据业务标签切换计费模板,实现 VIP/普通用户的不同费率。
- 灰度变更:在 routes 文件中添加
enabled = false字段进行预配置,Reload 后通过控制台手动启用,实现快速切换。 - 合规审计:所有 Trunk、Routing、Billing 的调整都建议走 PR/审批,配合 Git 记录。
(此处可放“Trunk+Routing 流程图”与“计费模板”截图)