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 - Implementação de 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 populadas 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 Web.

Visualizaçã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

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="nome_do_app" data="parâmetros"/>
<anti-action application="nome_do_app" 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 à caixa de correio"/>
</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 estiver retido -->
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>

<!-- Executa se CLI NÃO estiver 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="Primeira-Verificação">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Processando chamada"/>
</condition>
</extension>

<extension name="Nunca-Alcançado">
<!-- 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="Imprimir-Variáveis" continue="true">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="info" data=""/>
</condition>
</extension>

<extension name="Verificar-Saldo" 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="Roteamento-Chamada">
<!-- 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/debugging
  • Definição de variáveis que se aplicam a múltiplos cenários
  • Verificações de validação que não roteiam a chamada

Aplicações Comuns

controle de chamadas

answer - Responder a chamada (enviar 200 OK)

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

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

<!-- Ponte para gateway externo -->
<action application="bridge" data="sofia/gateway/trunk/+12125551234"/>

<!-- Ponte para 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"/>

<!-- Ponte com timeout -->
<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 em ponte)

<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 chamada em conferência

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

voicemail - Acessar 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: roteia 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 - timeout 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 - Sobrescrita do destino de roteamento (definido como 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 - sobrescrita 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 automaticamente detectadas durante a autorização da chamada.

Configuração

Configure os códigos de chamada de emergência no 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" (UK), "sos"
  • Esses códigos são verificados além das URNs de emergência SIP (por exemplo, <urn:service:sos>)
  • O sistema realiza uma 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 na Europa: ["112", "999"]
  • Implantação na Austrália: ["000", "106"] - 000 para emergência, 106 para retransmissão 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 contra 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 a emergência for 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 PSAP (Ponto de Resposta de Segurança Pública) ou URI SIP com base nos requisitos do 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 elas 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

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 é roteiar a chamada MO de volta através do TAS para processamento MT. Isso garante que a parte chamada receba o tratamento completo de chamada MT, incluindo encaminhamento de chamadas, correio de voz, roteamento MSRN para roaming e todos os outros serviços de assinante.

Por que Roteirizar MO para MT?

Sem processamento MT (roteamento direto):

  • As 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 caso de 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"/>

<!-- Roteia 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 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 roteiar a chamada recebida 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 roteiar chamadas 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

Passo 1: Enviar Informações 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

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

    • 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. Apenas IMSI (sem VLR) - Assinante não na rede CS (apenas IMS/PS)

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

    • Resposta inclui razão de encaminhamento (incondicional, ocupado, sem resposta, não acessível)
    • Resposta inclui número encaminhado

Passo 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 da chamada 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 de dialplan:

  1. Verificar MSRN: A extensão verifica se a variável msrn está definida (contém dígitos)
  2. Definir parâmetros de timeout:
    • Timeout de progresso: 10 segundos para receber mídia antecipada
    • Timeout de resposta da ponte: Usa o timer de não resposta configurado do assinante
  3. Ponte para MSRN: Roteia a chamada para MSRN via gateway CS
    • Usa ignore_early_media=ring_ready para um 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 ponte 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 timeouts -->
<action application="set" data="progress_timeout=10" />
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />

<!-- Ponte para 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 IMS padrão
  4. Fallback para encaminhamento - Se a ponte 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 de gateway para solicitações SRI/PRN (por exemplo, "61400000000")
  • timeout_ms: Timeout 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 timeout
Encaminhamento de Chamadas Não Acessível (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 acessível)
  • notification flags: Se deve notificar a parte chamadora, a parte de encaminhamento, etc.

Mapeamento para variáveis de dialplan:

  • Se a razão for incondicional → Define call_forward_all_destination
  • Se a razão for ocupado, sem resposta ou não acessí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 da chamada MT:

  1. Primeiro, recupera a configuração estática do HSS via interface Sh
  2. Em seguida, consulta o HLR via SS7 MAP para as 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 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"Timeout 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 Chamada Total 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" />

<!-- Ponte para 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 são imediatamente encaminhadas

Exemplo 2: Encaminhamento de Chamadas Sem Resposta/Não Acessí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 fazer a ponte - 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" />

<!-- Roteia 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
  • 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 a jusante 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 Chamando 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 de 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 de serviço de correio de voz

Melhores Práticas

  1. Sempre verifique "none" - Use regex ^(?!none$).* para evitar 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 de CLI - Formatação de prefixo nacional vs internacional (veja seção de CLI)
  5. Teste loops de encaminhamento - Certifique-se de que os destinos de encaminhamento não criem loops de roteamento

Gerenciamento de CLI (Identificação da Linha Chamadora)

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

Variáveis de 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 identificação 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 (sem distinção entre maiúsculas e minú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 à CLI de acordo.

Exemplo de trecho de dialplan:

<extension name="Manage-Caller-ID" continue="true">
<condition field="${cli_withheld}" expression="true">
<!-- CLI está 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 está 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 a definição da CLI.

Formato de 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, pode ser necessário apresentar a 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 CLI no formato nacional para chamadas domésticas

Exemplo: Formato Internacional

Para chamadas internacionais, apresente a 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 de CLI para Encaminhamento de Chamadas

Ao roteirizar para destinos de encaminhamento de chamadas, pode ser necessário ajustar o formato da CLI dependendo se o encaminhamento é para números on-net ou off-net.

Exemplo: Ajustando o prefixo da CLI para encaminhamento

<!-- Ajustar formato de 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 identificação do chamador é apresentada:

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

Efeito:

  • Define o cabeçalho SIP P-Asserted-Identity com as informações do chamador
  • Usado para afirmação de identificação 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 roteirizar chamadas off-net.

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
  • Melhor prática 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 ao uso interno

Melhores Práticas

  1. Use continue="true" para extensões de CLI - Permite que várias regras de formatação de CLI sejam aplicadas
  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 por 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

Ponte para Gateways

O TAS faz a ponte de chamadas para 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 timeout e lógica de retry.

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 a configuração completa do gateway.

Sintaxe da Ponte

As chamadas são ponteadas para 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 da Ponte

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 dos codecs:

  1. AMR (Adaptive Multi-Rate) - Otimizado para móvel, preferido para celular
  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 de template: priv/templates/mt_dialplan.xml:80, mo_dialplan.xml:124, mo_dialplan.xml:202

Configuração de Timeout

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/sonorização):

<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 - Timeout 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 RINGING) -->
<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 Retry e Tratamento de Falhas

