Pular para o conteúdo principal

Configuração do Dialplan e Roteamento de Chamadas

📖 Voltar à Documentação Principal

Guia abrangente para configuração de dialplan XML, lógica de roteamento de chamadas e variáveis de dialplan.

Documentação Relacionada

Documentação Principal

Fluxo de Processamento de Chamadas

Implementação de Serviços

  • ⚙️ Serviços Suplementares - Implementando encaminhamento de chamadas, bloqueio de CLI no dialplan
  • 📞 Correio de Voz - Roteamento de correio de voz e depósito/recuperação no dialplan
  • 🔊 Prompts TTS - Usando prompts no dialplan com reprodução

Monitoramento


Configuração de Dialplan / Roteamento de Chamadas

O TAS utiliza dialplans XML com um esquema compatível com formatos padrão de dialplan XML de telecomunicações, com variáveis preenchidas pelo TAS. Isso significa que você pode definir seu próprio dialplan conforme necessário, com a lógica de negócios para o operador, mas ter todos os dados necessários, como Dados do Repositório, informações de roteamento SS7, identidades IMPI / IMPU, normalização de dialplan, etc.

Os dialplans são escritos em priv/templates e têm a forma:

  • mo_dialplan.xml - Dialplan de Chamadas Originadas por Móvel
  • mo_emergency_dialplan.xml - Dialplan de Chamadas de Emergência Originadas por Móvel
  • mt_dialplan.xml - Dialplan de Chamadas Terminadas por Móvel

Você pode visualizar os Dialplans a partir da interface da Web.

Visão de Roteamento

Várias variáveis são definidas pelo TAS antes que o XML seja analisado, essas variáveis são impressas no log no início da chamada com seus valores atuais e são muito úteis ao definir sua própria lógica de chamadas.

Fundamentos do Dialplan XML do FreeSWITCH

O OmniTAS usa o mesmo sistema de roteamento de chamadas XML que o projeto FreeSWITCH, que permite um roteamento de chamadas flexível para atender às suas necessidades.

Esta seção explica os conceitos principais e fornece exemplos práticos.

Estrutura Básica

Um dialplan consiste em extensões contendo condições e ações:

<extension name="descrição-do-que-isso-faz">
<condition field="${variável}" expression="padrão-regex">
<action application="app_name" data="parâmetros"/>
<anti-action application="app_name" data="parâmetros"/>
</condition>
</extension>

Extensões são avaliadas em ordem de cima para baixo. Quando uma condição corresponde, suas ações são executadas.

Condições e Correspondência Regex

As condições testam variáveis contra expressões regulares. Se a regex corresponder, as ações são executadas; se não, as anti-ações são executadas.

Correspondência exata básica:

<condition field="${tas_destination_number}" expression="2222">
<action application="log" data="INFO Chamando número de acesso ao correio de voz"/>
</condition>

Correspondência de múltiplos números:

<condition field="${tas_destination_number}" expression="^(2222|3444|3445)$">
<action application="log" data="INFO Chamando serviço especial"/>
</condition>

Correspondência de padrão com grupos de captura:

<condition field="${tas_destination_number}" expression="^1(8[0-9]{9})$">
<!-- Corresponde a 1 seguido de 8 e mais 9 dígitos -->
<action application="log" data="INFO Correspondido número gratuito: $1"/>
<action application="bridge" data="sofia/gateway/trunk/${tas_destination_number}"/>
</condition>

Correspondência de prefixo:

<condition field="${tas_destination_number}" expression="^00">
<!-- Corresponde a qualquer número começando com 00 (internacional) -->
<action application="log" data="INFO Chamada internacional detectada"/>
</condition>

Correspondência de intervalo:

<condition field="${msisdn}" expression="^5551241[0-9]{4}$">
<!-- Corresponde a 55512410000 até 55512419999 -->
<action application="log" data="INFO Assinante no intervalo"/>
</condition>

Ações vs Anti-Ações

Ações são executadas quando uma condição corresponde. Anti-ações são executadas quando uma condição NÃO corresponde.

<condition field="${cli_withheld}" expression="true">
<!-- Executa se CLI for retido -->
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>

<!-- Executa se CLI NÃO for retido -->
<anti-action application="log" data="DEBUG CLI é normal"/>
<anti-action application="set" data="effective_caller_id_number=${msisdn}"/>
</condition>

O Atributo continue="true"

Por padrão, quando uma condição de extensão corresponde, o dialplan para de processar extensões adicionais. O atributo continue="true" permite que o processamento continue para a próxima extensão.

Sem continue (comportamento padrão):

<extension name="First-Check">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Processando chamada"/>
</condition>
</extension>

<extension name="Never-Reached">
<!-- Isso NUNCA é executado porque a extensão anterior correspondeu -->
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Isso não será impresso"/>
</condition>
</extension>

Com continue="true":

<extension name="Print-Vars" continue="true">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="info" data=""/>
</condition>
</extension>

<extension name="Check-Balance" continue="true">
<condition field="${hangup_case}" expression="OUTGOING_CALL_BARRED">
<action application="log" data="ERROR Saldo insuficiente"/>
<action application="hangup" data="${hangup_case}"/>
</condition>
</extension>

<extension name="Route-Call">
<!-- Esta extensão ainda é avaliada -->
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="bridge" data="sofia/gateway/trunk/${tas_destination_number}"/>
</condition>
</extension>

Use continue="true" para:

  • Extensões de registro/debug
  • Definir variáveis que se aplicam a vários cenários
  • Verificações de validação que não roteiam a chamada

Aplicações Comuns

controle de chamada

answer - Responder a chamada (enviar 200 OK)

<action application="answer" data=""/>

hangup - Terminar a chamada com uma causa específica

<action application="hangup" data="NORMAL_CLEARING"/>
<action application="hangup" data="USER_BUSY"/>
<action application="hangup" data="NO_ANSWER"/>

bridge - Conectar a chamada a outro destino

<!-- Conexão com gateway externo -->
<action application="bridge" data="sofia/gateway/trunk/+12125551234"/>

<!-- Conexão com extensão interna com preferências de codec -->
<action application="bridge" data="{absolute_codec_string=AMR-WB,AMR,PCMA}sofia/internal/sip:user@domain.com"/>

<!-- Conexão com tempo limite -->
<action application="bridge" data="{originate_timeout=30}sofia/gateway/trunk/${tas_destination_number}"/>
Variáveis e Dados de Canal

set - Definir uma variável de canal

<action application="set" data="my_variable=my_value"/>
<action application="set" data="sip_h_X-Custom-Header=CustomValue"/>
<action application="set" data="effective_caller_id_number=anonymous"/>

unset - Remover uma variável de canal

<action application="unset" data="sip_h_P-Asserted-Identity"/>

export - Definir variável e exportar para B-leg (chamada conectada)

<action application="export" data="sip_h_X-Account-Code=ABC123"/>
Mídia e Prompts

