在 FreeSWITCH 中,effective_caller_id_name和effective_caller_id_number是两个非常重要的通道变量(Channel Variables)。
它们的核心作用是:控制在呼叫去电(Outbound Call)时,被叫方(接收者)手机或话机屏幕上显示的“来电显示”信息。
以下是详细的解释和用法:
1. 核心作用
当你通过 FreeSWITCH 进行bridge(桥接)或者originate(发起呼叫)时,FreeSWITCH 需要决定告诉对方“谁在打这个电话”。
effective_caller_id_name:设置显示的名称(如:Company Support)。effective_caller_id_number:设置显示的号码(如:01012345678)。
2. 为什么要用 “Effective”(有效的)?
在 FreeSWITCH 中,有两种类型的 Caller ID 变量,它们有微妙的区别:
caller_id_number:通常代表真实的源号码(即拨号者原本的号码)。effective_caller_id_number:代表对外呈现的号码。
关键逻辑:
当 FreeSWITCH 执行bridge操作发起呼出请求时,它会优先查找effective_caller_id_xxx。如果设置了这两个变量,FreeSWITCH 就会在 SIP 的From头部或者Remote-Party-ID头部使用这些值。如果没有设置,它才会退而求其次使用caller_id_xxx。
3. 常见使用场景
场景 A:企业总线号码代发
公司内部员工的内部短号是1001,但他拨打外部客户手机时,不希望显示1001(因为客户回拨不进来),而是希望显示公司的统一对外大号010-88888888。
- 操作:在拨号计划(Dialplan)中,将
effective_caller_id_number设置为01088888888。
场景 B:呼叫转移(Call Forwarding)
A 打给 B,B 设置了呼叫转移到 C。
- 如果 B 转发给 C 时,希望 C 看到是 A 在打过来,B 就会把
effective_caller_id_number设置成 A 的号码。 - 如果 B 希望 C 看到是 B 转过来的,就设置成 B 的号码。
4. 如何在 Dialplan 中设置
通常在conf/dialplan/default.xml中使用:
<extensionname="outbound_call"><conditionfield="destination_number"expression="^(\d+)$"><!-- 设置显示的名称 --><actionapplication="set"data="effective_caller_id_name=My Company"/><!-- 设置显示的号码 --><actionapplication="set"data="effective_caller_id_number=01012345678"/><!-- 执行外呼 --><actionapplication="bridge"data="sofia/gateway/my_provider/$1"/></condition></extension>5. 注意事项
- 运营商限制:尽管你可以在 FreeSWITCH 里随便设置
effective_caller_id_number,但当你通过中继线(Gateway/Trunk)打到公网(移动/联通/电信)时,运营商通常会强制修改或丢弃你自定义的号码,以防止诈骗电话。你只能设置成该中继线合法绑定的号码。 - 变量继承:这两个变量通常设置在“A腿”(主叫通道)上,当执行
bridge时,它们会被传递并应用到“B腿”(被叫通道)的 SIP 消息中。 - 与
origination_caller_id_number的区别:- 如果你是使用
originate命令(通过 API 或脚本发起呼叫),通常使用origination_caller_id_number。 - 如果你是在 Dialplan 中处理现有的通话,通常使用
effective_caller_id_number。
- 如果你是使用
总结
effective_caller_id_name: 你想让对方看到的名字。effective_caller_id_number: 你想让对方看到的来电号码。