• Nenhum resultado encontrado

O plano de discagem

No documento Introdução à Voz sobre IP e Asterisk (páginas 190-200)

\

\ O plano de discagem é a parte mais importante de um sistema Asterisk; \

\ O arquivo extensions.conf, localizado no diretório etc/asterisk, especifica o

plano de discagem;

\

\ O plano de discagem é composto por quatro elementos:

\ \ Contextos; \ \ Extensões; \ \ Prioridades; \ \ Aplicações.

O plano de discagem é considerado por muitos a parte mais importante de uma implementação de PABX. Nele são definidos a lógica de atendimento, os perfis e como cada chamada deve ser tratada. No Asterisk, o plano de discagem é definido no arquivo extensions.conf. Portanto, este é considerado o arquivo de configuração mais importante do Asterisk. Pode-se considerar que o plano de discagem consiste em uma lista de instruções que deverão ser seguidas pelo Asterisk.

No plano de discagem são implementadas instruções para:

\

\ Perfis dos ramais usuários do sistema; \

\ Roteamento de chamadas e os fatores sobre os quais as decisões serão

baseadas;

\

\ Variar o comportamento do sistema de acordo com o horário; \

\ Auto-atendimento; \

\ URA (Unidade de Resposta Audível) e filas para atendimento.

É possível separar o plano de discagem em quatro elementos: contextos, extensões, prioridades e aplicações.

Contextos

\

\ Os planos de discagem são divididos em seções chamadas contextos. \

\ Especificamos um contexto definindo um cabeçalho:

\

\ Colocamos seu nome entre colchetes [ ]; \ \ Exemplo: \ \ [meu_contexto] \ \ Exemplo: \ \ [gerente] e [funcionário]

Capítulo 6 – Plano de discagem

\

\ Usamos contextos para implementar um número importante de recursos, como:

\

\ Autenticação: solicitar senha para certas extensões; \

\ Segurança: podemos evitar que determinados usuários tenham acesso a certas funções que são vetadas a outros;

\

\ Privacidade: bloquear certas pessoas, por exemplo.

O plano de discagem é organizado de acordo com contextos. Os contextos são responsáveis por parte da segurança do plano de discagem. Com eles é possível definir diferentes perfis de utilização do sistema. Por exemplo, um gerente poderá fazer chamadas internacionais. Já um funcionário não poderá.

Os contextos estão ligados diretamente aos canais pelo arquivo de configuração de cada canal. Quando uma ligação entra no Asterisk por um canal, ela é direcionada para um contexto específico, identificado no arquivo de configuração deste canal. Da mesma forma, um ramal analógico, digital ou VoIP, pode ser “colocado” em um contexto específico na sua configuração.

Com a utilização de contextos é possível fazer com que o mesmo código se comporte de forma diferente, dependendo do perfil associado ao contexto. Por exemplo, dentro do contexto [gerente], quando o dígito 0 é discado, ouve-se o tom de discagem da rede pública. Dentro do contexto [funcionário], quando o dígito 0 é discado, é recebida uma gravação “ligação não autorizada”.

No arquivo extensions.conf., os contextos são delimitados simplesmente pela definição de outros contextos. Exemplo:

[primeiro_contexto] instrução01 instrução02 [segundo contexto] instrução01 instrução02

Os contextos servem principalmente para organizar o fluxo de cada chamada no plano de discagem. É possível configurar comportamentos diferentes para um mesmo número, dependendo de quem liga ou de que canal uma ligação é recebida. Também é possível controlar as permissões e perfis distintos para grupos de ramais ou usuários. Com a separação do plano de discagem em contextos, consegue-se criar ambientes

Introdução à V

oz sobre IP e Asterisk

Extensões

\

\ Os contextos são formados por extensões; \

\ Uma extensão é uma instrução que o Asterisk segue, acionada por uma

chamada de entrada ou por dígitos discados em um canal;

\

\ A declaração de uma extensão possui o seguinte formato:

\

\ exten=> número, prioridade, aplicação: \

\ Número ou nome da extensão; \

\ Prioridade; \

\ Aplicação.

\

\ As extensões seguem a forma:

\

\ exten=> nome, prioridade, aplicação()

