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
- 📋 README Principal - Visão geral e início rápido
- 🔧 Guia de Configuração - Configuração de troncos SIP e gateways
- 🔧 Guia de Operações - Teste de dialplan e visualizador de templates
Fluxo de Processamento de Chamadas
- 🔢 Tradução de Números - Normalização E.164 (ocorre antes do dialplan)
- 👥 Interface Sh - Dados do assinante recuperados para variáveis de dialplan
- 📡 SS7 MAP - Dados MSRN/HLR em variáveis de dialplan
- 💳 Cobrança Online - Autorização OCS no fluxo 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
- 📊 Métricas de Dialplan - Métricas específicas de dialplan e monitoramento
- 📈 Referência de Métricas - Métricas gerais do sistema
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óvelmo_emergency_dialplan.xml- Dialplan de Chamadas de Emergência Originadas por Móvelmt_dialplan.xml- Dialplan de Chamadas Terminadas por Móvel
Você pode visualizar os Dialplans a partir da interface Web.

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:
- Documentação do Dialplan do FreeSWITCH: https://freeswitch.org/confluence/display/FREESWITCH/Dialplan
- FreeSWITCH mod_dptools: https://freeswitch.org/confluence/display/FREESWITCH/mod_dptools (referência completa de aplicações)
- Referência de Expressão Regular: https://freeswitch.org/confluence/display/FREESWITCH/Regular+Expression
- Variáveis de Canal: https://freeswitch.org/confluence/display/FREESWITCH/Channel+Variables
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 traduzidotas_destination_number- número de destino traduzidoeffective_caller_id_number- número de origem traduzido
Chamadas de Emergência
hangup_case- "none"ims_private_identity- identidade de usuário privadaims_public_identity- identidade de usuário públicamsisdn- número do assinante (sem +)imsi- IMSI da identidade privadaims_domain- domínio da identidade privada
Chamadas MT (Terminadas por Móvel)
ims_private_identity- identidade de usuário privadaims_public_identity- identidade de usuário públicamsisdn- número do assinante (sem +)imsi- IMSI da identidade privadaims_domain- domínio da identidade privadacall_forward_all_destination- destino CFA ou "none"call_forward_not_reachable_destination- destino CFNRcscscf_address- endereço S-CSCF ou "none"scscf_domain- domínio S-CSCF ou "none"no_reply_timer- timeout para nenhuma respostahangup_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 privadaims_public_identity- identidade de usuário públicamsisdn- número do assinante (sem +)imsi- IMSI da identidade privadaims_domain- domínio da identidade privadaallocated_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:
- URN de Serviço de Emergência SIP URI: Detecta
<urn:service:sos>ou qualquer URI contendo "service:sos" - Correspondência de Número de Destino: Compara
Caller-Destination-Numbercontraemergency_call_codesconfigurados
Se qualquer condição for verdadeira, a chamada é classificada como emergência.
Fluxo de Processamento
Detalhes do Fluxo de Chamadas:
- A chamada chega ao TAS
- O módulo de autorização verifica o destino contra os padrões de emergência
- 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
- O tipo de chamada é definido como
- 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 chamadasip_invite_call_id=${sip_call_id}- Preserva o call-id para rastreamentosip_copy_multipart=false- Impede a cópia de mensagens multipartsip_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çãoallowed_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:
-
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)
-
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
-
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
-
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:
- Verificar MSRN: A extensão verifica se a variável
msrnestá definida (contém dígitos) - 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
- Ponte para MSRN: Roteia a chamada para MSRN via gateway CS
- Usa
ignore_early_media=ring_readypara um toque consistente - Preferência de codec: AMR (móvel), PCMA/PCMU (linha fixa)
- Gateway:
sofia/gateway/CS_Gateway/+${msrn}
- Usa
- 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
- MSRN é temporário - Válido apenas durante a configuração da chamada
- Rede CS apenas - MSRN é usado para roaming 2G/3G, não para roaming VoLTE/IMS
- Prioridade no fluxo MT - A verificação do MSRN ocorre antes do roteamento IMS padrão
- Fallback para encaminhamento - Se a ponte MSRN falhar, roteia para o destino de encaminhamento de chamadas
- 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
truepara 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 Encaminhamento | Variável | Quando Ativo |
|---|---|---|
| Encaminhamento de Chamadas Incondicional (CFU) | call_forward_all_destination | Sempre encaminha todas as chamadas imediatamente |
| Encaminhamento de Chamadas Ocupado (CFB) | call_forward_not_reachable_destination | Linha do assinante está ocupada |
| Encaminhamento de Chamadas Sem Resposta (CFNRy) | call_forward_not_reachable_destination | Assinante não responde dentro do timeout |
| Encaminhamento de Chamadas Não Acessível (CFNRc) | call_forward_not_reachable_destination | Assinante 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:
- Primeiro, recupera a configuração estática do HSS via interface Sh
- Em seguida, consulta o HLR via SS7 MAP para as configurações em tempo real
- 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ável | Tipo | Exemplo | Descrição |
|---|---|---|---|
call_forward_all_destination | String | "61412345678" | Número de destino CFU |
call_forward_not_reachable_destination | String | "61487654321" | Destino CFB/CFNRy/CFNRc |
no_reply_timer | String | "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_UNCONDITIONALpara rastreamento - Define cabeçalho
History-Infopara identificar o número chamado original - Exemplo: Assinante
61412345678tem CFU para61487654321- 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
61412345678tem CFNRy para o número de correio de voz61487654321 - Chamada recebida tenta alcançar o assinante
- Sem resposta após 20 segundos (no_reply_timer)
- Chamada encaminhada para
61487654321com 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
- Sempre verifique "none" - Use regex
^(?!none$).*para evitar roteamento para a string literal "none" - Defina History-Info - Sempre defina ao encaminhar para rastreamento adequado da chamada
- Use continue_on_fail - Permita fallback para encaminhamento se a rota primária falhar
- Ajuste o formato de CLI - Formatação de prefixo nacional vs internacional (veja seção de CLI)
- 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ável | Uso | Exemplo |
|---|---|---|
msisdn | Número do assinante (sem +) | "61412345678" |
effective_caller_id_number | Número do chamador exibido | "+61412345678" ou "anonymous" |
effective_caller_id_name | Nome do chamador exibido | "+61412345678" ou "anonymous" |
origination_caller_id_number | CLI para o lado de saída | "+61412345678" |
caller_id_number | Variável padrão de CLI do FreeSWITCH | "+61412345678" |
sip_from_user | Parte do usuário do cabeçalho SIP From | "0412345678" ou "+61412345678" |
cli_withheld | Flag de privacidade | "true" ou "false" (string) |
origination_privacy | Configuraçã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/GSM1831- 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ís61 - 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,
61para 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 (
:3para+61,:2para+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-Identitycom 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
- Use
continue="true"para extensões de CLI - Permite que várias regras de formatação de CLI sejam aplicadas - Defina
sip_cid_type=pid- Necessário para conformidade com redes IMS - Teste a retenção de CLI - Verifique se os prefixos
*67e#31#funcionam - Formate por destino - Formatação de CLI nacional vs internacional
- Remova cabeçalhos proprietários - Evite vazamento de dados internos
- 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:
- AMR (Adaptive Multi-Rate) - Otimizado para móvel, preferido para celular
- PCMA (G.711 a-law) - Padrão de linha fixa na Europa/internacional
- 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 remotatrue- Ignorar completamente a mídia antecipadafalse(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_readyfornece toque consistente- Em caso de falha, usa gateway externo para encaminhamento de chamadas off-net
- Define cabeçalhos
History-InfoeDiversionpara 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:
- Chamada MO Chega: Assinante A chama Assinante B (ambos on-net)
- Verificar Status On-Net: O TAS determina que o destino está on-net através da variável
${on_net_status} - 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
- 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
- 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_idpara 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