SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Plataforma de monitoreo zabbix
Plataforma de monitoreo zabbixPlataforma de monitoreo zabbix
Plataforma de monitoreo zabbix
Daniel Patiño
 
6.5.1.2 packet tracer layer 2 security instructor
6.5.1.2 packet tracer   layer 2 security instructor6.5.1.2 packet tracer   layer 2 security instructor
6.5.1.2 packet tracer layer 2 security instructor
Salem Trabelsi
 
Guia de configuracion cisco 881 w logicalis
Guia de configuracion cisco 881 w   logicalisGuia de configuracion cisco 881 w   logicalis
Guia de configuracion cisco 881 w logicalis
asesinoevil
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of Django
Jacob Kaplan-Moss
 

Tendances (20)

IP and VoIP Fundamentals
IP and VoIP FundamentalsIP and VoIP Fundamentals
IP and VoIP Fundamentals
 
Cisco CCNA module 3
Cisco CCNA module 3Cisco CCNA module 3
Cisco CCNA module 3
 
Ip tunnelling and_vpn
Ip tunnelling and_vpnIp tunnelling and_vpn
Ip tunnelling and_vpn
 
Firewall
FirewallFirewall
Firewall
 
CCNP Security-Firewall
CCNP Security-FirewallCCNP Security-Firewall
CCNP Security-Firewall
 
Email authentication using firebase auth + flutter
Email authentication using firebase auth + flutterEmail authentication using firebase auth + flutter
Email authentication using firebase auth + flutter
 
Plataforma de monitoreo zabbix
Plataforma de monitoreo zabbixPlataforma de monitoreo zabbix
Plataforma de monitoreo zabbix
 
Introduction to Akka Streams [Part-I]
Introduction to Akka Streams [Part-I]Introduction to Akka Streams [Part-I]
Introduction to Akka Streams [Part-I]
 
6.5.1.2 packet tracer layer 2 security instructor
6.5.1.2 packet tracer   layer 2 security instructor6.5.1.2 packet tracer   layer 2 security instructor
6.5.1.2 packet tracer layer 2 security instructor
 
Guia de configuracion cisco 881 w logicalis
Guia de configuracion cisco 881 w   logicalisGuia de configuracion cisco 881 w   logicalis
Guia de configuracion cisco 881 w logicalis
 
Ncat ccna cheat sheet
Ncat ccna cheat sheetNcat ccna cheat sheet
Ncat ccna cheat sheet
 
WiFi practical hacking "Show me the passwords!"
WiFi practical hacking "Show me the passwords!"WiFi practical hacking "Show me the passwords!"
WiFi practical hacking "Show me the passwords!"
 
Dns estatico IPv4 e IPv6 en Debian 8.7.1
Dns estatico IPv4 e IPv6 en Debian 8.7.1Dns estatico IPv4 e IPv6 en Debian 8.7.1
Dns estatico IPv4 e IPv6 en Debian 8.7.1
 
Instalación servidor dhcp en ubuntu server 14
Instalación servidor dhcp en ubuntu server 14Instalación servidor dhcp en ubuntu server 14
Instalación servidor dhcp en ubuntu server 14
 
Network Traffic Analysis With Wireshark.pptx
Network Traffic Analysis With Wireshark.pptxNetwork Traffic Analysis With Wireshark.pptx
Network Traffic Analysis With Wireshark.pptx
 
Servidor DNS Dinámico en Ubuntu Server 16.04 LTS
Servidor DNS Dinámico en Ubuntu Server 16.04 LTSServidor DNS Dinámico en Ubuntu Server 16.04 LTS
Servidor DNS Dinámico en Ubuntu Server 16.04 LTS
 
Wireless Intrusion Prevention Systems or WIPS
Wireless Intrusion Prevention Systems or WIPSWireless Intrusion Prevention Systems or WIPS
Wireless Intrusion Prevention Systems or WIPS
 
Configuring a Cisco Router as a PPPoE Client for DSL Connectivity
 Configuring a Cisco Router as a PPPoE Client for DSL Connectivity Configuring a Cisco Router as a PPPoE Client for DSL Connectivity
Configuring a Cisco Router as a PPPoE Client for DSL Connectivity
 
The Best (and Worst) of Django
The Best (and Worst) of DjangoThe Best (and Worst) of Django
The Best (and Worst) of Django
 
S12-Hack-Kali Linux Crunch Hydra y Medusa P2
S12-Hack-Kali Linux Crunch Hydra y Medusa P2S12-Hack-Kali Linux Crunch Hydra y Medusa P2
S12-Hack-Kali Linux Crunch Hydra y Medusa P2
 

Similaire à Macros no asterisk

ASP.Net Módulo 2
ASP.Net   Módulo 2ASP.Net   Módulo 2
ASP.Net Módulo 2
michellobo
 
007 programando em python - funcoes
007   programando em python - funcoes007   programando em python - funcoes
007 programando em python - funcoes
Leandro Barbosa
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidade
metzen
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
Ricardo Bolanho
 
Mini Curso de Python para Coding Dojo
Mini Curso de Python para Coding DojoMini Curso de Python para Coding Dojo
Mini Curso de Python para Coding Dojo
Fabricio NErdmann
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de Programação
Carlos Schults
 

Similaire à Macros no asterisk (20)

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

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