\

\ Um exemplo prático de uma extensão poderia ser:

\

\ exten=1001,1,Answer() \

\ Neste exemplo, o nome da extensão é 1001, a prioridade é 1 e a aplicação é answer.

\

\ A extensão especial “s”:

\

\ Quando uma ligação entra em um contexto, sem estar destinada a uma extensão específica, ela é tratada automaticamente pela extensão “s”. Dentro de cada contexto se encontram as extensões. Uma extensão é uma regra ou instrução que deve ser seguida pelo Asterisk. Ações como atender ou desligar o canal, tocar um arquivo de áudio ou executar o tratamento de variáveis são instruções típicas das extensões.

A declaração de uma extensão possui o seguinte formato:

exten => EXTENSÃO, PRIORIDADE, APLICAÇÃO(OPÇÕES)

Os termos em letras maiúsculas serão abordados adiante. Os outros são fixos e fazem parte da sintaxe da declaração.

O Asterisk possui uma série de extensões especiais pré-definidas. São elas:

\

\ a – chamada quando o usuário pressiona * (asterisco) durante a mensagem

do voicemail;

\

\ h – extensão chamada após o desligamento; \

\ i – extensão inválida; \

Capítulo 6 – Plano de discagem

\

\ T – extensão chamada após o AbsoluteTimeout(); \

\ failed – usado se uma chamada auto-dial falhar; \

\ fax – usado para detecção de fax em canais zap; \

\ talk – usado conjuntamente com BackgroundDetect.

Fonte: www.voip-info.org/wiki/view/Asterisk+standard+extensions

Prioridades

\

\ As extensões podem ter vários passos; \

\ Chamamos estes passos de prioridades; \

\ Exemplo de extensão que atende a uma chamada e em seguida a desliga:

\

\ exten => 1001,1,Answer() \

\ exten => 1001,2,Hangup()

\

\ A prioridade “n” significa “próxima” (next).

Cada extensão normalmente possui mais de um comando (ou aplicação). Por isso foi definido o número de prioridade, que designa a ordem em que as aplicações devem ser executadas.

No exemplo seguinte (sem uma função prática), primeiro a chamada é atendida e logo depois desconectada:

exten => 1001,1,Answer() exten => 1001,2,Hangup()

Para facilitar a configuração, o Asterisk pode utilizar a prioridade n (next) para indicar o próximo número sequencial de prioridade. Neste caso, o exemplo ficaria:

exten => 1001,1,answer() exten => 1001,n,hangup()

Aplicações

\

\ As aplicações executam ações específicas nos canais; \ \ Exemplos de aplicações: \ \ Answer(); \ \ Playback()

Introdução à V

oz sobre IP e Asterisk

Answer()

A aplicação Answer() é utilizada para responder a um canal que está tocando. Ela faz a configuração inicial para que o canal receba uma ligação. É uma das

aplicações mais importantes, pois boa parte das outras aplicações necessita que o canal tenha sido configurado por Answer() para operar corretamente, por exemplo para executar um arquivo de som no canal. Esta aplicação não recebe argumentos.

Playback()

Utilizada para reproduzir um arquivo de som sobre o canal. Recebe o nome do arquivo de som como argumento. Para facilitar o uso desta aplicação, existe um diretório padrão, var/lib/asterisk/sounds/, onde todos os sons do Asterisk se encontram. Assim não precisamos especificar o caminho completo ao utilizar a aplicação. Este caminho pode ser modificado no arquivo asterisk.conf.

Hangup()

Simplesmente desliga um canal ativo e desaloca os recursos computacionais que estavam sendo utilizados na chamada. Não recebe argumentos.

extensions.conf

\

\ Os dois primeiros cabeçalhos que encontramos no arquivo extensions.conf —

[general] e [globals] — são especiais e chamados de seções;

\

\ Seções que encontramos no arquivo:

\

\ [general] \

\ [globals]

Os dois primeiros contextos do arquivo extensions.conf são seções especiais.

[general]

São declaradas opções gerais sobre o plano de discagem.

Por enquanto, duas opções importantes são static e writeprotect, que especificam se o arquivo extensions.conf pode ser modificado pelo plano de discagem

