Freeswitch 使用 mod_lcr 配置呼叫者 ID

Freeswitch 使用 mod_lcr 配置呼叫者 ID

我正在努力让 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”时,它处于另一个范围内,无法从拨号计划中检索到?

因此有两个问题:

  1. 为什么桥接应用程序使用变量“origination_caller_id_number”时不显示呼叫者 ID?

接收电话提供商可能不理解所发送的内容,或者可能仅使用“..._name”而不是“..._number” - 但 mod_lcr 仅设置了这一个变量 - 这让我想到了第二个问题:

  1. 该变量是否实际上是通过运行 LCR 应用程序来设置的,还是仅在执行 BRIDGE 时才会发生这种情况?

  1. 为什么我无法通过检索“origination_caller_id_number”的值来设置“effective_caller_id_name”?该值显然是由 LCR 应用程序设置的,但我无法从拨号计划中检索它。Freeswitch 文档对范围问题非常模糊 - 那么这是正常的吗?我可以做些什么来获得该值吗?

答案1

我自己解决了。

回答以下问题:

  1. 该号码是否在远程电话上显示为来电显示取决于服务提供商/运营商(主要是发起端的服务提供商/运营商)。

  2. 不,LCR 应用程序不会设置通道变量。它确实设置了一些自己的变量,最值得注意的是“auto_lcr_route”。它包含 LCR 调用的结果值。只有调用“BRIDGE”时才会设置通道变量。

  3. 这个问题在 (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可能包含多个调用路由,以“|”字符分隔。

相关内容