originate_retries - Número de tentativas de retry:

<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 - Encerrar 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 - Gerar toque local, ignorar mídia antecipada remota
  • true - Ignorar completamente a mídia antecipada
  • false (padrão) - Passar pela mídia antecipada (anúncios, tons)

Por que usar ring_ready? - Impede que o chamador ouça anúncios ou tons 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 aos seus intervalos de números específicos.

Parâmetros de Identificação do Chamador

sip_cid_type=pid - Usar P-Asserted-Identity para identificação 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 Ponte

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

Roteie a chamada MT para o assinante IMS enviando para o domínio IMS (o 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 RINGING) -->
<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 fazer a ponte - 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" />

<!-- Roteia para gateway off-net para encaminhamento de chamadas -->
<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 de chamadas off-net
  • Define cabeçalhos History-Info e Diversion para rastreamento de encaminhamento de chamadas

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

Roteie para o 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 completo de MT. Este padrão é crítico para garantir que chamadas on-net recebam o mesmo tratamento de serviço que chamadas MT externas.

Por que este padrão é necessário:

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

  • As configurações de encaminhamento de chamadas não seriam respeitadas
  • 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

Roteando a chamada MO de volta para o TAS como uma nova chamada MT, a parte de destino 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"/>

<!-- Roteia 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. Roteia para o TAS: Ponte para sofia/internal/${tas_destination_number}@${sip_local_network_addr}
    • Usa o próprio endereço IP do TAS como destino
    • Preserva o call-id original para rastreamento
  4. Processamento MT: O TAS recebe a chamada como uma nova chamada MT e processa mt_dialplan.xml
    • Verifica as configurações de encaminhamento de chamadas (CFU, CFB, CFNRy, CFNRc)
    • Consulta o MSRN se o assinante estiver em roaming
    • Roteia para o domínio IMS ou encaminha conforme apropriado
  5. Serviço Completo: O assinante de destino recebe tratamento completo de MT

Pontos-chave:

  • Roteia para ${sip_local_network_addr} (endereço IP do TAS, por exemplo, 10.179.3.60)
  • A chamada é reprocessada como chamada MT para o assinante de destino
  • Preserva o call-id com o parâmetro sip_invite_call_id para rastreamento de ponta a ponta
  • Habilita todos os recursos MT: encaminhamento de chamadas, correio de voz, roteamento MSRN, serviços de assinante
  • Rastreamento adequado do estado da chamada e geração de CDR para ambas as partes
  • Chamadas on-net recebem tratamento de serviço idêntico a chamadas MT externas
  • O IP do TAS deve estar na lista de configuração allowed_sbc_source_ips

Variável: ${on_net_status} é definida como "true" quando o número de destino é servido pelo seu TAS. Isso é determinado durante a autorização da chamada MO verificando se o MSISDN de destino existe no seu banco de dados de assinantes.

Padrão 4: Roteamento Off-Net (MO para PSTN/Externo)

Roteie a chamada MO para a PSTN externa, interconexão ou outra rede externa via gateway.

Gateway usado: sofia/gateway/ExternalSIPGateway ou sofia/gateway/PSTN_Gateway

Exemplo de template:

<extension name="Outgoing-Call-Off-Net">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="Enviando chamada off-net" />

<!-- Limpar cabeçalhos antes do roteamento externo -->
<action application="set" data="sip_copy_multipart=false"/>

<!-- Definir hooks de evento de chamada para CDR/faturamento -->
<action application="set" data='api_body=caller=${msisdn}&called=${tas_destination_number}&call-id=${sip_i_call_id}&action=answer'/>
<action application="set" data='api_on_answer=curl http://localhost:8080/call_event content-type application/x-www-form-urlencoded post ${api_body}'/>
<action application="set" data='api_body=caller=${msisdn}&called=${tas_destination_number}&call-id=${sip_i_call_id}&action=hangup'/>
<action application="set" data='api_hangup_hook=curl http://localhost:8080/call_event content-type application/x-www-form-urlencoded post ${api_body}'/>

<!-- Definir P-Asserted-Identity para rede confiável -->
<action application="set" data="sip_h_Request-Disposition=no-fork"/>
<action application="set" data="sip_h_P