补充服务
📖 返回主文档
呼叫转移、CLI 阻止和紧急呼叫服务的配置和实现。
相关文档
核心文档
呼叫处理与数据源
- 🔀 拨号计划配置 - 在拨号计划逻辑中实现服务
- 👥 Sh 接口 - 呼叫转移设置的 MMTel-Config
- 📡 SS7 MAP - 基于 HLR 的呼叫转移(Sh 的替代方案)
- 🔢 号码翻译 - CLI 阻止前缀处理
服务交互
监控
补充服务(呼叫转移 / 阻止 CLI / 紧急代码)
配置被阻止的 CLI 前缀、紧急呼叫代码和默认呼叫转移数据(呼叫转移 / 无应答数据仅在从 Sh 的存储库未返回 MMTel-Config 数据时使用)。
config :tas,
...
blocked_cli_prefix: ["*67"],
call_forward_not_reachable_destination: "2222",
default_no_reply_timer: 30,
emergency_call_codes: ["911", "912", "913", "sos"],
...
配置参数:
-
blocked_cli_prefix(字符串列表):触发 CLI(呼叫线路 ID)保留的前缀- 示例:
["*67"]- 在号码前拨打 *67 隐藏来电号码 - 在拨号计划中用于设置
cli_withheld变量
- 示例:
-
call_forward_not_reachable_destination(字符串):呼叫转移未到达的默认目的地(CFNRc)- 仅在从 Sh 接口未返回 MMTel-Config 时使用
- 示例:
"2222"- 转发到语音信箱
-
default_no_reply_timer(整数):在 CFNRc 激活之前的默认超时时间(以秒为单位)- 仅在从 Sh 接口未返回 MMTel-Config 时使用
- 示例:
30- 在转发之前响铃 30 秒
-
emergency_call_codes(字符串列表):您所在辖区的紧急服务号码- 在呼叫授权期间检查以检测紧急呼叫
- SIP 紧急 URN(例��,
<urn:service:sos>)始终与这些代码一起检查 - 常见示例:
["911", "112", "000", "999", "sos"] - 有关详细用法,请参见 紧急呼叫 部分
如何工作来电号码阻止
TAS 支持两种阻止来电号码(CLI 保留)的方法,均将 cli_withheld 拨号计划变量设置为 "true":
方法 1:基于前缀的阻止
当订阅者拨打带有 blocked_cli_prefix 中代码的目的地号码时:
- 号码翻译模块检测到前缀(例如,来电者拨打
*67555123456) - 前缀从目的地号码中 去掉(变为
555123456) cli_withheld变量被设置为"true"- 拨号计划可以使用此变量来隐藏来电者的身份
示例配置:
blocked_cli_prefix: ["*67"] # 美国风格的阻止
blocked_cli_prefix: ["#31#"] # 欧洲 GSM 风格的阻止
blocked_cli_prefix: ["*67", "#31#"] # 同时支持两者
方法 2:SIP From 头检测
当 UE/手机通过 SIP 头请求隐私时:
- TAS 检查 SIP From 头显示名称是否包含 "anonymous"(不区分大小写)
- 如果找到,
cli_withheld变量被设置为"true" - 这尊重在设备级别设置的订阅者的隐私请求
在拨号计划中实现 CLI 阻止
TAS 设置 cli_withheld 变量,但您的 拨号计划 XML 必须实现实际的阻止行为:
<extension name="CLI-Privacy" continue="true">
<condition field="${cli_withheld}" expression="true">
<!-- 隐藏来电者身份 -->
<action application="set" data="effective_caller_id_name=anonymous"/>
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>
<!-- 可选设置 P-Asserted-Identity 隐私 -->
<action application="set" data="sip_h_Privacy=id"/>
</condition>
</extension>
TAS 为 CLI 阻止设置的变量:
TAS 在拨号计划执行之前设置这些变量:
| 变量 | 类型 | 值 | 描述 |
|---|---|---|---|
cli_withheld | 字符串 | "true" 或 "false" | 指示是否通过前缀或 From 头请求了 CLI 阻止 |
tas_destination_number | 字符串 | 规范化号码 | 去掉阻止前缀后的目的地(例如,555123456) |
destination_number | 字符串 | 规范化号码 | 与 tas_destination_number 相同(两者都被设置) |
您的拨号计划应设置的变量(当 cli_withheld="true" 时):
这些变量控制来电者身份的呈现方式:
| 变量 | 推荐值 | 目的 |
|---|---|---|
effective_caller_id_number | "anonymous" | 隐藏来电者的电话号码 |
effective_caller_id_name | "anonymous" | 隐藏来电者的显示名称 |
origination_privacy | "hide_number" | 出站环节的 SIP 隐私标志 |
sip_h_Privacy | "id" | SIP 隐私头(RFC 3323) |
sip_h_P-Asserted-Identity | (未设置或删除) | 可选:删除 P-Asserted-Identity 头 |
完整拨号计划示例:
<extension name="CLI-Privacy-Handler" continue="true">
<condition field="${cli_withheld}" expression="true">
<!-- 记录以便故障排除 -->
<action application="log" data="INFO 请求对 ${tas_destination_number} 的 CLI 阻止"/>
<!-- 在出站呼叫中隐藏来电者身份 -->
<action application="set" data="effective_caller_id_name=anonymous"/>
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>
<!-- 设置 SIP 隐私头 -->
<action application="set" data="sip_h_Privacy=id"/>
<!-- 可选:如果存在则删除 P-Asserted-Identity -->
<action application="unset" data="sip_h_P-Asserted-Identity"/>
<!-- 如果 cli_withheld 为 false,则运行反��操作 -->
<anti-action application="log" data="DEBUG 使用正常来电号码: ${msisdn}"/>
<anti-action application="set" data="effective_caller_id_number=${msisdn}"/>
</condition>
</extension>
<!-- 此扩展继续到实际的呼叫路由 -->
<extension name="Route-Outbound-Call">
<condition field="${tas_destination_number}" expression="^(.+)$">
<action application="bridge" data="sofia/gateway/trunk/${tas_destination_number}"/>
</condition>
</extension>
重要说明:
- 两种方法可以同时工作(前缀或 SIP 头触发阻止)
- 前缀始终从目的地号码中 去掉,即使拨号计划未实现隐私
cli_withheld变量是 字符串("true"或"false"),而不是布尔值- 呼叫转移 / 阻止 CLI 行为在您的拨号计划 XML 中实现
- 示例配置包含这些功能,但如果您未在拨号计划中定义它们,则它们将无法工作
- 变量在 MO(移动发起)呼叫流程中设置
呼叫转移的工作原理
呼叫转移(也称为通信转移或 CDIV)允许订阅者将来电重定向到另一个目的地。TAS 支持多种类型的呼叫转移,并具有可配置的行为。
呼叫转移的类型
1. 呼叫转移全部 (CFA) - 无条件转移
- 变量:
call_forward_all_destination - 何时激活: 所有来电立即转移
- 优先级: 首先检查(在 HLR 转移之后)
- 常见用途: 订阅者希望将所有呼叫发送到另一个号码
- 示例: 商务电话转移到个人手机
2. 呼叫转移忙碌 (CFB)
- 何时激活: 当订阅者已经在通话中时转移呼叫
- SIP 响应: 486 忙碌触发转移
- 常见用途: 当在另一个呼叫时转移到语音信箱
3. 呼叫转移无应答 (CFNRy)
- 变量:
no_reply_timer - 何时激活: 在指定秒数内响铃但无人接听后转移呼叫
- 超时: 通常为 15-30 秒
- 常见用途: 如果未接听则转移到语音信箱
4. 呼叫转移未到达 (CFNRc)
- 变量:
call_forward_not_reachable_destination - 何时激活: 订阅者离线、未注册或无法到达
- SIP 响应: 480 暂时不可用
- 常见用途: 当手机关闭时转移到语音信箱
- 默认: 如果没有 MMTel-Config,则使用配置参数
数据源优先级
呼叫转移数据从多个来源检索,优先级如下:
1. HLR 数据 (SS7 MAP) [最高优先级 - 覆盖所有]
↓ (如果没有 HLR 转移激活)
2. MMTel-Config (Sh 接口) [来自 HSS 的订阅者特定设置]
↓ (如果没有返回 MMTel-Config)
3. 配置默认值 [最低优先级 - 回退值]
为什么这个优先级?
- HLR 数据: 实时转移状态,适用于漫游/网络场景
- MMTel-Config: 订阅者在 IMS 中配置的偏好
- 配置默认值: 网络范围内的回退(通常是语音信箱)
拨号计划变量用于呼叫转移
| 变量 | 类型 | 来源 | 示例值 | 描述 |
|---|---|---|---|---|
call_forward_all_destination | 字符串 | Sh/MMTel 或 "none" | "61403555123" | 如果激活,则为 CFA 目的地 |
call_forward_not_reachable_destination | 字符串 | Sh/MMTel 或配置 | "2222" | CFNRc 目的地(语音信箱) |
no_reply_timer | 整数 | Sh/MMTel 或配置 | 30 | 在 CFNRy 激活之前响铃的秒数 |
msrn | 字符串 | HLR(仅 MT) | "61400123456" | 来自 HLR 的 MSRN 或转移号码 |
tas_destination_number | 字符串 | 计算得出 | "2222" | 实际路由目的地(可能是转移号码) |
在拨号计划中实现呼叫转移
示例 MT 拨号计划与呼叫转移:
<!-- 检查呼叫转移全部(在 HLR 之后的最高优先级) -->
<extension name="Check-CFA" continue="true">
<condition field="${call_forward_all_destination}" expression="^(?!none$).+$">
<action application="log" data="INFO 呼叫转移全部激活到 ${call_forward_all_destination}"/>
<action application="set" data="tas_destination_number=${call_forward_all_destination}"/>
</condition>
</extension>
<!-- 尝试桥接到订阅者 -->
<extension name="Bridge-To-Subscriber">
<condition field="${msrn}" expression="^none$">
<!-- 没有 MSRN,路由到本地订阅者 -->
<action application="set" data="call_timeout=${no_reply_timer}"/>
<action application="bridge" data="sofia/internal/${tas_destination_number}@${scscf_address}"/>
<!-- 如果桥接失败,检查转移 -->
<action application="log" data="INFO 桥接失败,检查呼叫转移"/>
<!-- 呼叫转移未到达 -->
<action application="set" data="forward_destination=${call_forward_not_reachable_destination}"/>
<action application="log" data="INFO 转移到 ${forward_destination}"/>
<action application="answer"/>
<action application="voicemail" data="default default ${msisdn}"/>
</condition>
</extension>
配置默认呼叫转移
在 config/runtime.exs 中设置网络范围的默认值:
config :tas,
# 默认 CFNRc 目的地(在没有 MMTel-Config 时使用)
call_forward_not_reachable_destination: "2222", # 语音信箱访问号码
# 默认超时,在 CFNRy 激活之前(在没有 MMTel-Config 时使用)
default_no_reply_timer: 30 # 响铃 30 秒
何时使用默认值:
- 订阅者存在于 HSS 中,但没有配置 MMTel-Config
- Sh 查找成功但未返回呼叫转移设置
- 新订阅者在配置呼叫转移之前
故障排除呼叫转移
问题:呼叫未按预期转移
-
检查 Sh 数据:
- 使用 Web UI
/sh_test查询订阅者 - 验证 MMTel-Config 包含 CDIV 规则
- 检查
call_forward_all_destination值
- 使用 Web UI
-
检查拨号计划变量:
- 查看呼叫日志以获取变量值
- 确认
call_forward_all_destination!="none" - 验证
tas_destination_number设置为转移目的地
-
检查 HLR 数据(如果启用 SS7 MAP):
- 使用 Web UI
/hlr查询订阅者 - HLR 转移覆盖 Sh 数据
- 验证
msrn变量不包含意外的转移号码
- 使用 Web UI
-
检查配置默认值:
- 验证配置中的
call_forward_not_reachable_destination - 确认
default_no_reply_timer合适 - 这些仅在没有 MMTel-Config 存在时适用
- 验证配置中的
问题:转移循环
症状: 呼叫转移到一个转移回来的号码,形成循环
在拨号计划中的预防:
<!-- 跟踪转移跳数 -->
<extension name="Prevent-Forward-Loop" continue="true">
<condition field="${sip_h_X-Forward-Hop-Count}" expression="^$">
<action application="set" data="sip_h_X-Forward-Hop-Count=1"/>
<anti-action application="set" data="sip_h_X-Forward-Hop-Count=${expr(${sip_h_X-Forward-Hop-Count}+1)}"/>
</condition>
</extension>
<extension name="Check-Forward-Hop-Limit">
<condition field="${sip_h_X-Forward-Hop-Count}" expression="^([3-9]|[1-9][0-9]+)$">
<action application="log" data="ERROR 检测到转移循环,跳数: ${sip_h_X-Forward-Hop-Count}"/>
<action application="hangup" data="LOOP_DETECTED"/>
</condition>
</extension>
监控呼叫转移
关键指标:
- 高频率的呼叫到语音信箱号码
- 呼叫在
no_reply_timer值处超时的模式 - 呼叫持续路由到相同的转移目的地
有用���日志:
INFO 呼叫转移全部激活到 61403555123
INFO 转移到 2222
INFO 桥接失败,检查呼叫转移
商业智能:
- 跟踪每个订阅者的转移激活率
- 监控语音信箱使用模式
- 识别具有无条件转移的订阅者