跳到主要内容

补充服务

📖 返回主文档

呼叫转移、CLI 阻止和紧急呼叫服务的配置和实现。

相关文档

核心文档

  • 📋 主 README - 概述和快速入门
  • 🔧 配置指南 - 服务配置参数(紧急代码、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 中代码的目的地号码时:

  1. 号码翻译模块检测到前缀(例如,来电者拨打 *67555123456
  2. 前缀从目的地号码中 去掉(变为 555123456
  3. cli_withheld 变量被设置为 "true"
  4. 拨号计划可以使用此变量来隐藏来电者的身份

示例配置:

blocked_cli_prefix: ["*67"]        # 美国风格的阻止
blocked_cli_prefix: ["#31#"] # 欧洲 GSM 风格的阻止
blocked_cli_prefix: ["*67", "#31#"] # 同时支持两者

方法 2:SIP From 头检测

当 UE/手机通过 SIP 头请求隐私时:

  1. TAS 检查 SIP From 头显示名称是否包含 "anonymous"(不区分大小写)
  2. 如果找到,cli_withheld 变量被设置为 "true"
  3. 这尊重在设备级别设置的订阅者的隐私请求

在拨号计划中实现 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 查找成功但未返回呼叫转移设置
  • 新订阅者在配置呼叫转移之前

故障排除呼叫转移

问题:呼叫未按预期转移

  1. 检查 Sh 数据:

    • 使用 Web UI /sh_test 查询订阅者
    • 验证 MMTel-Config 包含 CDIV 规则
    • 检查 call_forward_all_destination
  2. 检查拨号计划变量:

    • 查看呼叫日志以获取变量值
    • 确认 call_forward_all_destination != "none"
    • 验证 tas_destination_number 设置为转移目的地
  3. 检查 HLR 数据(如果启用 SS7 MAP):

    • 使用 Web UI /hlr 查询订阅者
    • HLR 转移覆盖 Sh 数据
    • 验证 msrn 变量不包含意外的转移号码
  4. 检查配置默认值:

    • 验证配置中的 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 桥接失败,检查呼叫转移

商业智能:

  • 跟踪每个订阅者的转移激活率
  • 监控语音信箱使用模式
  • 识别具有无条件转移的订阅者