SlideShare uma empresa Scribd logo
Macros no Asterisk


 Vicente de Paula Nobre
vicente.proj@hotmail.com
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
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]



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:

 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
                      Variáveis de Canal
 Nome da Variável                              Descrição
                     Usado para passar parâmetros para as macros, são enumerados de
ARGn                 acordo com a ordem de chamada.
                     Contém o valor da variável CONTEXT durante a chamada da
MACRO_CONTEXT        macro.
                     Contém o valor da variável EXTEN durante a chamada da
MACRO_EXTEN          macro.
MACRO_PRIORITY       Contém o número da prioridade que chamou a macro.
                     Influencia na prioridade de execução ao sair da macro.
MACRO_OFFSET         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) ; Indisponível
exten=> s-CHANUNAVAIL,1,VoiceMail(${ARG3},u) ; Indisponível
Macros no Asterisk
Comando Goto:
O comando Goto, muda a ordem de execução do plano de
discagem.
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.
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 expressão lógica:

Sintaxe:

GoToIf(expressão lógica ? [destino se verdadeiro] : [destino se falso])
Macros no Asterisk
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:

     Operadores Lógicos           Descrição
            &                         E
            |                        OU
             =                      Igual
             >                    Maior que
             <                   Menor que
            >=                Maior ou igual que
            <=               Menor ou igual que
            !=                    Diferente
Macros no Asterisk
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:

    Operadores Matemáticos      Descrição
              +                   Soma
              -                 Subtração
              *                Multiplicação
              /                  Divisão
              %                  Modulo
Macros no Asterisk
 Exemplos:
              Operação                                Descrição
$[${TOTAL} + 4]                      Soma 4 ao conteúdo da variável TOTAL.
                                     Se a variável ${EXTEN} for igual a 4000,
$[${EXTEN} = 4000]                   retorna 1 para verdadeiro, caso contrario 0
                                     para falso.
$[${DIALSTATUS} != BUSY]             Se a variável 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
$[${VALOR1}>=10 & ${VALOR2}<=20]     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}=085 | ${PREFIXO}=011]   PREFIXO for igual a 011, retorna 1 para
                                     verdadeiro, caso contrario 0 para falso.
Macros no Asterisk
Exemplo 4 - Criação 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) ; Indisponível
exten=> s,n,HangUp()
exten=> s,n(ocupado),VoiceMail(${ARG2},b) ; Ocupado
exten=> s,n,HangUp()
Macros no Asterisk
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:
  VARIÁVEL                                DESCRIÇÃO
CHANUNAVAIL   Canal de destino indisponível.
NOANSWER      O destino não atendeu a chamada.
BUSY          O destino estava ocupado.
ANSWER        Chamada atendida.
CONGESTION    Não havia canais disponíveis para completar a chamada.
              O originador da chamada cancelou antes que a chamada fosse
CANCEL        completada.
DONTCALL      Chamadas são rejeitadas, pelo modo de privacidade.
              O destino decidiu enviar a chamada para o menu, pelo modo de
TORTURE       privacidade.
INVALIDARGS   Alguns dos argumentos passados estavam inválidos.
Macros no Asterisk
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:

        ;Arquivo sip.conf    ;Arquivo sip.conf
        [general]            [4001]
        port=5060            host=dynamic
        bindaddr=0.0.0.0     type=friend
        disallow=all         context=ramais
        allow=alaw           username=4001
        language=pt_BR       secret=4001
                             callerid=vicente<4001>
                             mailbox=4001
                             ;mailbox=200@email
Macros no Asterisk
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:

        ;Arquivo iax.conf    ;Arquivo iax.conf
        [general]            [3001]
        port=4569            host=dynamic
        bindaddr=0.0.0.0     type=friend
        disallow=all         auth=md5
        allow=gsm            context=ramais
        language=pt_BR       username=3001
                             secret=3001
                             callerid=3001
                             mailbox=3001
                             ;mailbox=300@email
Macros no Asterisk
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:
              ;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 - 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(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 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).

Sintaxe:

IF(expressão?valor_se_verdadeiro:valor_se_falso)
Macros no Asterisk
Exemplo 6 – Uso de Variáveis 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) ;Indisponível
exten => s,n,HangUp()
exten=> s,n(busy),VoiceMail(${MACRO_EXTEN},b) ;Ocupado
exten => s,n,HangUp()
Macros no Asterisk
Exemplo 7 – Sala de Conferência:
[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
 variável em tempo de execução.
 Sintaxe:

  Set(nome_da_variável = valor_da_variável)
Macros no Asterisk
 Exemplo 7 – Sala de Conferência – Gravação 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 Conferência – Criação das Salas
Para que funcione o exemplo anterior é preciso criar
uma sala de conferência no arquivo meetme.conf.

;meetme.conf
[rooms]
conf=>sala,senha

;Exemplo
conf=> 2020
conf=> 2020,123456
Macros no Asterisk
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}

              VARIÁVEL                 RETORNO
              ${EXTEN:1}                 4561405
             ${EXTEN:0:1}                   3
             ${EXTEN:2:5}                 5614
             ${EXTEN:4:7}                 1405
              ${EXTEN:-4}                 1405
             ${EXTEN:-4:3}                 140