playback - Reproduzir um arquivo de áudio

<action application="playback" data="/sounds/en/us/callie/misc/8000/out_of_credit.wav"/>
<action application="playback" data="$${base_dir}/sounds/custom_prompt.wav"/>

sleep - Pausar por milissegundos especificados

<action application="sleep" data="1000"/>  <!-- Pausa por 1 segundo -->

echo - Ecoar áudio de volta para o chamador (teste)

<action application="echo" data=""/>

conference - Colocar a chamada em conferência

<action application="conference" data="room-${destination_number}@wideband"/>
correio de voz

voicemail - Acessar o sistema de correio de voz

<!-- Deixar correio de voz para caixa de correio -->
<action application="voicemail" data="default default ${msisdn}"/>

<!-- Verificar correio de voz com autenticação -->
<action application="voicemail" data="check auth default default ${msisdn}"/>
Registro e Depuração

log - Escrever no arquivo de log

<action application="log" data="INFO Processando chamada de ${msisdn}"/>
<action application="log" data="DEBUG Destino: ${tas_destination_number}"/>
<action application="log" data="ERROR Chamada falhou com causa: ${hangup_cause}"/>

info - Despejar todas as variáveis de canal no log

<action application="info" data=""/>
Aplicações Diversas

say - Leitura de número em texto-para-fala

<action application="say" data="en number iterated ${tas_destination_number}"/>

send_dtmf - Enviar tons DTMF

<action application="send_dtmf" data="1234#"/>

Exemplos Práticos

Roteamento de Serviços de Emergência:

<extension name="Emergency-911">
<condition field="${tas_destination_number}" expression="^(911|112)$">
<action application="log" data="ALERT Chamada de emergência de ${msisdn}"/>
<action application="answer" data=""/>
<action application="playback" data="/sounds/emergency_services_transfer.wav"/>
<action application="bridge" data="sofia/gateway/emergency_gw/${tas_destination_number}"/>
</condition>
</extension>

Roteamento Condicional Baseado em Saldo:

<extension name="Check-Credit">
<condition field="${hangup_case}" expression="OUTGOING_CALL_BARRED">
<action application="answer" data=""/>
<action application="playback" data="/sounds/out_of_credit.wav"/>
<action application="hangup" data="CALL_REJECTED"/>
</condition>
</extension>

Roteamento On-Net vs Off-Net:

<extension name="Route-Decision">
<condition field="${on_net_status}" expression="true">
<!-- On-net: roteamento de volta através do TAS -->
<action application="log" data="INFO Roteando para assinante on-net"/>
<action application="bridge" data="sofia/internal/+${tas_destination_number}@10.179.3.60"/>
<anti-action application="log" data="INFO Roteando off-net"/>
<anti-action application="bridge" data="sofia/gateway/trunk/+${tas_destination_number}"/>
</condition>
</extension>

Tratamento de CLI Anônima:

<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"/>
</condition>
</extension>

Correio de Voz em Caso de Não Resposta:

<extension name="Try-Bridge-Then-VM">
<condition field="${tas_destination_number}" expression="^(555124115\d{2})$">
<action application="set" data="call_timeout=30"/>
<action application="bridge" data="sofia/internal/${tas_destination_number}@domain.com"/>

<!-- Se a ponte falhar, vá para o correio de voz -->
<action application="log" data="INFO A ponte falhou, roteando para o correio de voz"/>
<action application="answer" data=""/>
<action application="voicemail" data="default default ${tas_destination_number}"/>
</condition>
</extension>

Roteamento de Intervalo de Números:

<extension name="Local-Numbers">
<condition field="${tas_destination_number}" expression="^([2-9]\d{2})$">
<!-- Extensões locais de 3 dígitos 200-999 -->
<action application="log" data="INFO Extensão local: $1"/>
<action application="bridge" data="sofia/internal/$1@pbx.local"/>
</condition>
</extension>

<extension name="National-Numbers">
<condition field="${tas_destination_number}" expression="^555\d{7}$">
<!-- Números móveis nacionais -->
<action application="log" data="INFO Chamada móvel nacional"/>
<action application="bridge" data="sofia/gateway/national_trunk/${tas_destination_number}"/>
</condition>
</extension>

<extension name="International">
<condition field="${tas_destination_number}" expression="^00\d+$">
<!-- Chamadas internacionais começando com 00 -->
<action application="log" data="INFO Chamada internacional"/>
<action application="bridge" data="sofia/gateway/intl_trunk/${tas_destination_number}"/>
</condition>
</extension>

Documentação Adicional

Para detalhes completos sobre cada aplicação:

O wiki do FreeSWITCH contém documentação detalhada para cada aplicação de dialplan, incluindo todos os parâmetros e casos de uso.

Variáveis de Dialplan

Variáveis definidas pelo TAS na lógica do dialplan XML:

Variáveis Comuns (Todos os Tipos de Chamada)

Configuração Inicial:

  • destination_number - número de destino traduzido
  • tas_destination_number - número de destino traduzido
  • effective_caller_id_number - número de origem traduzido

Chamadas de Emergência

  • hangup_case - "none"
  • ims_private_identity - identidade de usuário privada
  • ims_public_identity - identidade de usuário pública
  • msisdn - número do assinante (sem +)
  • imsi - IMSI da identidade privada
  • ims_domain - domínio da identidade privada

Chamadas MT (Terminadas por Móvel)

  • ims_private_identity - identidade de usuário privada
  • ims_public_identity - identidade de usuário pública
  • msisdn - número do assinante (sem +)
  • imsi - IMSI da identidade privada
  • ims_domain - domínio da identidade privada
  • call_forward_all_destination - destino CFA ou "none"
  • call_forward_not_reachable_destination - destino CFNRc
  • scscf_address - endereço S-CSCF ou "none"
  • scscf_domain - domínio S-CSCF ou "none"
  • no_reply_timer - tempo limite para nenhuma resposta
  • hangup_case - "none" ou "UNALLOCATED_NUMBER"
  • msrn - MSRN do PRN (se em roaming) ou número encaminhado do SRI (se o encaminhamento de chamadas estiver ativo)
  • tas_destination_number - Sobrescrição de destino de roteamento (definido para MSRN ou número encaminhado)

Chamadas MO (Originadas por Móvel)

  • hangup_case - "none", "OUTGOING_CALL_BARRED", ou "UNALLOCATED_NUMBER"
  • ims_private_identity - identidade de usuário privada
  • ims_public_identity - identidade de usuário pública
  • msisdn - número do assinante (sem +)
  • imsi - IMSI da identidade privada
  • ims_domain - domínio da identidade privada
  • allocated_time - tempo alocado pelo OCS (se a cobrança online estiver habilitada)
  • cli_withheld - string "true" ou "false"
  • on_net_status - string "true" ou "false" (se o destino está na rede)
  • msrn - MSRN para assinantes em roaming (se aplicável)
  • tas_destination_number - sobrescrição de MSRN (se em roaming)

