Você está na página 1de 30

Macros no Asterisk

Vicente de Paula Nobre vicente.proj@hotmail.com

Macros no Asterisk
So sub-rotinas que tem o objetivo de simplificar o plano de discagem eliminando a necessidade de repetio de regras. As macros funcionam como funes dentro do plano discagem onde pode ser passado parmetros a serem executados dentro da macro.

Macros no Asterisk
Benefcios na Utilizao de Macros:
Centraliza a lgica do cdigo em um nico ponto. Facilidade na manuteno. Melhor Organizao do plano de discagem.

Macros no Asterisk
As macros funcionam semelhantes aos contextos dentro do arquivo extensions.conf. Porm uma macro definida atravs da seguinte sintaxe:
[macro-Nome da Macro]

Alm disso as macros devem sempre ser executadas atravs da extenso s do asterisk que significa start, ou, seja no pode ser usada nenhuma extenso diferente de s.

Macros no Asterisk
As macros so usadas para processar extenses de forma que no seja necessrio a criao de varias linhas de comandos para cada extenso. Sintaxe na chamada de uma Macro:
Macro(NomeDaMacro, arg1, arg2,..., argN)

Macros no Asterisk
Exemplo 1 Uso Simples:
[ramais] exten=> _40XX,1,Macro(BemVindo, hello-world, SIP/${EXTEN},20) [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
Variveis de Canal
Nome da Varivel ARGn MACRO_CONTEXT MACRO_EXTEN MACRO_PRIORITY MACRO_OFFSET Descrio Usado para passar parmetros para as macros, so enumerados de acordo com a ordem de chamada. Contm o valor da varivel CONTEXT durante a chamada da macro. Contm o valor da varivel EXTEN durante a chamada da macro. Contm o nmero da prioridade que chamou a macro. Influencia na prioridade de execuo 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}) exten=> s,4,HangUp()

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) ; Indisponvel exten=> s-CHANUNAVAIL,1,VoiceMail(${ARG3},u) ; Indisponvel

Macros no Asterisk
Comando Goto: O comando Goto, muda a ordem de execuo do plano de discagem.
Sintaxe: ;Desvia para um contexto, extenso e prioridade especificada. GoTo(contexto, extenso, prioridade) ;Desvia para a extenso e a prioridade dentro do prprio contexto. GoTo(extenso, prioridade) ;Desvia para prioridade especificada dentro do prprio contexto. GoTo(prioridade)

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) exten=> _40XX,n(indisponivel),VoiceMail(${EXTEN},u) exten=> _40XX,n,HangUp() exten=> _40XX,n(ocupado),VoiceMail(${EXTEN},b) exten=> _40XX,n,HangUp()

Macros no Asterisk
Comando GotoIf:
O comando GoToIf, muda o fluxo do plano de discagem de acordo com o resultado de uma expresso lgica:
Sintaxe: GoToIf(expresso lgica ? [destino se verdadeiro] : [destino se falso])

Macros no Asterisk
Operadores Lgicos:
O exemplo anterior usou o operador lgico | (Ou, Or do ingls) na funo GoToIf, existem vrios operadores lgicos, como descrito na tabela abaixo:
Operadores Lgicos & | = > < >= <= != Descrio E OU Igual Maior que Menor que Maior ou igual que Menor ou igual que Diferente

Macros no Asterisk
Operadores Matemticos:
No asterisk tambm existem os operadores matemticos, que podem ser usados para sofisticar o seu plano de discagem, como descrito na tabela abaixo:
Operadores Matemticos + * / % Descrio Soma Subtrao Multiplicao Diviso Modulo

Macros no Asterisk
Exemplos:
Operao $[${TOTAL} + 4] $[${EXTEN} = 4000] $[${DIALSTATUS} != BUSY] Descrio Soma 4 ao contedo da varivel TOTAL. Se a varivel ${EXTEN} for igual a 4000, retorna 1 para verdadeiro, caso contrario 0 para falso. Se a varivel DIALSTATUS for diferente de BUSY, retorna 1 para verdadeiro, caso contrario 0 para falso. 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. Se o PREFIXO for igual a 085 ou se o PREFIXO for igual a 011, retorna 1 para verdadeiro, caso contrario 0 para falso.

$[${VALOR1}>=10 & ${VALOR2}<=20]

${${PREFIXO}=085 | ${PREFIXO}=011]

Macros no Asterisk
Exemplo 4 - Criao da Macro Correio:
[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,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) ; Indisponvel exten=> s,n,HangUp() exten=> s,n(ocupado),VoiceMail(${ARG2},b) ; Ocupado exten=> s,n,HangUp()