dinamicamente no Asterisk. É uma boa escolha trocar o parâmetro para

writeprotect=yes, que evita que o plano de discagem seja modificado pelo comando save dialplan, na linha de comando do Asterisk.

[globals]

Na seção [globals] podemos definir e iniciar as variáveis globais com seus respectivos valores. Da mesma forma que em programas de computadores, normalmente as variáveis globais são utilizadas para simplificar mudanças na configuração do sistema. Na prática, estas variáveis são utilizadas como constantes.

Capítulo 6 – Plano de discagem

Variáveis

\

\ Valores de variáveis são obtidos com a seguinte sintaxe:

\

\ ${nomedavariavel}

\

\ Variáveis podem ser:

\ \ Globais; \ \ De ambiente; \ \ Associadas a um canal. \ \ Variáveis globais: \

\ São configuradas na classe [globals] ou utilizando o comando SetGlobalVar; \

\ Uma vez definidas, podem ser referenciadas a qualquer momento.

\

\ Variáveis de ambiente:

\

\ Servem para acessar as variáveis de ambiente do sistema operacional; \

\ Podemos fazer referência às variáveis de ambiente da seguinte forma: \

\ ${ENV(nomedavariavel)}

\

\ Variáveis de canal:

\

\ Configuradas com o comando Set(), antigo SetVar; \

\ Têm um escopo local restrito ao canal em que foram criadas. São destruídas quando o canal é encerrado, para liberar memória;

\

\ Algumas variáveis de canal são predefinidas e podem ser referenciadas no plano de discagem.

As variáveis são declaradas e têm seus valores atribuídos como abaixo:

RINGTIME=>3

Define quanto tempo (em segundos) vai tocar antes de executar a próxima aplicação.

VMANNOUCE=>mysounds/my-vm-annouce

Define qual arquivo de áudio usar quando anunciar o voicemail.

RAMAL01=>Zap/2

Define o canal associado à extensão. As variáveis globais não são “case sensitive”. A utilização de caixa-alta é mera convenção.

Introdução à V oz sobre IP e Asterisk Exemplo: exten => 1,1, answer() exten => 1,n, Dial(${RAMAL01}) exten => 1,n, hangup()

Também é possível declarar uma variável global durante o fluxo de uma chamada, utilizando a aplicação SetGlobalVar() no plano de discagem. Por exemplo:

[contexto1] exten => 123,1, Answer() exten => 123,n, SetGlobalVar(saidaPadrao=Zap/2) exten => 123,n,GoTo(contexto2,456,1) [contexto2] exten => 456,1, Dial(${saidaPadrao}) exten => 456,n, hangup()

${ENV(ASTERISK_PROMPT)}: Prompt atual da linha de comando do CLI do

Asterisk

${ENV(RECORDED_FILE)}: Último arquivo gravado com o comando Record

O Asterisk pode usar uma série de variáveis como argumentos das aplicações ou comandos. Podem ser do tipo Global, Compartilhada, De canal ou De ambiente. Variáveis também podem ser manipuladas (cortadas, somadas, concatenadas). Variáveis de ambiente oferecem um meio de resgatar via Asterisk as variáveis de ambiente Unix.

Mais informações sobre as variáveis do Asterisk em:

www.voip-info.org/wiki/view/Asterisk+variables

Cada canal no Asterisk possui seu próprio espaço para variáveis. Elas podem ser definidas dinamicamente através do plano de discagem, pelo comando Set() — antigo SetVar. Variáveis de canal são destruídas e seu espaço na memória é desalocado quando a chamada termina, quando o comando Hangup() é executado. Algumas variáveis de canal predefinidas no Asterisk podem ser utilizadas pelo plano de discagem, como veremos a seguir.

Capítulo 6 – Plano de discagem

Variáveis predefinidas

\

\ Exemplos de variáveis de canal predefinidas:

\

\ ${ACCOUNTCODE}: código de contabilização; \

\ ${ANSWERDTIME}: horário em que a chamada foi atendida; \

\ ${CALLERID}: identificador da chamada; \

\ ${CHANNEL}: nome do canal atual; \

\ ${CONTEXT}: nome do contexto atual; \