Conclusã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
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.
Contato, Criticas, Sugestões e Dúvidas
Email:
vicente.proj@hotmail.com

Endereço do You Tube:
http://www.youtube.com/user/voipjava

Web sites sugeridos para pesquisa:
www.asterisk.org
www.digium.com
www.voip-info.org

Mais conteúdo relacionado

PPTX
XML, DTD & XSD Overview
PPT
Regular Expressions
DOCX
Base datos consultasavanzadas-postgres
PPT
Packages in java
PDF
Go Lang Tutorial
PPTX
Exception Handling in Java
ODP
Regular Expression
PDF
Python para principiantes
XML, DTD & XSD Overview
Regular Expressions
Base datos consultasavanzadas-postgres
Packages in java
Go Lang Tutorial
Exception Handling in Java
Regular Expression
Python para principiantes

Mais procurados (11)

PPTX
Ejemplo GUARDAR registros desde Visual Basic 2012
PPTX
Java Notes by C. Sreedhar, GPREC
PPTX
Pure virtual function and abstract class
DOCX
Test de Base de datos Access 1 resuelto.docx
PPTX
data frames.pptx
PPTX
JQuery selectors
PPTX
Object Oriented Programming Concepts
PDF
DIBUJO EN JFRAME CASA
PPTX
4. listbox
PPTX
Fundamentos C++
Ejemplo GUARDAR registros desde Visual Basic 2012
Java Notes by C. Sreedhar, GPREC
Pure virtual function and abstract class
Test de Base de datos Access 1 resuelto.docx
data frames.pptx
JQuery selectors
Object Oriented Programming Concepts
DIBUJO EN JFRAME CASA
4. listbox
Fundamentos C++
Anúncio

Semelhante a Macros no asterisk (20)

PDF
Criando sua própria linguagem de programação
ODP
Tw Course Ajax 2007 Ap05
PPT
Construindo URA e Sistemas de Call Center com Asterisk
PPT
Construindo URA e Sistemas de Call Center com Asterisk
PPTX
NotORM
PDF
O que mudou no Ruby 1.9
PPT
ASP.Net Módulo 2
PDF
007 programando em python - funcoes
PPTX
PHP Básico - Parte 3
PPTX
Introdução ao CMake
PPTX
Otimização e Escalabilidade
PDF
Curso de Excel VBA
PDF
Ruby e Erlang de mãos dadas
ODP
Código Limpo
PPT
TechEd 2005: Novos Recursos T-SQL (SQL 2005)
PDF
2 funcoes e estrutura de blocos
ODP
Mini Curso de Python para Coding Dojo
ODP
Python Emsl2009
PDF
10 Boas Práticas de Programação
ODP
Ganhando tempo com casos de testes
Criando sua própria linguagem de programação
Tw Course Ajax 2007 Ap05
Construindo URA e Sistemas de Call Center com Asterisk
Construindo URA e Sistemas de Call Center com Asterisk
NotORM
O que mudou no Ruby 1.9
ASP.Net Módulo 2
007 programando em python - funcoes
PHP Básico - Parte 3
Introdução ao CMake
Otimização e Escalabilidade
Curso de Excel VBA
Ruby e Erlang de mãos dadas
Código Limpo
TechEd 2005: Novos Recursos T-SQL (SQL 2005)
2 funcoes e estrutura de blocos
Mini Curso de Python para Coding Dojo
Python Emsl2009
10 Boas Práticas de Programação
Ganhando tempo com casos de testes
Anúncio

