domingo, junho 27, 2010

Entendendo o arquivo extensions.conf

Variável exten

É indispensável dentro de uma regra de discagem, vou dar um exemplo de uma regra de discagem manual, muito utilizada em empresas.

[locais]
exten => _0XXXXXXXX,1,Noop(==> Ligação local manual)
exten => _0XXXXXXXX,n,Dial(${GVT}${EXTEN:1})

Vamos explicar, exten é a variável padrão para regras de discagem, sempre que for criado um plano de discagem, criar uma situação para a discagem de um número, será usado exten => (tal número) (instruções). No exemplo a variável exten está recebendo o dígito 0 mais 8 dígitos quaisquer, o X significa qualquer dígito de 0 a 9, temos outras opções como:

Z= 1 a 9

N= 2 a 9

Está caracterizado um plano muito usado, 0 para sair e o número desejado, sendo uma ligação local, bastam só os 8 dígitos possíveis. Vamos ao próximo passo 0XXXXXXXX,1, este 1 significa que será a primeira coisa a ser executada ao cair em um contexto. Vou explicar o que é um contexto, no início temos isto [locais], este é o nome do contexto, mas para quê usar um contexto?

Este contexto limita-se apenas a ligações locais, então há uma tag com o nome context, quando você cria um ramal, se por exemplo vocês colocarem os ramais dos estagiários dentro do contexto locais, eles somente discarão o que está no mesmo, é como se fosse algo parecido com grupos e usuários.

Voltando ao 0XXXXXXXX,1,Noop(==> Ligação local manual), 1 é a primeira prioridade, o que executará primeiro, Noop imprime uma mensagem no CLI do Asterisk.


O cli do Asterisk


Este é um exemplo de CLI do Asterisk
Desculpem por editar a imagem, é que não poderia mostrar o nome do servidor Asterisk nem o conteúdo do Outlook aberto atrás. Aqui está sendo utilizado o putty, cliente ssh para Windows, pois necessitava na ocasião da utilização de mais alguns softwares para Windows. O softphone usado na figura é o sjphone, é o meu softphone favorito, há versões para Windows e Linux, mas também há muitos outros bons softphones.

Como mostrado anteriormente, estávamos em uma variável chamada Noop, o cli do Asterisk é como se fosse um de um roteador, como um da cisco por exemplo. Digitando asterisk -r no shell você entrará no modo de comando do Asterisk, aonde poderá usar comandos do próprio Asterisk para verificar erros, fazer análises, derrubar ramais e outras funções. Nele aparecerá está mensagem Noop (e a mensagem configurada no extension).

Alguns comandos primordiais serão listados abaixo com uma breve explicação.

extension reload = após executar alguma modificação no arquivo extensions.conf, para que as mesmas entre em vigor é necessário digitar isto no cli do Asterisk para recarregar o arquivo.

sip reload = o mesmo que extensions reload, porém ao arquivo sip.conf.

iax2reload = o mesmo que extensions reload, porém ao arquivo iax.conf.

sip show peer = mostra informação sobre um ramal, ex: sip show peer 2019

sip show peers = mostra informações sobre todos os ramais existentes na configuração, se estão online/offline, qual ip está conectado ao ramal, se é dinâmico, estático, se esta atrás do nat.

dialplan show = mostra informações sobre o contexto selecionado. Ex: dialplan show adm

Existem muitos mais comandos úteis, mas estarei mostrando exemplos destes acima.


Exemplos

exten => 0XXXXXXXX,n,Dial(${GVT}${EXTEN:1})

A variável exten recebe novamente os mesmos números, esta é a logica do Asterisk, este contexto funcionará se um ramal associado a ele discar de 0 e 8 dígitos, então ele executará. No segundo passo é apresentado o n, que significa próximo, em versões anteriores a 1.4 era necessário digitar em cada linha as prioridades 1,2,3,4 e assim sucessivamente. Agora você diz aonde vai iniciar e o resto ele faz automático, muito útil, no caso de adicionar ou remover alguma linha, basta adicionar e pronto, o n e automático, antes teria que checar todas as prioridades.

Variável Dial, que significa discar, mas discar o que? Isto, (${GVT}${EXTEN:1}), esta variável ${GVT} é uma variável definida pelo programador do Asterisk na sessão global, estaria assim GVT=zap/r2 por exemplo, o canal que executa ligações para gvt discará por este canal, a variável EXTEN, cujo é 0XXXXXXXX, os :1(EXTEN:1), é para formatar como o número sairá pelo canal, a rede de telefonia pública, tratando de uma ligação local, é necessário que saia somente o número "limpo", sem o zero, então o :1 elimina o primeiro dígito, você pode utilizar :2, :4, o que for necessário, depende de sua regra.

Exemplo de contexto para DDD

Vamos passar para mais algumas funções e exemplos de regras:

[DDD]
exten => _00XX[2-6]XXXXXXX,1,Noop(==> DDD telefone fixo)
exten => _00XX[2-6]XXXXXXX,n,ChansAvail(${GVT})
exten => _00XX[2-6]XXXXXXX,n,GotoIf($["${AVAILSTATUS}" = "34" ] ?2)
exten => _00XX[2-6]XXXXXXX,n,Dial(${GVT}0${OP-GVT}${EXTEN:2}||Tt)
exten => _00XX[2-6]XXXXXXX,n,Hangup

exten => _00XX[2-6]XXXXXXX,102,Noop(==> Transbordo)
exten => _00XX[2-6]XXXXXXX,n,ChansAvail(${GVT})
exten => _00XX[2-6]XXXXXXX,n,Dial(${TRANSIT}0${OP-TRANSIT}${EXTEN:2}||Tt)
exten => _00XX[2-6]XXXXXXX,n,Hangup

Vamos a explicação:

[DDD] = nome do contexto, para ligações DDD

exten => _00XX[2-6]XXXXXXX,1,Noop(==> DDD telefone fixo), quando for discado 00+ DDD + dígito de 2 a 6, dígitos que abrangem números de telefonia fixa, contexto não ligará para celulares, mais sete dígitos, pois já foi escolhido um de 2 a 6, a primeira prioridade, aparecerá a mensagem.

exten => _00XX[2-6]XXXXXXX,n,ChansAvail(${GVT}) = Avaliará o canal que está sendo ligado pela GVT.

exten => _00XX[2-6]XXXXXXX,n,GotoIf($["${AVAILSTATUS}" = "34" ] ?102) = função GotoIf, muito utilizada para transbordo, faz o seguinte, verifica se a variável availstatus, que é bem parecida com o próprio nome, possui a função de avaliar o canal, se possuir o código 34, este código é um código ISUP, código padrão mundial de telefonia, podem pesquisar na web pelo mesmo. O código 34 significa todos canais ocupados, então ele não poderá ligar pela gvt se tais tiverem ocupados, assim ele executara a prioridade 102, que será mostrada adiante, aonde começará o transbordo, se não for 34, por ter canal disponível para discar, então passará ao próximo passo.

exten => _00XX[2-6]XXXXXXX,n,Dial(${GVT}0${OP-GVT}${EXTEN:2}||Tt) = efetua a ligação usando o canal GVT, aqui está a diferença por ser um DDD, cujo de um telefone convencional deveríamos discar, 0(código da operadora) + (DDD) + (número), este 0 após op-gvt ficará nesta posição 00 0 (aqui) XX, necessário, pois se discando 0 e mais número liga local, então discando 00 +número liga DDD, o exten:2 corta os dois primeiros números, portando a ligação sairá 0 ${OP-GVT}, definida na seção globals, variável recebe o número da operadora gvt+ XX, DDD de algum lugar do pais, e o número.

exten => _00XX[2-6]XXXXXXX,n,Hangup= hangup encerra a ligação(desliga).

Funções com transbordo:

exten => _00XX[2-6]XXXXXXX,102,Noop(==> Transbordo)
exten => _00XX[2-6]XXXXXXX,n,ChansAvail(${EMBRATEL})
exten => _00XX[2-6]XXXXXXX,n,Dial(${EMBRATEL}0${OP-EMBRATEL}${EXTEN:2}||Tt)
exten => _00XX[2-6]XXXXXXX,n,Hangup

Note que após o número que a variável exten recebe temos 102, o número que estava no GotoIf, se estiver ocupado, faz isto a prioridade 102, após cair nela executará o passo abaixo com os números N, no exemplo discaria pela Embratel, se a gvt estivesse ocupada, quem cria a regra deve associar a custos e tarifas, ver qual é mais em conta.

Este foi meu primeiro artigo, não sou muito bom escrevendo, pretendo aprimorar mais isto, espero que gostem. Em breve posto mais algum material sobre Asterisk, só havia visto artigos aqui no VOL ensinando a criar ramais, instalação do Asterisk, mas nada explicando estas variáveis, passando uma visão melhor do extensions.conf.

Fica aí o artigo e um obrigado ao VOL, por onde venho apreendendo muito sobre Linux.

3 comentários:

Unknown disse...

Renato, parabens pela simpliscidade e objetividade deste post, gostaria muito de conhecer mais sobre seu trabalho, por gentileza queira me adicionar no seu msn, julio.jacob@atend.srv.br

José Carlos disse...

Olá a todos. Gostaria de saber se alguém saberia algum comando para exibir, de preferência, somente os nomes dos planos de discagem ou os dialplan. Quem souber de algo favor me enviar um e-mail. O meu e-mail é andrade.ribeiro@gmail.com.

José Carlos disse...

Olá a todos. Gostaria de saber se alguém saberia algum comando para exibir, de preferência, somente os nomes dos planos de discagem ou os dialplan. Quem souber de algo favor me enviar um e-mail. O meu e-mail é andrade.ribeiro@gmail.com.