Freeswitch configura o identificador de chamadas com mod_lcr

1

Estou trabalhando para que o LCR (Least Cost Routing) funcione com o Freeswitch. Usando mod_lcr no Freeswitch 1.4.9. Eu configurei e está funcionando. Minha instalação é na verdade uma instância do FusionPBX, mas isso não importa para a discussão a seguir.

O problema é - eu quero definir o identificador de chamadas para rotas específicas (ou seja, dígitos) e estou usando regexes na coluna cid da tabela LCR, conforme a documentação.

Está funcionando, pois eu posso ver na saída e registra que isso define a variável "origination_caller_id_number". No entanto, o telefone de destino não mostra esse identificador de chamadas.

Além disso, se eu definir essa variável "origination_caller_id_number" no plano de discagem sem LCR, ela não será usada de maneira aparentemente aparente e o destinatário nunca a verá.

Se eu definir "effective_caller_id_name", o candidato a verá.

Em seguida, tentei: usar LCR no plano de discagem como aplicativo e, em seguida, definir effective_caller_id_name = $ {origination_caller_id_number}, que deveria ter sido definido pelo aplicativo LCR, depois chamar BRIDGE com a variável "auto_lcr_route".

Veja o XML aqui:

<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>

A chamada é completada com sucesso, mas não define o "effective_caller_id_name".

A seção "Log do aplicativo" dos dados do CDR do FusionPBX mostra

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

Como você pode ver neste log, o "origination_caller_id_number" DEVE ter sido definido após a execução do aplicativo LCR.

Parece que quando a LCR define "origination_caller_id_number", ela está em outro escopo e não pode ser recuperada do plano de discagem?

Então, há duas perguntas:

  1. Por que o identificador de chamadas não é exibido quando o aplicativo de ponte usa a variável "origination_caller_id_number"?

As chances são de que o provedor de telefone receptor pode não entender o que está sendo enviado, ou talvez use apenas "..._ nome" em vez de "..._ número" - mas mod_lcr só define essa variável - o que me leva ao segundo pergunta:

  1. A variável está realmente sendo definida executando o aplicativo LCR ou isso acontece apenas na execução de BRIDGE?

e

  1. Por que não consigo definir "effective_caller_id_name" recuperando o valor de "origination_caller_id_number"? aparentemente, o valor está sendo definido pelo aplicativo LCR, mas não consigo recuperá-lo do plano de discagem. A documentação do Freeswitch é muito nebulosa sobre questões de escopo - então isso é normal? Posso fazer algo para chegar a esse valor?
por nepdev 01.11.2016 / 20:05

1 resposta

0

Eu mesmo trabalhei.

Para responder às perguntas:

  1. O número mostrado como identificador de chamadas no telefone remoto depende do provedor de serviços / operadora (principalmente o do terminal de origem).

  2. Não, o aplicativo LCR não define as variáveis do canal. Ele define algumas variáveis próprias, sendo a mais notável "auto_lcr_route". Contém o valor do resultado da chamada LCR. Somente ao chamar "BRIDGE" as variáveis do canal serão definidas.

  3. Isso é respondido em (2) - nenhuma variável foi definida neste estágio, exceto "lcr_auto_route". Então, afinal, não é um problema de escopo.

A maneira como resolvi isso foi extrair o valor "origination_caller_id_number" do valor da variável lcr_auto_route com um regex, da seguinte forma:

<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}" />

Note que você precisa usar o caracter ~ ~ e prefixar o regex com "m:" (e não o usual "|") porque auto_lcr_route pode conter várias rotas de chamada separadas por um "|" personagem.

    
por 03.11.2016 / 15:19