Macros no asterisk

  • 1. Macros no Asterisk Vicente de Paula Nobre vicente.proj@hotmail.com
  • 2. 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 discagem onde pode ser passado parâmetros a serem executados dentro da macro.
  • 3. 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.
  • 4. 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] 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.
  • 5. 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: Macro(NomeDaMacro, arg1, arg2,..., argN)
  • 6. 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()
  • 7. Macros no Asterisk Variáveis de Canal Nome da Variável Descrição Usado para passar parâmetros para as macros, são enumerados de ARGn acordo com a ordem de chamada. Contém o valor da variável CONTEXT durante a chamada da MACRO_CONTEXT macro. Contém o valor da variável EXTEN durante a chamada da MACRO_EXTEN macro. MACRO_PRIORITY Contém o número da prioridade que chamou a macro. Influencia na prioridade de execução ao sair da macro. MACRO_OFFSET 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.
  • 8. 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()
  • 9. 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
  • 10. Macros no Asterisk Comando Goto: O comando Goto, muda a ordem de execução do plano de discagem. 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. GoTo(prioridade)
  • 11. 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()
  • 12. Macros no Asterisk Comando GotoIf: O comando GoToIf, muda o fluxo do plano de discagem de acordo com o resultado de uma expressão lógica: Sintaxe: GoToIf(expressão lógica ? [destino se verdadeiro] : [destino se falso])
  • 13. Macros no Asterisk 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: Operadores Lógicos Descrição & E | OU = Igual > Maior que < Menor que >= Maior ou igual que <= Menor ou igual que != Diferente
  • 14. Macros no Asterisk 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: Operadores Matemáticos Descrição + Soma - Subtração * Multiplicação / Divisão % Modulo
  • 15. Macros no Asterisk Exemplos: Operação Descrição $[${TOTAL} + 4] Soma 4 ao conteúdo da variável TOTAL. Se a variável ${EXTEN} for igual a 4000, $[${EXTEN} = 4000] retorna 1 para verdadeiro, caso contrario 0 para falso. $[${DIALSTATUS} != BUSY] Se a variável 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 $[${VALOR1}>=10 & ${VALOR2}<=20] 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}=085 | ${PREFIXO}=011] PREFIXO for igual a 011, retorna 1 para verdadeiro, caso contrario 0 para falso.
  • 16. Macros no Asterisk Exemplo 4 - Criação 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) ; Indisponível exten=> s,n,HangUp() exten=> s,n(ocupado),VoiceMail(${ARG2},b) ; Ocupado exten=> s,n,HangUp()
  • 17. Macros no Asterisk 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: VARIÁVEL DESCRIÇÃO CHANUNAVAIL Canal de destino indisponível. NOANSWER O destino não atendeu a chamada. BUSY O destino estava ocupado. ANSWER Chamada atendida. CONGESTION Não havia canais disponíveis para completar a chamada. O originador da chamada cancelou antes que a chamada fosse CANCEL completada. DONTCALL Chamadas são rejeitadas, pelo modo de privacidade. O destino decidiu enviar a chamada para o menu, pelo modo de TORTURE privacidade. INVALIDARGS Alguns dos argumentos passados estavam inválidos.
  • 18. Macros no Asterisk 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: ;Arquivo sip.conf ;Arquivo sip.conf [general] [4001] port=5060 host=dynamic bindaddr=0.0.0.0 type=friend disallow=all context=ramais allow=alaw username=4001 language=pt_BR secret=4001 callerid=vicente<4001> mailbox=4001 ;mailbox=200@email
  • 19. Macros no Asterisk 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: ;Arquivo iax.conf ;Arquivo iax.conf [general] [3001] port=4569 host=dynamic bindaddr=0.0.0.0 type=friend disallow=all auth=md5 allow=gsm context=ramais language=pt_BR username=3001 secret=3001 callerid=3001 mailbox=3001 ;mailbox=300@email
  • 20. Macros no Asterisk 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: ;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
  • 21. 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(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})
  • 22. Macros no Asterisk 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). Sintaxe: IF(expressão?valor_se_verdadeiro:valor_se_falso)
  • 23. Macros no Asterisk Exemplo 6 – Uso de Variáveis 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) ;Indisponível exten => s,n,HangUp() exten=> s,n(busy),VoiceMail(${MACRO_EXTEN},b) ;Ocupado exten => s,n,HangUp()
  • 24. Macros no Asterisk Exemplo 7 – Sala de Conferência: [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
  • 25. Macros no Asterisk Comando Set: O comando Set possibilita definir o valor de uma variável em tempo de execução. Sintaxe: Set(nome_da_variável = valor_da_variável)
  • 26. Macros no Asterisk Exemplo 7 – Sala de Conferência – Gravação 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()
  • 27. Macros no Asterisk 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. ;meetme.conf [rooms] conf=>sala,senha ;Exemplo conf=> 2020 conf=> 2020,123456
  • 28. Macros no Asterisk 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} VARIÁVEL RETORNO ${EXTEN:1} 4561405 ${EXTEN:0:1} 3 ${EXTEN:2:5} 5614 ${EXTEN:4:7} 1405 ${EXTEN:-4} 1405 ${EXTEN:-4:3} 140
  • 29. Conclusã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 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.
  • 30. Contato, Criticas, Sugestões e Dúvidas Email: vicente.proj@hotmail.com Endereço do You Tube: http://www.youtube.com/user/voipjava Web sites sugeridos para pesquisa: www.asterisk.org www.digium.com www.voip-info.org