我正在努力让 LCR(最低成本路由)与 Freeswitch 配合使用。在 Freeswitch 1.4.9 中使用 mod_lcr。我已经设置好了,它正在运行。我的安装实际上是一个 FusionPBX 实例,但这对以下讨论来说并不重要。
问题是 - 我想为特定路由(即数字)设置呼叫者 ID,并且根据文档,我在 LCR 表的 cid 列中使用正则表达式。
它正在工作,因为我可以在输出和日志中看到它设置了“origination_caller_id_number”变量。但是,目标电话不显示该呼叫者 ID。
此外,如果我在没有 LCR 的拨号计划中设置此变量“origination_caller_id_number”,它似乎不会被使用,并且被叫方永远不会看到它。
如果我设置了“effective_caller_id_name”,那么被调用者就会看到它。
接下来我尝试:在拨号计划中使用 LCR 作为应用程序,然后设置 effective_caller_id_name = ${origination_caller_id_number}(应该由 LCR 应用程序设置),然后使用“auto_lcr_route”变量调用 BRIDGE。
请参阅此处的 XML:
<extension name="LCR.Route.1" >
<condition field="destination_number" expression="^300(\d{9,17})$" >
<action application="set" data="sip_h_X-accountcode=${accountcode}" />
<action application="set" data="sip_h_X-Tag=" />
<action application="set" data="call_direction=outbound" />
<action application="set" data="hangup_after_bridge=true" />
<action application="set" data="inherit_codec=true" />
<action application="set" data="continue_on_fail=true" />
<action application="lcr" data="$1" />
<action application="set" data="effective_caller_id_name=${origination_caller_id_number}" />
<action application="bridge" data="${lcr_auto_route}" />
</condition>
</extension>
呼叫成功完成,但根本没有设置“effective_caller_id_name”。
FusionPBX CDR 数据“应用程序日志部分”显示
Application Log
Name Data
set call_direction=outbound
set call_direction=outbound
set hangup_after_bridge=true
set inherit_codec=true
set continue_on_fail=true
lcr xxxxxxxx
set effective_caller_id_name= <--------- nothing set here. Phone shows SIP "FROM" user.
bridge [lcr_carrier=carrier1,lcr_rate=0.15552,origination_caller_id_number=
99999999]sofia/gateway/cae1e311-8cbc-4ae9-af28-1e2d9706779a/xxxxxxx|
[lcr_carrier=carrier2,lcr_rate=0.90625,origination_caller_id_number=
99999999]sofia/gateway/09266491-caee-4e67-920e-a30c2610a84c/xxxxxxxx
从该日志中可以看出,“origination_caller_id_number”应该在 LCR 应用程序运行后设置。
似乎当 LCR 设置“origination_caller_id_number”时,它处于另一个范围内,无法从拨号计划中检索到?
因此有两个问题:
- 为什么桥接应用程序使用变量“origination_caller_id_number”时不显示呼叫者 ID?
接收电话提供商可能不理解所发送的内容,或者可能仅使用“..._name”而不是“..._number” - 但 mod_lcr 仅设置了这一个变量 - 这让我想到了第二个问题:
- 该变量是否实际上是通过运行 LCR 应用程序来设置的,还是仅在执行 BRIDGE 时才会发生这种情况?
和
- 为什么我无法通过检索“origination_caller_id_number”的值来设置“effective_caller_id_name”?该值显然是由 LCR 应用程序设置的,但我无法从拨号计划中检索它。Freeswitch 文档对范围问题非常模糊 - 那么这是正常的吗?我可以做些什么来获得该值吗?
答案1
我自己解决了。
回答以下问题:
该号码是否在远程电话上显示为来电显示取决于服务提供商/运营商(主要是发起端的服务提供商/运营商)。
不,LCR 应用程序不会设置通道变量。它确实设置了一些自己的变量,最值得注意的是“auto_lcr_route”。它包含 LCR 调用的结果值。只有调用“BRIDGE”时才会设置通道变量。
这个问题在 (2) 中得到了回答 - 此阶段没有设置任何变量,除了“lcr_auto_route”。所以,这毕竟不是一个范围问题。
我解决这个问题的方法是从中提取“origination_caller_id_number”值lcr_自动路由使用正则表达式的变量值,如下所示:
<action application="lcr" data="$1" />
<action application="set" data="effective_caller_id_name=${regex(m:~${lcr_auto_route}~^(.*)origination_caller_id_number=(.*?)](.*)$~%2)}" />
<action application="bridge" data="${lcr_auto_route}" />
请注意,您需要使用 ~ 字符并在正则表达式前面加上“m:”(而不是通常的“|”),因为自动_lcr_route可能包含多个调用路由,以“|”字符分隔。