Chamadas de Emergência

Chamadas de emergência são controladas através do parâmetro de configuração emergency_call_codes e são detectadas automaticamente durante a autorização da chamada.

Configuração

Configure os códigos de chamada de emergência em seu arquivo de configuração do TAS:

Parâmetros de configuração:

  • emergency_call_codes: Lista de números de serviços de emergência a serem detectados
  • Códigos comuns: "911" (EUA), "112" (UE), "000" (AU), "999" (Reino Unido), "sos"
  • Esses códigos são verificados além dos URNs de emergência SIP (por exemplo, <urn:service:sos>)
  • O sistema realiza comparação de correspondência exata contra o número de destino

Exemplo de valores de configuração:

  • Implantação nos EUA: ["911", "933"] - 911 para emergência, 933 para teste
  • Implantação europeia: ["112", "999"]
  • Implantação australiana: ["000", "106"] - 000 para emergência, 106 para relé de texto
  • Multi-região: ["911", "112", "000", "sos"]

Como Funciona a Detecção de Emergência

O sistema verifica duas condições:

  1. URN de Serviço de Emergência SIP URI: Detecta <urn:service:sos> ou qualquer URI contendo "service:sos"
  2. Correspondência de Número de Destino: Compara Caller-Destination-Number com os emergency_call_codes configurados

Se qualquer condição for verdadeira, a chamada é classificada como emergência.

Fluxo de Processamento

Detalhes do Fluxo de Chamadas:

  1. A chamada chega ao TAS
  2. O módulo de autorização verifica o destino contra os padrões de emergência
  3. Se emergência detectada:
    • O tipo de chamada é definido como :emergency
    • O template mo_emergency_dialplan.xml é usado
    • A autorização OCS é tipicamente ignorada
    • A chamada é roteada para o gateway PSAP
  4. As métricas são registradas com o rótulo call_type: emergency

Roteamento de Dialplan

Defina o roteamento para chamadas de emergência em priv/templates/mo_emergency_dialplan.xml. Este template determina como as chamadas são roteadas para seu gateway PSAP (Ponto de Resposta de Segurança Pública) ou URI SIP com base nos requisitos de seu mercado.

Exemplo de dialplan de emergência:

<extension name="Emergency-SOS">
<condition field="${destination_number}" expression="^(911|912|913|sos)$">
<action application="log" data="ALERT Chamada de emergência de ${msisdn}"/>
<action application="answer" data=""/>
<action application="bridge" data="sofia/gateway/psap_gw/${destination_number}"/>
</condition>
</extension>

Melhores Práticas

  • Sempre inclua "sos" em sua lista de códigos de emergência para compatibilidade com URN SIP
  • Inclua todos os números de emergência locais para sua jurisdição (por exemplo, 911, 112, 000, 999)
  • Teste o roteamento de emergência regularmente usando o Simulador de Chamadas
  • Ignore OCS para chamadas de emergência para garantir que sempre se conectem (configurado via skipped_regex)
  • Configure o gateway PSAP com alta disponibilidade e redundância
  • Monitore as métricas de chamadas de emergência para garantir a confiabilidade do sistema

Menus IVR permitem que os chamadores selecionem opções por meio de dígitos DTMF antes do roteamento. Os menus são definidos como arquivos XML e invocados a partir do dialplan usando a aplicação ivr.

Adicionando um Menu IVR

  1. Crie um arquivo XML em hosts/<environment>/group_vars/ivr_menus/:
<include>
<menu name="my_menu"
greet-long="$${base_dir}/sounds/en/us/callie/misc/8000/my_greeting.wav"
greet-short="$${base_dir}/sounds/en/us/callie/misc/8000/my_greeting.wav"
invalid-sound="silence_stream://250"
exit-sound=""
timeout="5000"
max-failures="1"
max-timeouts="1"
digit-len="1">

<!-- Cada dígito pode executar várias ações em sequência -->
<entry action="menu-exec-app" digits="1" param="playback $${base_dir}/sounds/option1.wav"/>
<entry action="menu-exec-app" digits="1" param="bridge sofia/internal/100@$${domain}"/>

<entry action="menu-exec-app" digits="2" param="playback $${base_dir}/sounds/option2.wav"/>
<entry action="menu-exec-app" digits="2" param="bridge sofia/internal/200@$${domain}"/>

<!-- Lidar com tempo limite e entrada inválida -->
<entry action="menu-exec-app" digits="timeout" param="bridge sofia/internal/default@$${domain}"/>
<entry action="menu-exec-app" digits="invalid" param="bridge sofia/internal/default@$${domain}"/>
</menu>
</include>
  1. Invocar o menu a partir do seu dialplan:
<extension name="my_ivr_extension">
<condition field="destination_number" expression="^1234$">
<action application="answer"/>
<action application="ivr" data="my_menu"/>
</condition>
</extension>
  1. Implantar via Ansible

Atributos do Menu

AtributoDescrição
nameIdentificador do menu usado na aplicação ivr do dialplan
greet-longArquivo de áudio reproduzido na primeira entrada
greet-shortArquivo de áudio reproduzido após entrada inválida
timeoutMilissegundos a esperar por entrada
max-failuresEntradas inválidas antes de acionar a ação invalid
max-timeoutsTimeouts antes de acionar a ação timeout
digit-lenNúmero de dígitos a coletar

Ações de Entrada

As entradas usam action="menu-exec-app" para executar aplicações de dialplan. Múltiplas entradas com o mesmo dígito são executadas em sequência:

Tipo de EntradaDescrição
digits="1"Executa quando o chamador pressiona 1
digits="timeout"Executa quando o chamador não pressiona nada
digits="invalid"Executa quando o chamador pressiona um dígito não reconhecido

Aplicações comuns: playback, bridge, transfer, hangup


Chamada Originada por Móvel para um Assinante Terminando por Móvel na Rede

Quando um assinante chama outro assinante na sua rede (chamada on-net), a abordagem adequada é roteá-la de volta através do TAS para processamento MT. Isso garante que a parte chamada receba o tratamento completo da chamada MT, incluindo encaminhamento de chamadas, correio de voz, roteamento MSRN para roaming e todos os outros serviços de assinante.

Por que Roteá-la de MO para MT?

Sem processamento MT (roteamento direto):

  • Configurações de encaminhamento de chamadas da parte chamada são ignoradas
  • Sem correio de voz em caso de não resposta
  • Sem roteamento MSRN para assinantes em roaming
  • Lógica de serviço de assinante ausente

Com processamento MT (rotear de volta para o TAS):

  • Suporte completo para encaminhamento de chamadas (CFU, CFB, CFNRy, CFNRc)
  • Correio de voz em ocupado/não resposta
  • Roteamento MSRN para assinantes em roaming CS
  • Experiência completa de serviço de assinante
  • Rastreamento adequado do estado da chamada para ambas as partes