\ ${DIALEDPEERNAME}: nome de quem foi chamado; \

\ ${DIALEDPEERNUMBER}: número de quem foi chamado; \

\ ${DIALEDTIME}: hora em que o número foi discado; \

\ ${EXTEN}: extensão atual (nome da extensão atual); \

\ ${PRIORITY}: prioridade atual.

A variável ${EXTEN} é talvez a variável de canal mais utilizada nos planos de discagem. Ela contém o número da extensão corrente e pode simplificar e facilitar significativamente a configuração do Asterisk.

Existem diversas variáveis no Asterisk. O aluno pode visitar a documentação on-line para conhecer a lista completa.

Expressões

\

\ As expressões utilizam variáveis, valores e operadores para retornar resultados

que são utilizados no plano de discagem;

\

\ Uma expressão segue a seguinte sintaxe:

\

\ $[expressão]

\

\ Um exemplo de expressão poderia ser:

\

\ $[${nomedavariavel}+200]

Os argumentos dos comandos podem ser calculados dinamicamente na hora em que serão utilizados.

Introdução à V

oz sobre IP e Asterisk

Por exemplo, a linha

exten => 2112345678,n, dial(ZAP/g1/${EXTEN:2})

Irá chamar o número 12345678 no canal ZAP/g1, cortando os dois primeiros algarismos: “21”.

No exemplo abaixo temos uma variável referenciada com seu valor somado ao valor 200.

$[${nomedavariavel}+200]

Operadores

\

\ Existem basicamente três tipos de operadores que podem ser utilizados nas

expressões: \ \ Matemáticos: \ \ + \ \ - \ \ / \ \ % \ \ Lógicos: \ \ & \ \ | \

\ Operador para expressões regulares: \

\ “:” (dois pontos)

Funções dos operadores apresentados:

\

\ + – soma um número a outro \

\ - – subtrai um número de outro \

\ / – retorna o resultado da divisão de dois números \

\ % – retorna o resto da divisão de dois números \

\ & – “E” lógico \

\ | – “OU” lógico \

\ : – utilizado para produzir substrings. ${STRING:início:comprimento}

Capítulo 6 – Plano de discagem

Padrões de extensão

\

\ Os seguintes caracteres são exemplos de padrões:

\ \ X – dígitos de 0 até 9; \ \ Z – dígitos de 1 até 9; \ \ N – dígitos de 2 até 9; \

\ [1237-9] – qualquer dígito entre as chaves e o intervalo 7-9, neste caso 1, 2, 3, 7, 8, 9;

\

\ “.” – ponto é um padrão curinga que combina com um ou mais dígitos. Para auxiliar a produzir planos de discagem mais complexos e menos extensos, o Asterisk oferece uma forma de coincidir os caracteres digitados no teclado do telefone. São as expressões regulares, que diferem bastante da expressão regular conhecida da programação.

Para indicar que um número de extensão é uma expressão regular, deve começar com o caractere “_” (underline).

Exemplos:

\

\ Número de 6 dígitos, onde os dois primeiros são diferentes de 0: exten => _ZZXXXX,1,Answer()

exten => _ZZXXXX,n,Dial(SIP/meuTroncoSip/${EXTEN}) exten => _ZZXXXX,n,Hangup()

\

\ Número de 8 dígitos + 2 de código de área; \

\ Código de área não inicia com 0 nem com 1, e o segundo dígito é diferente de

zero;

\

\ Número do telefone começa com os algarismos 2, 3, 4 ou 5. Depois tem mais 7

dígitos livres;

\

\ Apenas o número de 8 dígitos é discado pelo tronco “meuTroncoSip”: exten => _NZ[2-5]XXXXXX,1,Answer()

exten => _NZ[2-5]XXXXXX,n,Dial(SIP/meuTroncoSip/${EXTEN:2}) exten => _NZ[2-5]XXXXXX,n,Hangup()

\

\ Qualquer número de qualquer tamanho que comece com zero; \

\ É passado para o tronco SIP apenas o número, sem o zero inicial: exten => _0.,1,Answer()

Introdução à V

oz sobre IP e Asterisk

No documento Introdução à Voz sobre IP e Asterisk (páginas 190-200)

Documentos relacionados