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 - Implementando encaminhamento de chamadas, bloqueio de CLI no dialplan
- 📞 Correio de Voz - Roteamento de correio de voz e depósito/recuperação no dialplan
- 🔊 Prompts TTS - Usando prompts no dialplan com reprodução
Monitoramento
- 📊 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 preenchidas pelo TAS. Isso significa que você pode definir seu próprio dialplan conforme necessário, com a lógica de negócios para o operador, mas ter todos os dados necessários, como Dados do Repositório, informações de roteamento SS7, identidades IMPI / IMPU, normalização de dialplan, etc.
Os dialplans são escritos em priv/templates e têm a forma:
mo_dialplan.xml- Dialplan de Chamadas Originadas por Mó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 da 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
O OmniTAS usa o mesmo sistema de roteamento de chamadas XML que o projeto FreeSWITCH, que permite um roteamento de chamadas flexível para atender às suas necessidades.
Esta seção explica os conceitos principais e fornece exemplos práticos.
Estrutura Básica
Um dialplan consiste em extensões contendo condições e ações:
<extension name="descrição-do-que-isso-faz">
<condition field="${variável}" expression="padrão-regex">
<action application="app_name" data="parâmetros"/>
<anti-action application="app_name" data="parâmetros"/>
</condition>
</extension>
Extensões são avaliadas em ordem de cima para baixo. Quando uma condição corresponde, suas ações são executadas.
Condições e Correspondência Regex
As condições testam variáveis contra expressões regulares. Se a regex corresponder, as ações são executadas; se não, as anti-ações são executadas.
Correspondência exata básica:
<condition field="${tas_destination_number}" expression="2222">
<action application="log" data="INFO Chamando número de acesso ao correio de voz"/>
</condition>
Correspondência de múltiplos números:
<condition field="${tas_destination_number}" expression="^(2222|3444|3445)$">
<action application="log" data="INFO Chamando serviço especial"/>
</condition>
Correspondência de padrão com grupos de captura:
<condition field="${tas_destination_number}" expression="^1(8[0-9]{9})$">
<!-- Corresponde a 1 seguido de 8 e mais 9 dígitos -->
<action application="log" data="INFO Correspondido número gratuito: $1"/>
<action application="bridge" data="sofia/gateway/trunk/${tas_destination_number}"/>
</condition>
Correspondência de prefixo:
<condition field="${tas_destination_number}" expression="^00">
<!-- Corresponde a qualquer número começando com 00 (internacional) -->
<action application="log" data="INFO Chamada internacional detectada"/>
</condition>
Correspondência de intervalo:
<condition field="${msisdn}" expression="^5551241[0-9]{4}$">
<!-- Corresponde a 55512410000 até 55512419999 -->
<action application="log" data="INFO Assinante no intervalo"/>
</condition>
Ações vs Anti-Ações
Ações são executadas quando uma condição corresponde. Anti-ações são executadas quando uma condição NÃO corresponde.
<condition field="${cli_withheld}" expression="true">
<!-- Executa se CLI for retido -->
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>
<!-- Executa se CLI NÃO for retido -->
<anti-action application="log" data="DEBUG CLI é normal"/>
<anti-action application="set" data="effective_caller_id_number=${msisdn}"/>
</condition>
O Atributo continue="true"
Por padrão, quando uma condição de extensão corresponde, o dialplan para de processar extensões adicionais. O atributo continue="true" permite que o processamento continue para a próxima extensão.
Sem continue (comportamento padrão):
<extension name="First-Check">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Processando chamada"/>
</condition>
</extension>
<extension name="Never-Reached">
<!-- Isso NUNCA é executado porque a extensão anterior correspondeu -->
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Isso não será impresso"/>
</condition>
</extension>
Com continue="true":
<extension name="Print-Vars" continue="true">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="info" data=""/>
</condition>
</extension>
<extension name="Check-Balance" continue="true">
<condition field="${hangup_case}" expression="OUTGOING_CALL_BARRED">
<action application="log" data="ERROR Saldo insuficiente"/>
<action application="hangup" data="${hangup_case}"/>
</condition>
</extension>
<extension name="Route-Call">
<!-- Esta extensão ainda é avaliada -->
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="bridge" data="sofia/gateway/trunk/${tas_destination_number}"/>
</condition>
</extension>
Use continue="true" para:
- Extensões de registro/debug
- Definir variáveis que se aplicam a vários cenários
- Verificações de validação que não roteiam a chamada
Aplicações Comuns
controle de chamada
answer - Responder a chamada (enviar 200 OK)
<action application="answer" data=""/>
hangup - Terminar a chamada com uma causa específica
<action application="hangup" data="NORMAL_CLEARING"/>
<action application="hangup" data="USER_BUSY"/>
<action application="hangup" data="NO_ANSWER"/>
bridge - Conectar a chamada a outro destino
<!-- Conexão com gateway externo -->
<action application="bridge" data="sofia/gateway/trunk/+12125551234"/>
<!-- Conexão com extensão interna com preferências de codec -->
<action application="bridge" data="{absolute_codec_string=AMR-WB,AMR,PCMA}sofia/internal/sip:user@domain.com"/>
<!-- Conexão com tempo limite -->
<action application="bridge" data="{originate_timeout=30}sofia/gateway/trunk/${tas_destination_number}"/>
Variáveis e Dados de Canal
set - Definir uma variável de canal
<action application="set" data="my_variable=my_value"/>
<action application="set" data="sip_h_X-Custom-Header=CustomValue"/>
<action application="set" data="effective_caller_id_number=anonymous"/>
unset - Remover uma variável de canal
<action application="unset" data="sip_h_P-Asserted-Identity"/>
export - Definir variável e exportar para B-leg (chamada conectada)
<action application="export" data="sip_h_X-Account-Code=ABC123"/>
Mídia e Prompts
playback - Reproduzir um arquivo de áudio
<action application="playback" data="/sounds/en/us/callie/misc/8000/out_of_credit.wav"/>
<action application="playback" data="$${base_dir}/sounds/custom_prompt.wav"/>
sleep - Pausar por milissegundos especificados
<action application="sleep" data="1000"/> <!-- Pausa por 1 segundo -->
echo - Ecoar áudio de volta para o chamador (teste)
<action application="echo" data=""/>
conference - Colocar a chamada em conferência
<action application="conference" data="room-${destination_number}@wideband"/>
correio de voz
voicemail - Acessar o sistema de correio de voz
<!-- Deixar correio de voz para caixa de correio -->
<action application="voicemail" data="default default ${msisdn}"/>
<!-- Verificar correio de voz com autenticação -->
<action application="voicemail" data="check auth default default ${msisdn}"/>
Registro e Depuração
log - Escrever no arquivo de log
<action application="log" data="INFO Processando chamada de ${msisdn}"/>
<action application="log" data="DEBUG Destino: ${tas_destination_number}"/>
<action application="log" data="ERROR Chamada falhou com causa: ${hangup_cause}"/>
info - Despejar todas as variáveis de canal no log
<action application="info" data=""/>
Aplicações Diversas
say - Leitura de número em texto-para-fala
<action application="say" data="en number iterated ${tas_destination_number}"/>
send_dtmf - Enviar tons DTMF
<action application="send_dtmf" data="1234#"/>
Exemplos Práticos
Roteamento de Serviços de Emergência:
<extension name="Emergency-911">
<condition field="${tas_destination_number}" expression="^(911|112)$">
<action application="log" data="ALERT Chamada de emergência de ${msisdn}"/>
<action application="answer" data=""/>
<action application="playback" data="/sounds/emergency_services_transfer.wav"/>
<action application="bridge" data="sofia/gateway/emergency_gw/${tas_destination_number}"/>
</condition>
</extension>
Roteamento Condicional Baseado em Saldo:
<extension name="Check-Credit">
<condition field="${hangup_case}" expression="OUTGOING_CALL_BARRED">
<action application="answer" data=""/>
<action application="playback" data="/sounds/out_of_credit.wav"/>
<action application="hangup" data="CALL_REJECTED"/>
</condition>
</extension>
Roteamento On-Net vs Off-Net:
<extension name="Route-Decision">
<condition field="${on_net_status}" expression="true">
<!-- On-net: roteamento de volta através do TAS -->
<action application="log" data="INFO Roteando para assinante on-net"/>
<action application="bridge" data="sofia/internal/+${tas_destination_number}@10.179.3.60"/>
<anti-action application="log" data="INFO Roteando off-net"/>
<anti-action application="bridge" data="sofia/gateway/trunk/+${tas_destination_number}"/>
</condition>
</extension>
Tratamento de CLI Anônima:
<extension name="CLI-Privacy" continue="true">
<condition field="${cli_withheld}" expression="true">
<action application="set" data="effective_caller_id_name=anonymous"/>
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>
</condition>
</extension>
Correio de Voz em Caso de Não Resposta:
<extension name="Try-Bridge-Then-VM">
<condition field="${tas_destination_number}" expression="^(555124115\d{2})$">
<action application="set" data="call_timeout=30"/>
<action application="bridge" data="sofia/internal/${tas_destination_number}@domain.com"/>
<!-- Se a ponte falhar, vá para o correio de voz -->
<action application="log" data="INFO A ponte falhou, roteando para o correio de voz"/>
<action application="answer" data=""/>
<action application="voicemail" data="default default ${tas_destination_number}"/>
</condition>
</extension>
Roteamento de Intervalo de Números:
<extension name="Local-Numbers">
<condition field="${tas_destination_number}" expression="^([2-9]\d{2})$">
<!-- Extensões locais de 3 dígitos 200-999 -->
<action application="log" data="INFO Extensão local: $1"/>
<action application="bridge" data="sofia/internal/$1@pbx.local"/>
</condition>
</extension>
<extension name="National-Numbers">
<condition field="${tas_destination_number}" expression="^555\d{7}$">
<!-- Números móveis nacionais -->
<action application="log" data="INFO Chamada móvel nacional"/>
<action application="bridge" data="sofia/gateway/national_trunk/${tas_destination_number}"/>
</condition>
</extension>
<extension name="International">
<condition field="${tas_destination_number}" expression="^00\d+$">
<!-- Chamadas internacionais começando com 00 -->
<action application="log" data="INFO Chamada internacional"/>
<action application="bridge" data="sofia/gateway/intl_trunk/${tas_destination_number}"/>
</condition>
</extension>
Documentação Adicional
Para detalhes completos sobre cada aplicação:
- 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- tempo limite 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- Sobrescrição de destino de roteamento (definido para MSRN ou número encaminhado)
Chamadas MO (Originadas por Móvel)
hangup_case- "none", "OUTGOING_CALL_BARRED", ou "UNALLOCATED_NUMBER"ims_private_identity- identidade de usuário 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- sobrescrição de MSRN (se em roaming)
Chamadas de Emergência
Chamadas de emergência são controladas através do parâmetro de configuração emergency_call_codes e são detectadas automaticamente durante a autorização da chamada.
Configuração
Configure os códigos de chamada de emergência em seu arquivo de configuração do TAS:
Parâmetros de configuração:
emergency_call_codes: Lista de números de serviços de emergência a serem detectados- Códigos comuns: "911" (EUA), "112" (UE), "000" (AU), "999" (Reino Unido), "sos"
- Esses códigos são verificados além dos URNs de emergência SIP (por exemplo,
<urn:service:sos>) - O sistema realiza comparação de correspondência exata contra o número de destino
Exemplo de valores de configuração:
- Implantação nos EUA:
["911", "933"]- 911 para emergência, 933 para teste - Implantação europeia:
["112", "999"] - Implantação australiana:
["000", "106"]- 000 para emergência, 106 para relé de texto - Multi-região:
["911", "112", "000", "sos"]
Como Funciona a Detecção de Emergência
O sistema verifica duas condições:
- 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-Numbercom osemergency_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 emergência detectada:
- O tipo de chamada é definido como
:emergency - O template
mo_emergency_dialplan.xmlé usado - A autorização OCS é tipicamente ignorada
- A chamada é roteada para o gateway PSAP
- 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 gateway PSAP (Ponto de Resposta de Segurança Pública) ou URI SIP com base nos requisitos de seu mercado.
Exemplo de dialplan de emergência:
<extension name="Emergency-SOS">
<condition field="${destination_number}" expression="^(911|912|913|sos)$">
<action application="log" data="ALERT Chamada de emergência de ${msisdn}"/>
<action application="answer" data=""/>
<action application="bridge" data="sofia/gateway/psap_gw/${destination_number}"/>
</condition>
</extension>
Melhores Práticas
- Sempre inclua "sos" em sua lista de códigos de emergência para compatibilidade com URN SIP
- Inclua todos os números de emergência locais para sua jurisdição (por exemplo, 911, 112, 000, 999)
- Teste o roteamento de emergência regularmente usando o Simulador de Chamadas
- Ignore OCS para chamadas de emergência para garantir que sempre se conectem (configurado via
skipped_regex) - Configure o gateway PSAP com alta disponibilidade e redundância
- Monitore as métricas de chamadas de emergência para garantir a confiabilidade do sistema
Menus IVR
Menus IVR permitem que os chamadores selecionem opções por meio de dígitos DTMF antes do roteamento. Os menus são definidos como arquivos XML e invocados a partir do dialplan usando a aplicação ivr.
Adicionando um Menu IVR
- Crie um arquivo XML em
hosts/<environment>/group_vars/ivr_menus/:
<include>
<menu name="my_menu"
greet-long="$${base_dir}/sounds/en/us/callie/misc/8000/my_greeting.wav"
greet-short="$${base_dir}/sounds/en/us/callie/misc/8000/my_greeting.wav"
invalid-sound="silence_stream://250"
exit-sound=""
timeout="5000"
max-failures="1"
max-timeouts="1"
digit-len="1">
<!-- Cada dígito pode executar várias ações em sequência -->
<entry action="menu-exec-app" digits="1" param="playback $${base_dir}/sounds/option1.wav"/>
<entry action="menu-exec-app" digits="1" param="bridge sofia/internal/100@$${domain}"/>
<entry action="menu-exec-app" digits="2" param="playback $${base_dir}/sounds/option2.wav"/>
<entry action="menu-exec-app" digits="2" param="bridge sofia/internal/200@$${domain}"/>
<!-- Lidar com tempo limite e entrada inválida -->
<entry action="menu-exec-app" digits="timeout" param="bridge sofia/internal/default@$${domain}"/>
<entry action="menu-exec-app" digits="invalid" param="bridge sofia/internal/default@$${domain}"/>
</menu>
</include>
- Invocar o menu a partir do seu dialplan:
<extension name="my_ivr_extension">
<condition field="destination_number" expression="^1234$">
<action application="answer"/>
<action application="ivr" data="my_menu"/>
</condition>
</extension>
- Implantar via Ansible
Atributos do Menu
| Atributo | Descrição |
|---|---|
name | Identificador do menu usado na aplicação ivr do dialplan |
greet-long | Arquivo de áudio reproduzido na primeira entrada |
greet-short | Arquivo de áudio reproduzido após entrada inválida |
timeout | Milissegundos a esperar por entrada |
max-failures | Entradas inválidas antes de acionar a ação invalid |
max-timeouts | Timeouts antes de acionar a ação timeout |
digit-len | Número de dígitos a coletar |
Ações de Entrada
As entradas usam action="menu-exec-app" para executar aplicações de dialplan. Múltiplas entradas com o mesmo dígito são executadas em sequência:
| Tipo de Entrada | Descrição |
|---|---|
digits="1" | Executa quando o chamador pressiona 1 |
digits="timeout" | Executa quando o chamador não pressiona nada |
digits="invalid" | Executa quando o chamador pressiona um dígito não reconhecido |
Aplicações comuns: playback, bridge, transfer, hangup
Chamada Originada por Móvel para um Assinante Terminando por Móvel na Rede
Quando um assinante chama outro assinante na sua rede (chamada on-net), a abordagem adequada é roteá-la de volta através do TAS para processamento MT. Isso garante que a parte chamada receba o tratamento completo da chamada MT, incluindo encaminhamento de chamadas, correio de voz, roteamento MSRN para roaming e todos os outros serviços de assinante.
Por que Roteá-la de MO para MT?
Sem processamento MT (roteamento direto):
- Configurações de encaminhamento de chamadas da parte chamada são ignoradas
- Sem correio de voz em caso de não resposta
- Sem roteamento MSRN para assinantes em roaming
- Lógica de serviço de assinante ausente
Com processamento MT (rotear de volta para o TAS):
- Suporte completo para encaminhamento de chamadas (CFU, CFB, CFNRy, CFNRc)
- Correio de voz em ocupado/não resposta
- Roteamento MSRN para assinantes em roaming CS
- Experiência completa de serviço de assinante
- Rastreamento adequado do estado da chamada para ambas as partes
Implementação
O dialplan MO verifica se o destino está na rede (servido pelo seu TAS) e, se sim, roteia a chamada de volta para o próprio TAS. O TAS recebe isso como uma nova chamada MT e a processa através do template mt_dialplan.xml.
Exemplo de trecho de dialplan:
<extension name="On-Net-Route">
<condition field="${on_net_status}" expression="true">
<action application="log" data="DEBUG Chamada MO On-Net - Roteando de volta para o TAS" />
<!-- Limpar cabeçalhos para roteamento interno -->
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_h_Request-Disposition=no-fork"/>
<!-- Roteamento de volta para o TAS (torna-se chamada MT) -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60,sip_invite_call_id=${sip_call_id}}sofia/internal/${tas_destination_number}@${sip_local_network_addr}" />
<action application="hangup" data="" />
</condition>
</extension>
Parâmetros chave:
${sip_local_network_addr}- Endereço IP do TAS (por exemplo,10.179.3.60)${tas_destination_number}- MSISDN da parte 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 o processamento sequencial
Fluxo de Chamadas:
Configuração Importante:
- O IP do TAS (por exemplo,
10.179.3.60) deve estar na sua lista de configuraçã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 roteá-la para a localização atual do assinante. Esta seção explica como a recuperação e o roteamento do MSRN funcionam.
O que é MSRN?
MSRN (Número de Roaming da Estação Móvel) é um número de roteamento temporário atribuído pelo VLR (Registro de Localização do Visitante) da rede visitada para roteá-las para um assinante em roaming. Ele atua como um número de destino temporário que aponta para a localização atual do assinante na rede CS.
Fluxo de Recuperação do MSRN
O TAS recupera dados do MSRN via protocolo SS7 MAP (Mobile Application Part) usando um processo em duas etapas:
Detalhes da Implementação
Etapa 1: Enviar Informação de Roteamento (SRI)
O TAS consulta o HLR via SS7 MAP para obter informações de roteamento para o assinante chamado.
Cenários de Resposta SRI:
-
MSRN diretamente no SRI - Assinante em roaming com MSRN já disponível
- A resposta inclui: MSISDN, GMSC, IMSI e MSRN
- Exemplo de MSRN:
61412345678(formato de número móvel australiano)
-
IMSI + número VLR - Assinante registrado na rede CS (requer PRN)
- A resposta inclui: MSISDN, GMSC, IMSI e número MSC/VLR
- Indica que o assinante está na rede CS, mas o MSRN deve ser solicitado
-
IMSI apenas (sem VLR) - Assinante não na rede CS (apenas IMS/PS)
- A resposta inclui: MSISDN, GMSC, IMSI
- Indica que o assinante está registrado apenas em IMS/4G, não na rede CS
-
Encaminhamento ativo - O SRI retorna informações de encaminhamento
- A resposta inclui motivo de encaminhamento (incondicional, ocupado, sem resposta, não alcançável)
- A resposta inclui número para o qual foi encaminhado
Etapa 2: Fornecer Número de Roaming (PRN) - Se Necessário
Se o SRI retornar IMSI + VLR, mas sem MSRN, o TAS envia uma solicitação PRN para o VLR para obter o MSRN.
O VLR aloca um MSRN temporário de seu pool e o retorna ao TAS. Este MSRN é válido apenas para esta configuração de chamada específica.
Exemplo de Resposta PRN: MSRN 61412345678
Variável de Dialplan: msrn
Uma vez que o MSRN é recuperado via SS7 MAP, ele é definido como uma variável de dialplan que pode ser usada no dialplan MT.
Variável: ${msrn}
- Tipo: String (número E.164 sem o + inicial)
- Exemplo:
"61412345678"(formato móvel australiano) - Uso: Roteamento de chamadas para assinantes em roaming CS
- Definido por: Processo de recuperação de dados do HLR durante o processamento de chamadas MT
Roteamento para MSRN em mt_dialplan.xml
A variável MSRN é usada no template de dialplan MT para roteamento de chamadas para assinantes em roaming.
Lógica do dialplan:
- Verificar MSRN: A extensão verifica se a variável
msrnestá definida (contém dígitos) - Definir parâmetros de tempo limite:
- Tempo limite de progresso: 10 segundos para receber mídia antecipada
- Tempo limite de resposta da ponte: Usa o temporizador de não resposta configurado do assinante
- Conectar ao MSRN: Roteia a chamada para o MSRN via gateway CS
- Usa
ignore_early_media=ring_readypara 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 conexão falhar, roteia para o destino de encaminhamento de chamadas
Exemplo de trecho de dialplan:
<extension name="Route-to-CS-MSRN" continue="false">
<condition field="msrn" expression="^(\d+)$">
<!-- Configurar tempos limite -->
<action application="set" data="progress_timeout=10" />
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<!-- Conectar ao MSRN via gateway CS -->
<action application="bridge"
data="{ignore_early_media=ring_ready,absolute_codec_string='AMR,PCMA,PCMU',continue_on_fail=true,originate_retries=1,originate_timeout=60}sofia/gateway/CS_Gateway/+${msrn}" />
<!-- Fallback para correio de voz/encaminhamento de chamadas -->
<action application="bridge"
data="sofia/internal/${call_forward_not_reachable_destination}@${local_ip_v4}" />
</condition>
</extension>
Pontos Chave
- 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 padrão IMS
- Fallback para encaminhamento - Se a conexão do 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 Gateway para solicitações SRI/PRN (por exemplo,
"61400000000") - timeout_ms: Tempo limite da consulta em milissegundos (padrão: 5000ms)
Veja Documentação SS7 MAP para detalhes completos de configuração.
Uso de Dados de Encaminhamento de Chamadas
As configurações de encaminhamento de chamadas determinam como as chamadas são roteadas quando o destino primário não está disponível. O TAS recupera dados de encaminhamento de chamadas de duas fontes: a interface Sh (HSS) e SS7 MAP (HLR), com os dados do HLR tendo precedência.
Tipos de Encaminhamento de Chamadas
O sistema suporta quatro tipos de encaminhamento de chamadas:
| Tipo de 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 tempo limite |
| Encaminhamento de Chamadas Não Atingíveis (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 alcançável)
- notification flags: Se deve notificar a parte chamadora, a parte de encaminhamento, etc.
Mapeamento para variáveis de dialplan:
- Se o motivo for incondicional → Define
call_forward_all_destination - Se o motivo for ocupado, sem resposta ou não alcançável → Define
call_forward_not_reachable_destination
Prioridade de Mesclagem de Variáveis
Os dados do HLR substituem os dados do Sh quando ambos estão presentes.
O TAS recupera dados do assinante de ambas as fontes durante o processamento de chamadas MT:
- Primeiro, recupera a configuração estática do HSS via interface Sh
- Em seguida, consulta o HLR via SS7 MAP para configurações em tempo real
- Mescla os dados, com os valores do HLR tendo precedência sobre os valores do Sh
Isso garante que as alterações recentes do assinante (via códigos USSD) sejam respeitadas, mesmo que o HSS ainda não tenha sido atualizado.
Variáveis de Dialplan
Disponíveis em chamadas MT:
| Variá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" | Tempo limite em segundos para CFNRy |
Valores padrão:
- Se não configurado:
"none"(string) - Verificar presença: Use regex
^(?!none$).*para corresponder a qualquer valor, exceto "none"
Encaminhamento de Chamadas em mt_dialplan.xml
Exemplo 1: Encaminhamento de Chamadas Incondicional (CFU)
Roteia TODAS as chamadas recebidas imediatamente para o destino de encaminhamento. O destino de encaminhamento é tipicamente um número off-net, portanto, usa um gateway externo.
Gateway usado: sofia/gateway/ExternalSIPGateway (seu gateway PSTN/interconexão)
Exemplo de template:
<extension name="Check-Call-Forward-All">
<condition field="${call_forward_all_destination}" expression="^(?!none$).*">
<action application="log" data="INFO Encaminhamento de Todas as Chamadas definido para redirecionar para ${call_forward_all_destination}" />
<!-- Definir cabeçalho History-Info para encaminhamento de chamadas -->
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
<!-- Marcar call-id para indicar tipo de encaminhamento de chamada -->
<action application="set" data="sip_call_id=${sip_call_id};CALL_FORWARD_UNCONDITIONAL" />
<!-- Conectar ao destino de encaminhamento off-net -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60}sofia/gateway/ExternalSIPGateway/+${call_forward_all_destination}" />
</condition>
</extension>
Pontos chave:
- Usa gateway externo porque o encaminhamento é tipicamente para número off-net
- Marca call-id com
;CALL_FORWARD_UNCONDITIONALpara rastreamento - Define cabeçalho
History-Infopara identificar o número chamado original - Exemplo: Assinante
61412345678tem CFU para61487654321- todas as chamadas encaminhadas imediatamente
Exemplo 2: Encaminhamento Sem Resposta/Não Atingível
Usado como fallback quando a ponte para o destino primário falha (assinante não responde, está ocupado ou inacessível).
Exemplo de trecho de dialplan:
<!-- Após a ponte para MSRN ou IMS falhar... -->
<action application="log" data="INFO Falha ao conectar a chamada - Roteando para o Destino de Encaminhamento Sem Resposta" />
<!-- Definir History-Info para indicar encaminhamento -->
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
<!-- Roteamento para destino de encaminhamento -->
<action application="bridge"
data="{absolute_codec_string='AMR,PCMU,PCMA',originate_timeout=65}sofia/gateway/ExternalSIPGateway/${call_forward_not_reachable_destination}" />
Cenário de exemplo:
- Assinante
61412345678tem CFNRy para o número de correio de voz61487654321 - A 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 downstream identifiquem chamadas encaminhadas
- Usado por sistemas de correio de voz para depositar na caixa de correio correta
Exemplo no roteamento de correio de voz:
<extension name="Voicemail Route" continue="false">
<condition field="${tas_destination_number}" expression="^(555121|555122)$">
<!-- Extrair o número de telefone do History Info -->
<action application="set" data="history_info_value=${sip_i_history_info}"/>
<action application="log" data="DEBUG Chamado número de depósito de correio de voz para ${history_info_value}" />
<!-- Depositar correio de voz para a parte chamada ORIGINAL, não para o número do serviço de correio de voz -->
<action application="voicemail" data="default default ${history_info_value}"/>
</condition>
</extension>
Como funciona:
- Números de serviço de correio de voz:
555121,555122(códigos curtos genéricos) - Quando a chamada é encaminhada para o correio de voz, o History-Info contém o destino original
- O sistema de correio de voz extrai o número original do cabeçalho History-Info
- O correio de voz é depositado na caixa de correio da parte chamada original, não no número do serviço de correio de voz
Melhores Práticas
- Sempre verifique "none" - Use regex
^(?!none$).*para evitar o 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 CLI - Formatação de prefixo nacional vs internacional (veja a seção de Caller ID)
- Teste loops de encaminhamento - Garanta que os destinos de encaminhamento não criem loops de roteamento
Gerenciamento de Caller ID (CLI)
O TAS gerencia a apresentação e formatação da Identificação da Linha Chamadora (CLI) ao longo do fluxo da chamada, lidando com solicitações de privacidade, normalização de prefixos e requisitos de formatação específicos da rede.
Variáveis CLI
Variáveis principais de CLI nos dialplans:
| Variá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 ID 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 (não sensível a maiúsculas) para a string "anônimo". Se encontrado, cli_withheld é definido como "true".
3. Cabeçalhos de Privacidade SIP
O S-CSCF pode definir cabeçalhos Privacy: id no SIP INVITE, que são respeitados pelo dialplan.
Implementação do Dialplan
O dialplan verifica a variável cli_withheld e define todas as variáveis relacionadas ao CLI de acordo.
Exemplo de trecho de dialplan:
<extension name="Manage-Caller-ID" continue="true">
<condition field="${cli_withheld}" expression="true">
<!-- CLI é retido - definido como anônimo -->
<action application="log" data="DEBUG CLI retido detectado" />
<action application="set" data="effective_caller_id_name=anonymous" />
<action application="set" data="effective_caller_id_number=anonymous" />
<action application="set" data="origination_caller_id_number=anonymous" />
<action application="set" data="origination_privacy=hide_number" />
<!-- CLI NÃO é retido - usar MSISDN normal -->
<anti-action application="log" data="DEBUG CLI é normal (não retido)" />
<anti-action application="set" data="effective_caller_id_number=${msisdn}" />
</condition>
</extension>
Nota: Esta extensão usa continue="true" para que o processamento da chamada continue para extensões de roteamento, mesmo após o CLI ser definido.
Formato CLI: Nacional vs Internacional
Diferentes destinos podem exigir diferentes formatos de CLI, dependendo dos requisitos da sua rede.
Exemplo: Formato Nacional
Para chamadas nacionais dentro do seu país, você pode precisar apresentar o CLI sem o código do país.
Exemplo de trecho de dialplan (rede móvel australiana):
<extension name="Outgoing-Call-CLI-National" continue="true">
<condition field="${msisdn}" expression="^61(.*)$">
<action application="log" data="Definindo CLI de origem para $1 para nacional" />
<action application="set" data="effective_caller_id_number=$1"/> <!-- 0412345678 -->
<action application="set" data="effective_caller_id_name=$1"/>
<action application="set" data="sip_from_user=$1"/>
<action application="set" data="sip_cid_type=pid"/>
</condition>
</extension>
Como funciona:
- Regex
^61(.*)$captura tudo após o código do país61 - Entrada:
msisdn="61412345678"→ Saída:$1="412345678"ou"0412345678" - Apresenta o CLI no formato nacional para chamadas domésticas
Exemplo: Formato Internacional
Para chamadas internacionais, apresente o CLI no formato completo E.164 com prefixo +.
Exemplo de trecho de dialplan:
<extension name="Outgoing-Call-CLI-International" continue="true">
<condition field="${tas_destination_number}" expression="^61(.*)$">
<action application="log" data="A chamada é para nacional" />
<!-- A anti-ação é executada quando o destino NÃO é nacional -->
<anti-action application="log" data="Definindo CLI de origem para internacional" />
<anti-action application="set" data="effective_caller_id_number=+${msisdn}"/> <!-- +61412345678 -->
<anti-action application="set" data="effective_caller_id_name=+${msisdn}"/>
<anti-action application="set" data="sip_from_user=+${msisdn}"/>
<anti-action application="set" data="sip_cid_type=pid"/>
</condition>
</extension>
Como funciona:
- A condição verifica se o destino começa com o prefixo nacional (por exemplo,
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 CLI para Encaminhamento de Chamadas
Ao roteá-las para destinos de encaminhamento, você pode precisar ajustar o formato do CLI dependendo se está encaminhando para números on-net ou off-net.
Exemplo: Ajustando o prefixo CLI para o encaminhamento
<!-- Ajustar formato CLI se necessário para destino de encaminhamento -->
<action application="set" data="effective_caller_id_number=${effective_caller_id_number:3}"/>
<action application="set" data="effective_caller_id_name=${effective_caller_id_name:3}"/>
Fatiamento de String: ${variável:N} remove os primeiros N caracteres
- Entrada:
effective_caller_id_number="+61412345678"com:3→ Saída:"412345678" - Entrada:
effective_caller_id_number="+61412345678"com:1→ Saída:"61412345678"
Casos de uso:
- Remover
+para encaminhamento nacional: Usar:1 - Remover código do país para formato local: Usar deslocamento apropriado (
:3para+61,:2para+1, etc.)
SIP P-Asserted-Identity (PAI)
A configuração sip_cid_type=pid controla como a ID do chamador é apresentada:
<action application="set" data="sip_cid_type=pid"/>
Efeito:
- Define o cabeçalho SIP
P-Asserted-Identitycom informações do chamador - Usado para afirmação de ID de chamador em redes confiáveis
- Padrão para redes IMS
Removendo Cabeçalhos Proprietários
Para evitar a divulgação de informações internas da rede, os dialplans devem remover cabeçalhos proprietários ou internos antes de rotearem chamadas para fora da rede.
Exemplo: Limpando cabeçalhos antes do roteamento externo
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_copy_custom_headers=false"/>
<action application="unset" data="sip_h_P-Internal-Correlation-ID"/>
<action application="unset" data="sip_h_P-Access-Network-Info"/>
<!-- Adicione mais cabeçalhos específicos de fornecedor ou internos conforme necessário -->
Propósito:
- Impede que dados de roteamento internos cheguem a redes externas
- Remove cabeçalhos proprietários específicos de fornecedores
- Prática recomendada de privacidade e segurança
- Reduz o tamanho da mensagem SIP
Cabeçalhos comuns a serem removidos:
- IDs de correlação/rastreamento internos
- Informações da rede de acesso (podem revelar a topologia da rede)
- Cabeçalhos P específicos de fornecedores
- Cabeçalhos de aplicação personalizados destinados apenas para uso interno
Melhores Práticas
- Use
continue="true"para extensões de CLI - Permite várias regras de formatação de CLI - 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 conforme o 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
Conexão com Gateways
O TAS conecta chamadas a gateways externos (núcleo IMS, PSTN, etc.) usando a aplicação bridge do FreeSWITCH com parâmetros cuidadosamente configurados para negociação de codec, tratamento de tempo limite e lógica de repetição.
Configuração do Gateway
Os gateways são configurados como troncos SIP para sistemas externos. O TAS usa uma única interface SIP para todo o tráfego, com diferentes gateways definidos para diferentes destinos.
Exemplo de configuração de gateway:
<gateway name="CS_Gateway">
<param name="proxy" value="10.1.1.100:5060"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
<param name="extension-in-contact" value="true"/>
</gateway>
Veja Guia de Configuração para configuração completa do gateway.
Sintaxe de Bridge
As chamadas são conectadas a gateways usando a seguinte sintaxe:
Sintaxe básica:
<action application="bridge" data="sofia/gateway/NOME_DO_GATEWAY/NÚMERO_DE_DESTINO" />
Com parâmetros:
<action application="bridge" data="{param1=value1,param2=value2}sofia/gateway/NOME_DO_GATEWAY/NÚMERO_DE_DESTINO" />
Onde NOME_DO_GATEWAY é o nome do gateway definido em sua configuração (por exemplo, IMS_Core, PSTN_Primary, International_Gateway).
Parâmetros de Bridge
Seleção de Codec
absolute_codec_string - Lista de codecs priorizados para negociação:
<action application="bridge" data="{absolute_codec_string='AMR,PCMA,PCMU'}sofia/gateway/IMS_Gateway/+${msisdn}" />
Ordem de prioridade do codec:
- AMR (Adaptive Multi-Rate) - Otimizado para móveis, preferido para celulares
- 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 do template: priv/templates/mt_dialplan.xml:80, mo_dialplan.xml:124, mo_dialplan.xml:202
Configuração de Tempo Limite
originate_timeout - Máximo de segundos a esperar por resposta (inclui toque):
<action application="set" data="originate_timeout=60"/>
<action application="bridge" data="{originate_timeout=60}sofia/gateway/CS_Gateway/+${msisdn}" />
progress_timeout - Segundos a esperar por 180/183 (mídia antecipada/toque):
<action application="set" data="progress_timeout=10" />
bridge_answer_timeout - Segundos a esperar por 200 OK após o início do toque:
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
leg_progress_timeout - Tempo limite de progresso por perna:
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
Exemplo de template: priv/templates/mt_dialplan.xml:73-76
<action application="set" data="progress_timeout=10" />
<!-- Quanto tempo esperamos entre o INVITE e um 200 OK (incluindo TOCANDO) -->
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
Variável: ${no_reply_timer} vem dos dados do assinante (tipicamente 20-30 segundos)
Lógica de Repetição e Tratamento de Falhas
originate_retries - Número de tentativas de repetição:
<action application="bridge" data="{originate_retries=1}sofia/gateway/CS_Gateway/+${msisdn}" />
continue_on_fail - Continuar a execução do dialplan após falha da ponte:
<action application="set" data="continue_on_fail=true" />
<action application="bridge" data="{continue_on_fail=true}sofia/gateway/CS_Gateway/+${msisdn}" />
<!-- Ações subsequentes são executadas se a ponte falhar -->
<action application="log" data="INFO A ponte falhou - roteando para correio de voz" />
hangup_after_bridge - Desconectar A-leg quando B-leg desligar:
<action application="set" data="hangup_after_bridge=true"/>
Tratamento de Mídia Antecipada
ignore_early_media - Controlar o comportamento da mídia antecipada:
<action application="set" data="ignore_early_media=ring_ready" />
<action application="bridge" data="{ignore_early_media=ring_ready}sofia/gateway/CS_Gateway/+${msisdn}" />
Opções:
ring_ready- Gera toque local, ignora mídia antecipada remotatrue- Ignora completamente a mídia antecipadafalse(padrão) - Passa pela mídia antecipada (anúncios, tons)
Por que usar ring_ready? - Impede que o chamador ouça anúncios ou tons de rede inesperados da rede remota
Exemplo de template: priv/templates/mt_dialplan.xml:78-79
<action application="set" data="ignore_early_media=ring_ready" />
<action application="bridge" data="{ignore_early_media=ring_ready,...}sofia/gateway/CS_Gateway/+${msrn}" />
Tratamento de chamadores on-net vs off-net:
<extension name="Route-to-IMS-Sub-Early-Media" continue="true">
<condition field="${on_net_caller}" expression="true">
<!-- Chamador on-net - usar ring_ready -->
<action application="log" data="INFO Chamador on-net ${effective_caller_id_number} - usando ignore_early_media=ring_ready"/>
<action application="set" data="ignore_early_media=ring_ready"/>
<!-- Chamador off-net - fornecer toque instantâneo -->
<anti-action application="log" data="INFO Chamador off-net ${effective_caller_id_number} - definindo toque instantâneo"/>
<anti-action application="set" data="instant_ringback=true"/>
<anti-action application="set" data="ringback=${fr-ring}"/>
<anti-action application="set" data="transfer_ringback=${fr-ring}"/>
</condition>
</extension>
Nota: A variável ${on_net_caller} é definida com base no plano de numeração do assinante da sua rede. Você também pode usar padrões regex para corresponder a seus intervalos de números específicos.
Parâmetros de Caller ID
sip_cid_type=pid - Usar P-Asserted-Identity para ID do chamador:
<action application="set" data="sip_cid_type=pid" />
<action application="bridge" data="{sip_cid_type=pid}sofia/gateway/CS_Gateway/+${msisdn}" />
Padrões Comuns de Bridge
Padrão 1: Roteamento para Assinante IMS via Domínio IMS
Roteia chamada MT para assinante IMS enviando para o domínio IMS (S-CSCF resolverá e roteará).
Exemplo de template:
<extension name="Route-to-IMS-Sub" continue="false">
<condition field="destination_number" expression="^(.*)$">
<action application="set" data="continue_on_fail=true" />
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="progress_timeout=10" />
<!-- Quanto tempo esperamos entre o INVITE e um 200 OK (incluindo TOCANDO) -->
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
<!-- Enviar chamada para domínio IMS (S-CSCF resolve) -->
<action application="set" data="ignore_early_media=ring_ready" />
<action application="set" data="sip_cid_type=pid" />
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',ignore_early_media=ring_ready,continue_on_fail=true,sip_cid_type=pid,originate_retries=1,originate_timeout=${no_reply_timer},sip_invite_call_id=${sip_call_id}}sofia/internal/${msisdn}@${ims_domain}" />
<!-- Fallback para encaminhamento se a ponte falhar -->
<action application="log" data="INFO Falha ao conectar a chamada - Roteando para o Destino de Encaminhamento Sem Resposta" />
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
<action application="set" data="sip_h_Diversion=<sip:${destination_number:2}@${ims_domain}>;reason=busy" />
<!-- Roteamento para gateway off-net para encaminhamento -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMU,PCMA',originate_timeout=65,originate_retries=0}sofia/gateway/ExternalSIPGateway/${call_forward_not_reachable_destination}" />
</condition>
</extension>
Pontos chave:
- Roteia para
${msisdn}@${ims_domain}(por exemplo,5551234567@ims.mnc380.mcc313.3gppnetwork.org) - O núcleo IMS (S-CSCF/I-CSCF) lida com o roteamento final para o assinante
ignore_early_media=ring_readyfornece toque consistente- Em caso de falha, usa gateway externo para encaminhamento off-net
- Define cabeçalhos
History-InfoeDiversionpara rastreamento de encaminhamento de chamadas
Padrão 2: Roteamento para MSRN (Roaming CS)
Roteia para assinante em roaming via rede CS:
Template: priv/templates/mt_dialplan.xml:67-80
<extension name="Route-to-CS-MSRN" continue="false">
<condition field="msrn" expression="^(\d+)$">
<action application="set" data="continue_on_fail=true" />
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="progress_timeout=10" />
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
<!-- Enviar chamada para MSRN via Gateway -->
<action application="set" data="ignore_early_media=ring_ready" />
<action application="set" data="sip_cid_type=pid" />
<action application="bridge"
data="{ignore_early_media=ring_ready,absolute_codec_string='AMR,PCMA,PCMU',continue_on_fail=true,sip_cid_type=pid,originate_retries=1,originate_timeout=60}sofia/gateway/CS_Gateway/+${msrn}" />
</condition>
</extension>
Padrão 3: Roteamento On-Net (MO para MT via TAS)
Quando um assinante chama outro assinante on-net, a chamada deve ser roteada de volta para o TAS para processamento MT completo. Este padrão é crítico para garantir que chamadas on-net recebam o mesmo tratamento de serviço que chamadas externas MT.
Por que esse padrão é necessário:
Sem roteamento de volta para o TAS, chamadas on-net ignorariam completamente o processamento MT, o que significa:
- Configurações de encaminhamento de chamadas seriam ignoradas
- Sem correio de voz em caso de não resposta
- Sem roteamento MSRN para assinantes em roaming
- Lógica de serviço de assinante ausente
- Rastreamento de chamadas e CDRs incompletos
Ao roteá-la de volta para o TAS como uma nova chamada MT, a parte chamada recebe tratamento completo de serviço.
Exemplo de template:
<extension name="On-Net-Route">
<condition field="${on_net_status}" expression="true">
<action application="log" data="DEBUG Chamada MO On-Net - Roteando de volta para o TAS" />
<!-- Limpar cabeçalhos para roteamento interno -->
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_h_Request-Disposition=no-fork"/>
<!-- Roteamento de volta para o TAS (torna-se chamada MT) -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60,sip_invite_call_id=${sip_call_id}}sofia/internal/${tas_destination_number}@${sip_local_network_addr}" />
<action application="hangup" data="" />
</condition>
</extension>
Como funciona:
- 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} - **Roteamento para o