Implementação

O dialplan MO verifica se o destino está na rede (servido pelo seu TAS) e, se sim, roteia a chamada de volta para o próprio TAS. O TAS recebe isso como uma nova chamada MT e a processa através do template mt_dialplan.xml.

Exemplo de trecho de dialplan:

<extension name="On-Net-Route">
<condition field="${on_net_status}" expression="true">
<action application="log" data="DEBUG Chamada MO On-Net - Roteando de volta para o TAS" />

<!-- Limpar cabeçalhos para roteamento interno -->
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_h_Request-Disposition=no-fork"/>

<!-- Roteamento de volta para o TAS (torna-se chamada MT) -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60,sip_invite_call_id=${sip_call_id}}sofia/internal/${tas_destination_number}@${sip_local_network_addr}" />
<action application="hangup" data="" />
</condition>
</extension>

Parâmetros chave:

  • ${sip_local_network_addr} - Endereço IP do TAS (por exemplo, 10.179.3.60)
  • ${tas_destination_number} - MSISDN da parte chamada
  • sip_invite_call_id=${sip_call_id} - Preserva o call-id para rastreamento
  • sip_copy_multipart=false - Impede a cópia de mensagens multipart
  • sip_h_Request-Disposition=no-fork - Garante o processamento sequencial

Fluxo de Chamadas:

Configuração Importante:

  • O IP do TAS (por exemplo, 10.179.3.60) deve estar na sua lista de configuração allowed_sbc_source_ips
  • Isso permite que o TAS receba chamadas de si mesmo para processamento MT
  • Sem isso, o TAS rejeitará a chamada como proveniente de uma fonte não autorizada

Uso do MSRN para Assinantes em Roaming 2G/3G

Quando um assinante está em roaming em uma rede de Circuito Comutado (CS) 2G/3G, o TAS deve obter um MSRN (Número de Roaming da Estação Móvel) para roteá-la para a localização atual do assinante. Esta seção explica como a recuperação e o roteamento do MSRN funcionam.

O que é MSRN?

MSRN (Número de Roaming da Estação Móvel) é um número de roteamento temporário atribuído pelo VLR (Registro de Localização do Visitante) da rede visitada para roteá-las para um assinante em roaming. Ele atua como um número de destino temporário que aponta para a localização atual do assinante na rede CS.

Fluxo de Recuperação do MSRN

O TAS recupera dados do MSRN via protocolo SS7 MAP (Mobile Application Part) usando um processo em duas etapas:

Detalhes da Implementação

Etapa 1: Enviar Informação de Roteamento (SRI)

O TAS consulta o HLR via SS7 MAP para obter informações de roteamento para o assinante chamado.

Cenários de Resposta SRI:

  1. MSRN diretamente no SRI - Assinante em roaming com MSRN já disponível

    • A resposta inclui: MSISDN, GMSC, IMSI e MSRN
    • Exemplo de MSRN: 61412345678 (formato de número móvel australiano)
  2. IMSI + número VLR - Assinante registrado na rede CS (requer PRN)

    • A resposta inclui: MSISDN, GMSC, IMSI e número MSC/VLR
    • Indica que o assinante está na rede CS, mas o MSRN deve ser solicitado
  3. IMSI apenas (sem VLR) - Assinante não na rede CS (apenas IMS/PS)

    • A resposta inclui: MSISDN, GMSC, IMSI
    • Indica que o assinante está registrado apenas em IMS/4G, não na rede CS
  4. Encaminhamento ativo - O SRI retorna informações de encaminhamento

    • A resposta inclui motivo de encaminhamento (incondicional, ocupado, sem resposta, não alcançável)
    • A resposta inclui número para o qual foi encaminhado

Etapa 2: Fornecer Número de Roaming (PRN) - Se Necessário

Se o SRI retornar IMSI + VLR, mas sem MSRN, o TAS envia uma solicitação PRN para o VLR para obter o MSRN.

O VLR aloca um MSRN temporário de seu pool e o retorna ao TAS. Este MSRN é válido apenas para esta configuração de chamada específica.

Exemplo de Resposta PRN: MSRN 61412345678

Variável de Dialplan: msrn

Uma vez que o MSRN é recuperado via SS7 MAP, ele é definido como uma variável de dialplan que pode ser usada no dialplan MT.

Variável: ${msrn}

  • Tipo: String (número E.164 sem o + inicial)
  • Exemplo: "61412345678" (formato móvel australiano)
  • Uso: Roteamento de chamadas para assinantes em roaming CS
  • Definido por: Processo de recuperação de dados do HLR durante o processamento de chamadas MT

Roteamento para MSRN em mt_dialplan.xml

A variável MSRN é usada no template de dialplan MT para roteamento de chamadas para assinantes em roaming.

Lógica do dialplan:

  1. Verificar MSRN: A extensão verifica se a variável msrn está definida (contém dígitos)
  2. Definir parâmetros de tempo limite:
    • Tempo limite de progresso: 10 segundos para receber mídia antecipada
    • Tempo limite de resposta da ponte: Usa o temporizador de não resposta configurado do assinante
  3. Conectar ao MSRN: Roteia a chamada para o MSRN via gateway CS
    • Usa ignore_early_media=ring_ready para toque consistente
    • Preferência de codec: AMR (móvel), PCMA/PCMU (linha fixa)
    • Gateway: sofia/gateway/CS_Gateway/+${msrn}
  4. Fallback em caso de falha: Se a conexão falhar, roteia para o destino de encaminhamento de chamadas

Exemplo de trecho de dialplan:

<extension name="Route-to-CS-MSRN" continue="false">
<condition field="msrn" expression="^(\d+)$">
<!-- Configurar tempos limite -->
<action application="set" data="progress_timeout=10" />
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />

<!-- Conectar ao MSRN via gateway CS -->
<action application="bridge"
data="{ignore_early_media=ring_ready,absolute_codec_string='AMR,PCMA,PCMU',continue_on_fail=true,originate_retries=1,originate_timeout=60}sofia/gateway/CS_Gateway/+${msrn}" />

<!-- Fallback para correio de voz/encaminhamento de chamadas -->
<action application="bridge"
data="sofia/internal/${call_forward_not_reachable_destination}@${local_ip_v4}" />
</condition>
</extension>

Pontos Chave

  1. MSRN é temporário - Válido apenas durante a configuração da chamada
  2. Rede CS apenas - MSRN é usado para roaming 2G/3G, não para roaming VoLTE/IMS
  3. Prioridade no fluxo MT - A verificação do MSRN ocorre antes do roteamento padrão IMS
  4. Fallback para encaminhamento - Se a conexão do MSRN falhar, roteia para o destino de encaminhamento de chamadas
  5. HLR substitui Sh - MSRN do HLR tem precedência sobre os dados do assinante Sh

