Configuração do Dialplan & 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 e monitoramento específicos do dialplan
- 📈 Referência de Métricas - Métricas gerais do sistema
Configuração do 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.
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="${variable}" expression="regex-pattern">
<action application="app_name" data="parameters"/>
<anti-action application="app_name" data="parameters"/>
</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
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 Correspondência de 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 que comece 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 dentro do 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 oculto -->
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>
<!-- Executa se CLI NÃO estiver oculto -->
<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 a condição de uma 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/debugging
- Definir 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 - Atender 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"/> <!-- Pausar 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 ID do Chamador Anônimo:
<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ões Regulares: 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 Chamadas)
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 o +)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 o +)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- Substituição de 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 o +)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á on-net)msrn- MSRN para assinantes em roaming (se aplicável)tas_destination_number- substituiçã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 automaticamente detectadas durante a autorização da chamada.
Configuração
Configure os códigos de chamada de emergência no seu arquivo config/runtime.exs:
config :tas,
emergency_call_codes: ["911", "912", "913", "sos"],
# ... outras configurações
Detalhes da Configuração:
emergency_call_codes(obrigatório): Lista de strings representando números de serviço de emergência- Esses códigos são verificados além dos 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
- Códigos comuns incluem: "911" (EUA), "112" (UE), "000" (AU), "999" (UK), "sos"
Como Funciona a Detecção de Emergência
A função Tas.Dialplan.Authorization.is_emergency_call?/2 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.
Referência de Código: Veja lib/dialplan/authorization.ex
Fluxo de Processamento
Detalhes do Fluxo de Chamadas:
- A chamada chega ao TAS
- O módulo de autorização verifica o destino contra 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
- Métricas são registradas com o rótulo
call_type: emergency
Roteamento do 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 Atendimento 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" na 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
- Ignorar 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
Chamada Originada por Móvel On-Net para um Assinante Terminando por Móvel On-Net
Você pode roteá-la do seu dialplan para o seu dialplan através de algo como isto:
<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}@10.179.3.60" />
Onde 10.179.3.60 é o IP do TAS (Está roteando a chamada de volta para o TAS) - Apenas certifique-se de que o IP do TAS esteja na sua lista allowed_sbc_source_ips.