Macros no Asterisk
Vicente de Paula Nobre
Macros no Asterisk
São sub-rotinas que tem o objetivo de simplificar o
plano de discagem eliminando a necessidade de
repetição de regras.
As macros funcionam como funções dentro do plano
As macros funcionam como funções dentro do plano
discagem onde pode ser passado parâmetros a serem
executados dentro da macro.
Macros no Asterisk
Benefícios na Utilização de Macros:
Centraliza a lógica do código em um único ponto. Facilidade na manutenção.
Melhor Organização do plano de discagem.
Macros no Asterisk
As macros funcionam semelhantes aos contextos dentro do arquivo extensions.conf.
Porém uma macro é definida através da seguinte sintaxe:
[macro-Nome da Macro]
[macro-Nome da Macro]
Além disso as macros devem sempre ser executadas através da extensão s do asterisk que significa start, ou, seja não pode ser usada nenhuma extensão diferente de s.
Macros no Asterisk
As macros são usadas para processar extensões de forma
que não seja necessário a criação de varias linhas de
comandos para cada extensão.
Sintaxe na chamada de uma Macro:
Sintaxe na chamada de uma Macro:
Macros no Asterisk
Exemplo 1 – Uso Simples:
[ramais]
exten=> _40XX,1,Macro(BemVindo, hello-world, SIP/${EXTEN},20)
[macro-BemVindo] [macro-BemVindo] exten=> s,1,Answer exten=> s,n,Wait(1)
exten=> s,n,PlayBack(${ARG1})
exten=> s,n,Dial (${ARG2}, ${ARG3}) exten=> s,n,HangUp()
Macros no Asterisk
Variáveis de Canal
Nome da Variável Descrição
ARGn
Usado para passar parâmetros para as macros, são enumerados de acordo com a ordem de chamada.
Contém o valor da variável CONTEXT durante a chamada da
MACRO_CONTEXT
Contém o valor da variável CONTEXT durante a chamada da macro.
MACRO_EXTEN
Contém o valor da variável EXTEN durante a chamada da macro.
MACRO_PRIORITY Contém o número da prioridade que chamou a macro.
MACRO_OFFSET
Influencia na prioridade de execução ao sair da macro.
Se ${MACRO_OFFSET}, for colocado no termino, a macro tentará continuar na prioridade MACRO_OFFSET+N+1, se tal passo existir e N+1caso contrario.
Macros no Asterisk
Exemplo 2 – Correio de Voz:
[ramais]exten=> _40XX,1,Macro(chamada, SIP/${EXTEN},20, tTwW, 200@email) [macro-chamada]
exten=> s,1,Dial(${ARG1}, ${ARG2}, ${ARG3})
exten => s,2,GoToIf($[${DIALSTATUS} = ANSWER] ? 4) exten => s,3,VoiceMail(${ARG4})
Macros no Asterisk
Exemplo 3 – Correio de Voz Melhorado:
[ramais]
exten=> _40XX,1,Macro(ramal, SIP, ${EXTEN},200@email) exten=> _30XX,1,Macro(ramal, IAX2, ${EXTEN}, 300@email) [macro-ramal]
exten=> s,1,Dial(${ARG1}/${ARG2},20,tTwW) exten=> s,n,Goto(s-${DIALSTATUS},1)
exten=> s-BUSY,1,VoiceMail(${ARG3},b) ; Ocupado
exten=> s-NOANSWER,1,VoiceMail(${ARG3},u) ; Indisponível
exten=> s-CHANUNAVAIL,1,VoiceMail(${ARG3},u) ; Indisponível
Comando Goto:
O comando Goto, muda a ordem de execução do plano de
discagem.
Macros no Asterisk
Sintaxe:
;Desvia para um contexto, extensão e prioridade especificada.
GoTo(contexto, extensão, prioridade)
;Desvia para a extensão e a prioridade dentro do próprio contexto.
GoTo(extensão, prioridade)
;Desvia para prioridade especificada dentro do próprio contexto.
Macros no Asterisk
Exemplo 3 - Sem o Uso da Macro:
[ramais]
exten=> _40XX,1,Dial(SIP/${EXTEN},20,tTwW)
exten=> _40XX,n,GotoIf($[${DIALSTATUS}=CHANUNAVAIL | ${DIALSTATUS}=NOANSWER] ? indisponivel : ocupado)
${DIALSTATUS}=NOANSWER] ? indisponivel : ocupado) exten=> _40XX,n(indisponivel),VoiceMail(${EXTEN},u) exten=> _40XX,n,HangUp()
exten=> _40XX,n(ocupado),VoiceMail(${EXTEN},b) exten=> _40XX,n,HangUp()
Comando GotoIf:
O comando GoToIf, muda o fluxo do plano de discagem de acordo com o resultado de uma expressão lógica:
Macros no Asterisk
Sintaxe: Sintaxe:
Operadores Lógicos:
O exemplo anterior usou o operador lógico | (Ou, Or do inglês) na função GoToIf, existem vários operadores lógicos, como descrito na tabela abaixo:
Macros no Asterisk
Operadores Lógicos Descrição
& E
| OU
= Igual
> Maior que
< Menor que
>= Maior ou igual que
<= Menor ou igual que
Operadores Matemáticos:
No asterisk também existem os operadores matemáticos, que podem ser usados para sofisticar o seu plano de discagem, como descrito na tabela abaixo:
Macros no Asterisk
Operadores Matemáticos Descrição Operadores Matemáticos Descrição
+ Soma
- Subtração
* Multiplicação
/ Divisão
Exemplos:
Macros no Asterisk
Operação Descrição
$[${TOTAL} + 4] Soma 4 ao conteúdo da variável TOTAL.
$[${EXTEN} = 4000]
Se a variável ${EXTEN} for igual a 4000, retorna 1 para verdadeiro, caso contrario 0 para falso.
para falso.
$[${DIALSTATUS} != BUSY] Se a variável DIALSTATUS for diferente
de BUSY, retorna 1 para verdadeiro, caso
contrario 0 para falso.
$[${VALOR1}>=10 & ${VALOR2}<=20]
Se o VALOR1 for maior ou igual a 10 e o VALOR2 for menor igual a 20 retorna 1 para verdadeiro, caso contrario 0 para falso.
${${PREFIXO}=085 | ${PREFIXO}=011]
Se o PREFIXO for igual a 085 ou se o PREFIXO for igual a 011, retorna 1 para verdadeiro, caso contrario 0 para falso.
Macros no Asterisk
Exemplo 4 - Criação da Macro Correio:
[macro-ramal]
exten=> s,1,Dial(${ARG1}/${ARG2},20,tTwW) [ramais]
exten=> _40XX,1,Macro(ramal, SIP, ${EXTEN}) exten=> _30XX,1,Macro(ramal, IAX2, ${EXTEN})
exten=> s,1,Dial(${ARG1}/${ARG2},20,tTwW)
exten=> s,n,Macro(correio,${DIALSTATUS},${ARG2}) [macro-correio]
exten=> s,1,GotoIf($[${ARG1}=CHANUNAVAIL|${ARG1}=NOANSWER| ${ARG1}=CONGESTION]?indisponivel:ocupado)
exten=> s,n(indisponivel),VoiceMail(${ARG2},u) ; Indisponível
exten=> s,n,HangUp()
exten=> s,n(ocupado),VoiceMail(${ARG2},b) ; Ocupado
Retorno da Variável DIALSTATUS:
O exemplo anterior, usou alguns tipos de status que a variável
DIALSTATUS do asterisk retorna, a tabela abaixo os descreve:
Macros no Asterisk
VARIÁVEL DESCRIÇÃO
CHANUNAVAIL Canal de destino indisponível.
NOANSWER O destino não atendeu a chamada.
BUSY O destino estava ocupado.
BUSY O destino estava ocupado.
ANSWER Chamada atendida.
CONGESTION Não havia canais disponíveis para completar a chamada.
CANCEL
O originador da chamada cancelou antes que a chamada fosse completada.
DONTCALL Chamadas são rejeitadas, pelo modo de privacidade.
TORTURE
O destino decidiu enviar a chamada para o menu, pelo modo de privacidade.
Exemplo 4 – Observação – Criação da Conta SIP:
Para que funcionem os exemplos anteriores, devem-se criar as contas SIP ou IAX e o VoiceMail:
Macros no Asterisk
;Arquivo sip.conf [4001] host=dynamic ;Arquivo sip.conf [general] port=5060 host=dynamic type=friend context=ramais username=4001 secret=4001 callerid=vicente<4001> mailbox=4001 ;mailbox=200@email port=5060 bindaddr=0.0.0.0 disallow=all allow=alaw language=pt_BR
Exemplo 4 – Observação – Criação da Conta IAX:
Para que funcionem os exemplos anteriores, devem-se criar as contas SIP ou IAX e o VoiceMail:
Macros no Asterisk
;Arquivo iax.conf [3001] host=dynamic ;Arquivo iax.conf [general] port=4569 host=dynamic type=friend auth=md5 context=ramais username=3001 secret=3001 callerid=3001 mailbox=3001 ;mailbox=300@email port=4569 bindaddr=0.0.0.0 disallow=all allow=gsm language=pt_BR
Exemplo 4 – Observação – Criação do VoiceMail:
Para que funcionem os exemplos anteriores, devem-se criar as
contas SIP ou IAX e o VoiceMail:
Macros no Asterisk
;Arquivo voicemail.conf [general] format=gsm [email protected] maxlogins=5 maxmsg=100 maxmsg=100 delete=no attach=yes [email] include => general 200 =>123,vicente,[email protected] 300 => 789564,maria,[email protected] [4001] include => general 4001 => 845962,jose,[email protected] [3001] include => general 3001 => 145263,fulano,[email protected]Macros no Asterisk
Exemplo 5 - Criação da Macro status:
[ramais] exten=> _40XX,1,Macro(ramal,SIP,${EXTEN}) exten=> _30XX,1,Macro(ramal,IAX2,${EXTEN}) [macro-ramal] exten=> s,1,Dial(${ARG1}/${ARG2},20,tTwW) exten=> s,n,GotoIf($[${DIALSTATUS}!=ANSWER}]?status:desliga) exten=> s,n,GotoIf($[${DIALSTATUS}!=ANSWER}]?status:desliga) exten=> s,n(status),Macro(status,${DIALSTATUS},${ARG2}) exten=> s,n(desliga),HangUp() [macro-status] exten=> s,1,Set(STATUS=${IF($[${ARG1}=NOANSWER|${ARG1}=CHANUNAVAIL| ${ARG1}=CONGESTION] ? u:b)}) exten=> s,n,Macro(correio,${ARG2},${STATUS}) [macro-correio] exten=> s,1,VoiceMail(${ARG1},${ARG2})
Comando IF:
O comando IF, testa uma expressão lógica.
Se a expressão for verdadeira, esse comando retorna o valor posterior a ? (interrogação), se não retorna o valor posterior aos : (dois pontos).
Macros no Asterisk
posterior aos : (dois pontos).
Sintaxe:
Macros no Asterisk
Exemplo 6 – Uso de Variáveis de Canal:
[empresa]
exten => _40XX,1,Macro(RH, SIP/${EXTEN},20,tTwW) [macro-RH]
[macro-RH]
exten=> s,1,Dial(${ARG1},${ARG2},${ARG3})
exten=> s,n,GotoIf($[${DIALSTATUS}=CHANUNAVAIL]?chanunavail:busy) exten=> s,n(chanunavail),VoiceMail(${MACRO_EXTEN},u) ;Indisponível
exten => s,n,HangUp()
exten=> s,n(busy),VoiceMail(${MACRO_EXTEN},b) ;Ocupado
Exemplo 7 – Sala de Conferência:
Macros no Asterisk
[ramais] include=>conferencia include=>gravacao [conferencia] exten => _3456XXXX,1,Macro(conferencia,${EXTEN:-4},3) [macro-conferencia] exten=> s,1,Answer exten=> s,1,Answerexten=> s,n,Set(quantidade= ${ARG2})
exten=> s,n,MeetMeCount(${ARG1}, participantes)
exten=> s,n,GotoIf($[${participantes}=${quantidade}]?desliga:sala) exten=> s,n(sala),MeetMe(${ARG1})
exten=> s,n(desliga),NoOp(Esta sala de conferencia esta com sua capacidade maxima!) exten=> s,n,PlayBack(/var/lib/asterisk/sounds/conferencia/anuncio)
exten=> s,n,NoOp(Com ${participantes} participantes!)
exten=> s,n,PlayBack(/var/lib/asterisk/sounds/conferencia/digito${participantes}) exten=> s,n,Wait(1)
Comando Set:
O comando Set possibilita definir o valor de uma variável em tempo de execução.
Sintaxe:
Macros no Asterisk
Exemplo 7 – Sala de Conferência – Gravação do Anuncio:
Macros no Asterisk
[gravacao] exten=>200,1,Wait(1) exten=>200,n,PlayBack(beep) exten=>200,n,PlayBack(beep) exten=>200,n,Record(/var/lib/asterisk/sounds/conferencia/anuncio:gsm) exten=>200,n,HangUp() exten=>201,1,Wait(1) exten=>201,n,PlayBack(beep) exten=>201,n,Record(/var/lib/asterisk/sounds/conferencia/digito3:gsm) exten=>201,n,HangUp()
Exemplo 7 – Sala de Conferência – Criação das Salas
Para que funcione o exemplo anterior é preciso criar
uma sala de conferência no arquivo meetme.conf.
Macros no Asterisk
;meetme.conf ;meetme.conf [rooms] conf=>sala,senha ;Exemplo conf=> 2020 conf=> 2020,123456
Manipulação de Variáveis:
O exemplo anterior usou o conceito de substring.
O asterisk é capaz de manipular uma variável, retornado partes de seu conteúdo inicial:
Suponha que a variável ${EXTEN} possua o valor 34561405: Sintaxe: ${variável:posição inicial:comprimento}
Macros no Asterisk
VARIÁVEL RETORNO ${EXTEN:1} 4561405 ${EXTEN:0:1} 3 ${EXTEN:2:5} 5614 ${EXTEN:4:7} 1405 ${EXTEN:-4} 1405 ${EXTEN:-4:3} 140Conclusão
As macros no asterisk deixam o código mais simples de se fazer alterações.
Pode-se utilizar uma mesma macro para diversos outros contextos dentro de um plano de discagem, fazendo o uso do conceito de funções e passagem de parâmetros que são utilizados em funções e passagem de parâmetros que são utilizados em linguagens de programação.
As macros podem ser usadas para todos os tipos de funcionalidades no asterisk, como URA, Voicemail, Meetme, Filas, SIP, IAX e etc.
Fazer uso de macros é uma boa pratica para construção do plano de discagem.