Configuração

A integração SS7 MAP deve ser habilitada na configuração do TAS:

Configurações necessárias:

  • enabled: Definido como true para habilitar consultas SS7 MAP
  • http_map_server_url_base: URL do seu gateway SS7 MAP (por exemplo, "http://10.1.1.100:5001")
  • gmsc: Número do MSC Gateway para solicitações SRI/PRN (por exemplo, "61400000000")
  • timeout_ms: Tempo limite da consulta em milissegundos (padrão: 5000ms)

Veja Documentação SS7 MAP para detalhes completos de configuração.


Uso de Dados de Encaminhamento de Chamadas

As configurações de encaminhamento de chamadas determinam como as chamadas são roteadas quando o destino primário não está disponível. O TAS recupera dados de encaminhamento de chamadas de duas fontes: a interface Sh (HSS) e SS7 MAP (HLR), com os dados do HLR tendo precedência.

Tipos de Encaminhamento de Chamadas

O sistema suporta quatro tipos de encaminhamento de chamadas:

Tipo de EncaminhamentoVariávelQuando Ativo
Encaminhamento de Chamadas Incondicional (CFU)call_forward_all_destinationSempre encaminha todas as chamadas imediatamente
Encaminhamento de Chamadas Ocupado (CFB)call_forward_not_reachable_destinationLinha do assinante está ocupada
Encaminhamento de Chamadas Sem Resposta (CFNRy)call_forward_not_reachable_destinationAssinante não responde dentro do tempo limite
Encaminhamento de Chamadas Não Atingíveis (CFNRc)call_forward_not_reachable_destinationAssinante está inacessível/offline

Fontes de Dados

1. Interface Sh (HSS)

Configuração estática armazenada no perfil do assinante HSS.

O TAS recupera as configurações de encaminhamento de chamadas do HSS via interface Sh durante o processamento da chamada. Essas são as configurações provisionadas/padrão para o assinante.

Exemplo de dados recuperados:

  • call_forward_all_destination: destino CFU (por exemplo, "61412345678")
  • call_forward_not_reachable_destination: destino CFB/CFNRy/CFNRc (por exemplo, "61487654321")
  • no_reply_timer: segundos antes que CFNRy seja acionado (por exemplo, "20")

2. SS7 MAP (HLR)

Dados em tempo real do HLR, que podem diferir do HSS se o assinante alterou as configurações via códigos USSD/MMI (por exemplo, discando códigos *21*).

O TAS consulta o HLR via SS7 MAP durante a configuração da chamada para obter as configurações de encaminhamento atuais/ativas.

A resposta de encaminhamento do HLR inclui:

  • forwarded_to_number: O número de destino para encaminhamento (por exemplo, "61412345678")
  • reason: Tipo de encaminhamento (incondicional, ocupado, sem resposta, não alcançável)
  • notification flags: Se deve notificar a parte chamadora, a parte de encaminhamento, etc.

Mapeamento para variáveis de dialplan:

  • Se o motivo for incondicional → Define call_forward_all_destination
  • Se o motivo for ocupado, sem resposta ou não alcançável → Define call_forward_not_reachable_destination

Prioridade de Mesclagem de Variáveis

Os dados do HLR substituem os dados do Sh quando ambos estão presentes.

O TAS recupera dados do assinante de ambas as fontes durante o processamento de chamadas MT:

  1. Primeiro, recupera a configuração estática do HSS via interface Sh
  2. Em seguida, consulta o HLR via SS7 MAP para configurações em tempo real
  3. Mescla os dados, com os valores do HLR tendo precedência sobre os valores do Sh

Isso garante que as alterações recentes do assinante (via códigos USSD) sejam respeitadas, mesmo que o HSS ainda não tenha sido atualizado.

Variáveis de Dialplan

Disponíveis em chamadas MT:

VariávelTipoExemploDescrição
call_forward_all_destinationString"61412345678"Número de destino CFU
call_forward_not_reachable_destinationString"61487654321"Destino CFB/CFNRy/CFNRc
no_reply_timerString"20"Tempo limite em segundos para CFNRy

Valores padrão:

  • Se não configurado: "none" (string)
  • Verificar presença: Use regex ^(?!none$).* para corresponder a qualquer valor, exceto "none"

Encaminhamento de Chamadas em mt_dialplan.xml

Exemplo 1: Encaminhamento de Chamadas Incondicional (CFU)

Roteia TODAS as chamadas recebidas imediatamente para o destino de encaminhamento. O destino de encaminhamento é tipicamente um número off-net, portanto, usa um gateway externo.

Gateway usado: sofia/gateway/ExternalSIPGateway (seu gateway PSTN/interconexão)

Exemplo de template:

<extension name="Check-Call-Forward-All">
<condition field="${call_forward_all_destination}" expression="^(?!none$).*">
<action application="log" data="INFO Encaminhamento de Todas as Chamadas definido para redirecionar para ${call_forward_all_destination}" />

<!-- Definir cabeçalho History-Info para encaminhamento de chamadas -->
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />

<!-- Marcar call-id para indicar tipo de encaminhamento de chamada -->
<action application="set" data="sip_call_id=${sip_call_id};CALL_FORWARD_UNCONDITIONAL" />

<!-- Conectar ao destino de encaminhamento off-net -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60}sofia/gateway/ExternalSIPGateway/+${call_forward_all_destination}" />
</condition>
</extension>

Pontos chave:

  • Usa gateway externo porque o encaminhamento é tipicamente para número off-net
  • Marca call-id com ;CALL_FORWARD_UNCONDITIONAL para rastreamento
  • Define cabeçalho History-Info para identificar o número chamado original
  • Exemplo: Assinante 61412345678 tem CFU para 61487654321 - todas as chamadas encaminhadas imediatamente

Exemplo 2: Encaminhamento Sem Resposta/Não Atingível

Usado como fallback quando a ponte para o destino primário falha (assinante não responde, está ocupado ou inacessível).

Exemplo de trecho de dialplan:

<!-- Após a ponte para MSRN ou IMS falhar... -->
<action application="log" data="INFO Falha ao conectar a chamada - Roteando para o Destino de Encaminhamento Sem Resposta" />

<!-- Definir History-Info para indicar encaminhamento -->
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />

<!-- Roteamento para destino de encaminhamento -->
<action application="bridge"
data="{absolute_codec_string='AMR,PCMU,PCMA',originate_timeout=65}sofia/gateway/ExternalSIPGateway/${call_forward_not_reachable_destination}" />

Cenário de exemplo:

  • Assinante 61412345678 tem CFNRy para o número de correio de voz 61487654321
  • A chamada recebida tenta alcançar o assinante
  • Sem resposta após 20 segundos (no_reply_timer)
  • Chamada encaminhada para 61487654321 com cabeçalho History-Info preservando o destino original

Cabeçalho History-Info