Macros no Asterisk
Retorno da Varivel DIALSTATUS:
O exemplo anterior, usou alguns tipos de status que a varivel DIALSTATUS do asterisk retorna, a tabela abaixo os descreve:
VARIVEL CHANUNAVAIL NOANSWER BUSY ANSWER CONGESTION CANCEL DONTCALL TORTURE INVALIDARGS DESCRIO Canal de destino indisponvel. O destino no atendeu a chamada. O destino estava ocupado. Chamada atendida. No havia canais disponveis para completar a chamada. O originador da chamada cancelou antes que a chamada fosse completada. Chamadas so rejeitadas, pelo modo de privacidade. O destino decidiu enviar a chamada para o menu, pelo modo de privacidade. Alguns dos argumentos passados estavam invlidos.

Macros no Asterisk
Exemplo 4 Observao Criao da Conta SIP:
Para que funcionem os exemplos anteriores, devem-se criar as contas SIP ou IAX e o VoiceMail: ;Arquivo sip.conf [general] port=5060 bindaddr=0.0.0.0 disallow=all allow=alaw language=pt_BR ;Arquivo sip.conf [4001] host=dynamic type=friend context=ramais username=4001 secret=4001 callerid=vicente<4001> mailbox=4001 ;mailbox=200@email

Macros no Asterisk
Exemplo 4 Observao Criao da Conta IAX:
Para que funcionem os exemplos anteriores, devem-se criar as contas SIP ou IAX e o VoiceMail: ;Arquivo iax.conf [general] port=4569 bindaddr=0.0.0.0 disallow=all allow=gsm language=pt_BR ;Arquivo iax.conf [3001] host=dynamic type=friend auth=md5 context=ramais username=3001 secret=3001 callerid=3001 mailbox=3001 ;mailbox=300@email

Macros no Asterisk
Exemplo 4 Observao Criao do VoiceMail:
Para que funcionem os exemplos anteriores, devem-se criar as contas SIP ou IAX e o VoiceMail:
;Arquivo voicemail.conf [general] format=gsm serveremail=asterisk@hotmail.com maxlogins=5 maxmsg=100 delete=no attach=yes [email] include => general 200 =>123,vicente,vicente.proj@hotmail.com 300 => 789564,maria,maria@gmail.com [4001] include => general 4001 => 845962,jose,jose@yahoo.com.br [3001] include => general 3001 => 145263,fulano,fulano@email.com

Macros no Asterisk
Exemplo 5 - Criao 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(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})

Macros no Asterisk
Comando IF:
O comando IF, testa uma expresso lgica. Se a expresso for verdadeira, esse comando retorna o valor posterior a ? (interrogao), se no retorna o valor posterior aos : (dois pontos). Sintaxe: IF(expresso?valor_se_verdadeiro:valor_se_falso)

Macros no Asterisk
Exemplo 6 Uso de Variveis de Canal:
[empresa] exten => _40XX,1,Macro(RH, SIP/${EXTEN},20,tTwW) [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) ;Indisponvel exten => s,n,HangUp() exten=> s,n(busy),VoiceMail(${MACRO_EXTEN},b) ;Ocupado exten => s,n,HangUp()

Macros no Asterisk
Exemplo 7 Sala de Conferncia:
[ramais] include=>conferencia include=>gravacao [conferencia] exten => _3456XXXX,1,Macro(conferencia,${EXTEN:-4},3) [macro-conferencia] exten=> s,1,Answer exten=> 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) exten=> s,n,HangUp

Macros no Asterisk
Comando Set:
O comando Set possibilita definir o valor de uma varivel em tempo de execuo. Sintaxe: Set(nome_da_varivel = valor_da_varivel)

Macros no Asterisk
Exemplo 7 Sala de Conferncia Gravao do Anuncio:
[gravacao] exten=>200,1,Wait(1) 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()

Macros no Asterisk
Exemplo 7 Sala de Conferncia Criao das Salas Para que funcione o exemplo anterior preciso criar uma sala de conferncia no arquivo meetme.conf.
;meetme.conf [rooms] conf=>sala,senha ;Exemplo conf=> 2020 conf=> 2020,123456

Macros no Asterisk
Manipulao de Variveis:
O exemplo anterior usou o conceito de substring. O asterisk capaz de manipular uma varivel, retornado partes de seu contedo inicial: Suponha que a varivel ${EXTEN} possua o valor 34561405: Sintaxe: ${varivel:posio inicial:comprimento}
VARIVEL ${EXTEN:1} ${EXTEN:0:1} ${EXTEN:2:5} ${EXTEN:4:7} ${EXTEN:-4} ${EXTEN:-4:3} RETORNO 4561405 3 5614 1405 1405 140

Concluso
As macros no asterisk deixam o cdigo mais simples de se fazer alteraes. Pode-se utilizar uma mesma macro para diversos outros contextos dentro de um plano de discagem, fazendo o uso do conceito de funes e passagem de parmetros que so utilizados em linguagens de programao. 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 construo do plano de discagem.

Contato, Criticas, Sugestes e Dvidas


Email: vicente.proj@hotmail.com Endereo do You Tube: http://www.youtube.com/user/voipjava Web sites sugeridos para pesquisa: www.asterisk.org www.digium.com www.voip-info.org

Você também pode gostar