O cabeçalho SIP History-Info rastreia o encaminhamento de chamadas:

<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />

Propósito:

  • Indica que a chamada era originalmente para ${destination_number}
  • Permite que sistemas downstream identifiquem chamadas encaminhadas
  • Usado por sistemas de correio de voz para depositar na caixa de correio correta

Exemplo no roteamento de correio de voz:

<extension name="Voicemail Route" continue="false">
<condition field="${tas_destination_number}" expression="^(555121|555122)$">
<!-- Extrair o número de telefone do History Info -->
<action application="set" data="history_info_value=${sip_i_history_info}"/>
<action application="log" data="DEBUG Chamado número de depósito de correio de voz para ${history_info_value}" />

<!-- Depositar correio de voz para a parte chamada ORIGINAL, não para o número do serviço de correio de voz -->
<action application="voicemail" data="default default ${history_info_value}"/>
</condition>
</extension>

Como funciona:

  • Números de serviço de correio de voz: 555121, 555122 (códigos curtos genéricos)
  • Quando a chamada é encaminhada para o correio de voz, o History-Info contém o destino original
  • O sistema de correio de voz extrai o número original do cabeçalho History-Info
  • O correio de voz é depositado na caixa de correio da parte chamada original, não no número do serviço de correio de voz

Melhores Práticas

  1. Sempre verifique "none" - Use regex ^(?!none$).* para evitar o roteamento para a string literal "none"
  2. Defina History-Info - Sempre defina ao encaminhar para rastreamento adequado da chamada
  3. Use continue_on_fail - Permita fallback para encaminhamento se a rota primária falhar
  4. Ajuste o formato CLI - Formatação de prefixo nacional vs internacional (veja a seção de Caller ID)
  5. Teste loops de encaminhamento - Garanta que os destinos de encaminhamento não criem loops de roteamento

Gerenciamento de Caller ID (CLI)

O TAS gerencia a apresentação e formatação da Identificação da Linha Chamadora (CLI) ao longo do fluxo da chamada, lidando com solicitações de privacidade, normalização de prefixos e requisitos de formatação específicos da rede.

Variáveis CLI

Variáveis principais de CLI nos dialplans:

VariávelUsoExemplo
msisdnNúmero do assinante (sem +)"61412345678"
effective_caller_id_numberNúmero do chamador exibido"+61412345678" ou "anonymous"
effective_caller_id_nameNome do chamador exibido"+61412345678" ou "anonymous"
origination_caller_id_numberCLI para o lado de saída"+61412345678"
caller_id_numberVariável padrão de CLI do FreeSWITCH"+61412345678"
sip_from_userParte do usuário do cabeçalho SIP From"0412345678" ou "+61412345678"
cli_withheldFlag de privacidade"true" ou "false" (string)
origination_privacyConfiguração de privacidade"hide_number"

Privacidade de CLI (Retido/Anônimo)

Métodos de Detecção

O TAS detecta solicitações de privacidade de CLI através de três métodos:

1. Prefixo Bloqueado no Número Discado

O assinante disca um prefixo antes do número de destino para bloquear sua ID de chamador.

Prefixos comuns:

  • *67 - Padrão norte-americano
  • #31# - Padrão europeu/GSM
  • 1831 - Formato alternativo

O TAS verifica se o número discado começa com qualquer prefixo de CLI bloqueado configurado. Se detectado, a variável cli_withheld é definida como "true".

Exemplo: O assinante disca *67555 1234 - o prefixo *67 é detectado e removido, a chamada prossegue para 5551234 com CLI retido.

2. Anônimo no Cabeçalho From

O equipamento do usuário (UE) define o nome do chamador como "anônimo" no cabeçalho SIP From.

O TAS verifica o campo Caller-Orig-Caller-ID-Name (não sensível a maiúsculas) para a string "anônimo". Se encontrado, cli_withheld é definido como "true".

3. Cabeçalhos de Privacidade SIP

O S-CSCF pode definir cabeçalhos Privacy: id no SIP INVITE, que são respeitados pelo dialplan.

Implementação do Dialplan

O dialplan verifica a variável cli_withheld e define todas as variáveis relacionadas ao CLI de acordo.

Exemplo de trecho de dialplan:

<extension name="Manage-Caller-ID" continue="true">
<condition field="${cli_withheld}" expression="true">
<!-- CLI é retido - definido como anônimo -->
<action application="log" data="DEBUG CLI retido detectado" />
<action application="set" data="effective_caller_id_name=anonymous" />
<action application="set" data="effective_caller_id_number=anonymous" />
<action application="set" data="origination_caller_id_number=anonymous" />
<action application="set" data="origination_privacy=hide_number" />

<!-- CLI NÃO é retido - usar MSISDN normal -->
<anti-action application="log" data="DEBUG CLI é normal (não retido)" />
<anti-action application="set" data="effective_caller_id_number=${msisdn}" />
</condition>
</extension>

Nota: Esta extensão usa continue="true" para que o processamento da chamada continue para extensões de roteamento, mesmo após o CLI ser definido.

Formato CLI: Nacional vs Internacional

Diferentes destinos podem exigir diferentes formatos de CLI, dependendo dos requisitos da sua rede.

Exemplo: Formato Nacional

Para chamadas nacionais dentro do seu país, você pode precisar apresentar o CLI sem o código do país.

Exemplo de trecho de dialplan (rede móvel australiana):

<extension name="Outgoing-Call-CLI-National" continue="true">
<condition field="${msisdn}" expression="^61(.*)$">
<action application="log" data="Definindo CLI de origem para $1 para nacional" />
<action application="set" data="effective_caller_id_number=$1"/> <!-- 0412345678 -->
<action application="set" data="effective_caller_id_name=$1"/>
<action application="set" data="sip_from_user=$1"/>
<action application="set" data="sip_cid_type=pid"/>
</condition>
</extension>

Como funciona:

  • Regex ^61(.*)$ captura tudo após o código do país 61
  • Entrada: msisdn="61412345678" → Saída: $1="412345678" ou "0412345678"
  • Apresenta o CLI no formato nacional para chamadas domésticas

Exemplo: Formato Internacional

Para chamadas internacionais, apresente o CLI no formato completo E.164 com prefixo +.

Exemplo de trecho de dialplan:

<extension name="Outgoing-Call-CLI-International" continue="true">
<condition field="${tas_destination_number}" expression="^61(.*)$">
<action application="log" data="A chamada é para nacional" />

<!-- A anti-ação é executada quando o destino NÃO é nacional -->
<anti-action application="log" data="Definindo CLI de origem para internacional" />
<anti-action application="set" data="effective_caller_id_number=+${msisdn}"/> <!-- +61412345678 -->
<anti-action application="set" data="effective_caller_id_name=+${msisdn}"/>
<anti-action application="set" data="sip_from_user=+${msisdn}"/>
<anti-action application="set" data="sip_cid_type=pid"/>
</condition>
</extension>

Como funciona:

  • A condição verifica se o destino começa com o prefixo nacional (por exemplo, 61 para a Austrália)
  • <anti-action> é executada quando a condição NÃO corresponde (chamada internacional)
  • Adiciona o prefixo + para o formato completo E.164 em chamadas internacionais

Formato CLI para Encaminhamento de Chamadas

Ao roteá-las para destinos de encaminhamento, você pode precisar ajustar o formato do CLI dependendo se está encaminhando para números on-net ou off-net.

Exemplo: Ajustando o prefixo CLI para o encaminhamento

<!-- Ajustar formato CLI se necessário para destino de encaminhamento -->
<action application="set" data="effective_caller_id_number=${effective_caller_id_number:3}"/>
<action application="set" data="effective_caller_id_name=${effective_caller_id_name:3}"/>

Fatiamento de String: ${variável:N} remove os primeiros N caracteres

  • Entrada: effective_caller_id_number="+61412345678" com :3 → Saída: "412345678"
  • Entrada: effective_caller_id_number="+61412345678" com :1 → Saída: "61412345678"

Casos de uso:

  • Remover + para encaminhamento nacional: Usar :1
  • Remover código do país para formato local: Usar deslocamento apropriado (:3 para +61, :2 para +1, etc.)

SIP P-Asserted-Identity (PAI)

A configuração sip_cid_type=pid controla como a ID do chamador é apresentada:

<action application="set" data="sip_cid_type=pid"/>

Efeito:

  • Define o cabeçalho SIP P-Asserted-Identity com informações do chamador
  • Usado para afirmação de ID de chamador em redes confiáveis
  • Padrão para redes IMS

Removendo Cabeçalhos Proprietários

Para evitar a divulgação de informações internas da rede, os dialplans devem remover cabeçalhos proprietários ou internos antes de rotearem chamadas para fora da rede.

Exemplo: Limpando cabeçalhos antes do roteamento externo

<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_copy_custom_headers=false"/>
<action application="unset" data="sip_h_P-Internal-Correlation-ID"/>
<action application="unset" data="sip_h_P-Access-Network-Info"/>
<!-- Adicione mais cabeçalhos específicos de fornecedor ou internos conforme necessário -->

Propósito:

  • Impede que dados de roteamento internos cheguem a redes externas
  • Remove cabeçalhos proprietários específicos de fornecedores
  • Prática recomendada de privacidade e segurança
  • Reduz o tamanho da mensagem SIP

Cabeçalhos comuns a serem removidos:

  • IDs de correlação/rastreamento internos
  • Informações da rede de acesso (podem revelar a topologia da rede)
  • Cabeçalhos P específicos de fornecedores
  • Cabeçalhos de aplicação personalizados destinados apenas para uso interno

Melhores Práticas

  1. Use continue="true" para extensões de CLI - Permite várias regras de formatação de CLI
  2. Defina sip_cid_type=pid - Necessário para conformidade com redes IMS
  3. Teste a retenção de CLI - Verifique se os prefixos *67 e #31# funcionam
  4. Formate conforme o destino - Formatação de CLI nacional vs internacional
  5. Remova cabeçalhos proprietários - Evite vazamento de dados internos
  6. Lide com anônimos de forma adequada - Tanto a exibição quanto o roteamento devem funcionar com CLI anônima

Conexão com Gateways

O TAS conecta chamadas a gateways externos (núcleo IMS, PSTN, etc.) usando a aplicação bridge do FreeSWITCH com parâmetros cuidadosamente configurados para negociação de codec, tratamento de tempo limite e lógica de repetição.

Configuração do Gateway

Os gateways são configurados como troncos SIP para sistemas externos. O TAS usa uma única interface SIP para todo o tráfego, com diferentes gateways definidos para diferentes destinos.

Exemplo de configuração de gateway:

<gateway name="CS_Gateway">
<param name="proxy" value="10.1.1.100:5060"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
<param name="extension-in-contact" value="true"/>
</gateway>

Veja Guia de Configuração para configuração completa do gateway.

Sintaxe de Bridge

As chamadas são conectadas a gateways usando a seguinte sintaxe:

Sintaxe básica:

<action application="bridge" data="sofia/gateway/NOME_DO_GATEWAY/NÚMERO_DE_DESTINO" />

Com parâmetros:

<action application="bridge" data="{param1=value1,param2=value2}sofia/gateway/NOME_DO_GATEWAY/NÚMERO_DE_DESTINO" />

Onde NOME_DO_GATEWAY é o nome do gateway definido em sua configuração (por exemplo, IMS_Core, PSTN_Primary, International_Gateway).

Parâmetros de Bridge

Seleção de Codec

absolute_codec_string - Lista de codecs priorizados para negociação:

<action application="bridge" data="{absolute_codec_string='AMR,PCMA,PCMU'}sofia/gateway/IMS_Gateway/+${msisdn}" />

Ordem de prioridade do codec:

  1. AMR (Adaptive Multi-Rate) - Otimizado para móveis, preferido para celulares
  2. PCMA (G.711 a-law) - Padrão de linha fixa na Europa/internacional
  3. PCMU (G.711 μ-law) - Padrão de linha fixa na América do Norte

Uso do template: priv/templates/mt_dialplan.xml:80, mo_dialplan.xml:124, mo_dialplan.xml:202

Configuração de Tempo Limite

originate_timeout - Máximo de segundos a esperar por resposta (inclui toque):

<action application="set" data="originate_timeout=60"/>
<action application="bridge" data="{originate_timeout=60}sofia/gateway/CS_Gateway/+${msisdn}" />

progress_timeout - Segundos a esperar por 180/183 (mídia antecipada/toque):

<action application="set" data="progress_timeout=10" />

bridge_answer_timeout - Segundos a esperar por 200 OK após o início do toque:

<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />

leg_progress_timeout - Tempo limite de progresso por perna:

<action application="set" data="leg_progress_timeout=${no_reply_timer}" />

Exemplo de template: priv/templates/mt_dialplan.xml:73-76

<action application="set" data="progress_timeout=10" />
<!-- Quanto tempo esperamos entre o INVITE e um 200 OK (incluindo TOCANDO) -->
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />

Variável: ${no_reply_timer} vem dos dados do assinante (tipicamente 20-30 segundos)

Lógica de Repetição e Tratamento de Falhas

originate_retries - Número de tentativas de repetição:

<action application="bridge" data="{originate_retries=1}sofia/gateway/CS_Gateway/+${msisdn}" />

continue_on_fail - Continuar a execução do dialplan após falha da ponte:

<action application="set" data="continue_on_fail=true" />
<action application="bridge" data="{continue_on_fail=true}sofia/gateway/CS_Gateway/+${msisdn}" />
<!-- Ações subsequentes são executadas se a ponte falhar -->
<action application="log" data="INFO A ponte falhou - roteando para correio de voz" />

hangup_after_bridge - Desconectar A-leg quando B-leg desligar:

<action application="set" data="hangup_after_bridge=true"/>

Tratamento de Mídia Antecipada

ignore_early_media - Controlar o comportamento da mídia antecipada:

<action application="set" data="ignore_early_media=ring_ready" />
<action application="bridge" data="{ignore_early_media=ring_ready}sofia/gateway/CS_Gateway/+${msisdn}" />

Opções:

  • ring_ready - Gera toque local, ignora mídia antecipada remota
  • true - Ignora completamente a mídia antecipada
  • false (padrão) - Passa pela mídia antecipada (anúncios, tons)

Por que usar ring_ready? - Impede que o chamador ouça anúncios ou tons de rede inesperados da rede remota

Exemplo de template: priv/templates/mt_dialplan.xml:78-79

<action application="set" data="ignore_early_media=ring_ready" />
<action application="bridge" data="{ignore_early_media=ring_ready,...}sofia/gateway/CS_Gateway/+${msrn}" />

Tratamento de chamadores on-net vs off-net:

<extension name="Route-to-IMS-Sub-Early-Media" continue="true">
<condition field="${on_net_caller}" expression="true">
<!-- Chamador on-net - usar ring_ready -->
<action application="log" data="INFO Chamador on-net ${effective_caller_id_number} - usando ignore_early_media=ring_ready"/>
<action application="set" data="ignore_early_media=ring_ready"/>

<!-- Chamador off-net - fornecer toque instantâneo -->
<anti-action application="log" data="INFO Chamador off-net ${effective_caller_id_number} - definindo toque instantâneo"/>
<anti-action application="set" data="instant_ringback=true"/>
<anti-action application="set" data="ringback=${fr-ring}"/>
<anti-action application="set" data="transfer_ringback=${fr-ring}"/>
</condition>
</extension>

Nota: A variável ${on_net_caller} é definida com base no plano de numeração do assinante da sua rede. Você também pode usar padrões regex para corresponder a seus intervalos de números específicos.

Parâmetros de Caller ID

sip_cid_type=pid - Usar P-Asserted-Identity para ID do chamador:

<action application="set" data="sip_cid_type=pid" />
<action application="bridge" data="{sip_cid_type=pid}sofia/gateway/CS_Gateway/+${msisdn}" />

Padrões Comuns de Bridge

Padrão 1: Roteamento para Assinante IMS via Domínio IMS

Roteia chamada MT para assinante IMS enviando para o domínio IMS (S-CSCF resolverá e roteará).

Exemplo de template:

<extension name="Route-to-IMS-Sub" continue="false">
<condition field="destination_number" expression="^(.*)$">
<action application="set" data="continue_on_fail=true" />
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="progress_timeout=10" />

<!-- Quanto tempo esperamos entre o INVITE e um 200 OK (incluindo TOCANDO) -->
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />

<!-- Enviar chamada para domínio IMS (S-CSCF resolve) -->
<action application="set" data="ignore_early_media=ring_ready" />
<action application="set" data="sip_cid_type=pid" />

<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',ignore_early_media=ring_ready,continue_on_fail=true,sip_cid_type=pid,originate_retries=1,originate_timeout=${no_reply_timer},sip_invite_call_id=${sip_call_id}}sofia/internal/${msisdn}@${ims_domain}" />

<!-- Fallback para encaminhamento se a ponte falhar -->
<action application="log" data="INFO Falha ao conectar a chamada - Roteando para o Destino de Encaminhamento Sem Resposta" />
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
<action application="set" data="sip_h_Diversion=<sip:${destination_number:2}@${ims_domain}>;reason=busy" />

<!-- Roteamento para gateway off-net para encaminhamento -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMU,PCMA',originate_timeout=65,originate_retries=0}sofia/gateway/ExternalSIPGateway/${call_forward_not_reachable_destination}" />
</condition>
</extension>

Pontos chave:

  • Roteia para ${msisdn}@${ims_domain} (por exemplo, 5551234567@ims.mnc380.mcc313.3gppnetwork.org)
  • O núcleo IMS (S-CSCF/I-CSCF) lida com o roteamento final para o assinante
  • ignore_early_media=ring_ready fornece toque consistente
  • Em caso de falha, usa gateway externo para encaminhamento off-net
  • Define cabeçalhos History-Info e Diversion para rastreamento de encaminhamento de chamadas

Padrão 2: Roteamento para MSRN (Roaming CS)

Roteia para assinante em roaming via rede CS:

Template: priv/templates/mt_dialplan.xml:67-80

<extension name="Route-to-CS-MSRN" continue="false">
<condition field="msrn" expression="^(\d+)$">
<action application="set" data="continue_on_fail=true" />
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="progress_timeout=10" />
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />

<!-- Enviar chamada para MSRN via Gateway -->
<action application="set" data="ignore_early_media=ring_ready" />
<action application="set" data="sip_cid_type=pid" />
<action application="bridge"
data="{ignore_early_media=ring_ready,absolute_codec_string='AMR,PCMA,PCMU',continue_on_fail=true,sip_cid_type=pid,originate_retries=1,originate_timeout=60}sofia/gateway/CS_Gateway/+${msrn}" />
</condition>
</extension>

Padrão 3: Roteamento On-Net (MO para MT via TAS)

Quando um assinante chama outro assinante on-net, a chamada deve ser roteada de volta para o TAS para processamento MT completo. Este padrão é crítico para garantir que chamadas on-net recebam o mesmo tratamento de serviço que chamadas externas MT.

Por que esse padrão é necessário:

Sem roteamento de volta para o TAS, chamadas on-net ignorariam completamente o processamento MT, o que significa:

  • Configurações de encaminhamento de chamadas seriam ignoradas
  • Sem correio de voz em caso de não resposta
  • Sem roteamento MSRN para assinantes em roaming
  • Lógica de serviço de assinante ausente
  • Rastreamento de chamadas e CDRs incompletos

Ao roteá-la de volta para o TAS como uma nova chamada MT, a parte chamada recebe tratamento completo de serviço.

Exemplo de template:

<extension name="On-Net-Route">
<condition field="${on_net_status}" expression="true">
<action application="log" data="DEBUG Chamada MO On-Net - Roteando de volta para o TAS" />

<!-- Limpar cabeçalhos para roteamento interno -->
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_h_Request-Disposition=no-fork"/>

<!-- Roteamento de volta para o TAS (torna-se chamada MT) -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60,sip_invite_call_id=${sip_call_id}}sofia/internal/${tas_destination_number}@${sip_local_network_addr}" />
<action application="hangup" data="" />
</condition>
</extension>

Como funciona:

  1. Chamada MO Chega: Assinante A chama Assinante B (ambos on-net)
  2. Verificar Status On-Net: O TAS determina que o destino está on-net através da variável ${on_net_status}
  3. **Roteamento para o