Asterisk Extension Language - AEL (Parte 01)


A Sangoma Digium, por meio da sua equipe de desenvolvimento do Asterisk® SCF™, vem recebendo fortes pressões para adicionar recursos ao extensions.conf de modo a torná-lo mais parecido com uma linguagem de programação. O fato é que o AEL tem como objetivo fornecer uma linguagem de programação real que pode ser usada para escrever um Dialplan (Plano de Marcação, como não se faz mais uso de aparelhos de pulso com discos, não faz sentido traduzir para Plano de Discagem. Até porque em Telefones IP, e destinado a POTS temos teclas, e as marcamos ao invés de discar.). 

Começando:


O analisador AEL (pbx_ael.so) é completamente separado do módulo que analisa o extensions.conf (pbx_config.so). Para suar o AEL, a única coisa que deve ser feita é que o módulo pbx_ael.so deve ser carregado pelo Asterisk® SCF™. Isso será feito automaticamente se usar "autoload=yes" (que não é recomendado) em /etc/asterisk/modules.conf. Quando o módulo for carregado, ele procurará por extensions.ael em /etc/asterisk/. Ambos extensions.conf e extensions.ael pode ser usados em conjunto um com o outro, se isso for desejado. Alguns Engenheiros de Sistemas em Telecomunicações NGN, podem querer manter extensions.conf para usar os recursos que são configurados na seção "[GENERAL]".

Recarregando extensions.ael:

Para recarregar o extensions.ael, o seguinte comando pode ser emitido no *CLI>. 
*CLI> ael reload

Depurando:

  • Habilitar depuração de contextos do AEL;
    • *CLI> ael debug contexts
  • Habilitar depuração de macros do AEL;
    • *CLI> ael debug macros
  • Habilitar depuração de leitura do AEL;
    • *CLI> ael debug read
  • Habilitar depuração de tokens do AEL;
    • *CLI> ael debug tokens
  • Desativar mensagens de depuração do AEL;
    • *CLI> ael no debug

Comentários:

As linhas que começam com barra dupla (//) são comentários.
Exemplo: // Este é um comentário. 

Contexto:

Os contextos em AEL representam um conjunto de extensões da mesma forma que o fazem em extensions.conf (CONF).

context internal_pbx_extensions {

};

OBS: A chave de abertura deve aparecer como acima. Movê-la para a linha seguinte pode ter consequências desastrosas.

Extensões:

Para especificar uma extensão em um contexto, a seguinte sintaxe é usada. Se mais de um aplicativo for chamado em uma extensão, eles podem ser listados em ordem dentro de um bloco.



context internal_pbx_extensions {
    _10XX => {
            Verbose(Comutação Interna entre Extensions);
            Wait(0.2);
            Dial(PJSIP/${EXTEN},45,rTtHhKkwo);
            if("${DIALSTATUS}"=="BUSY") {
                Playback(call-sorry&is-in-use&call-goodbye);
            };
            HangUp();
    };

    _80XX => {
            Dial(PJSIP/${EXTEN},45,rTtHhKkwo);
            Verbose(Comutação entre servidores);
            Dial(PJSIP/TRUNK-SRV-SP/${EXTEN},45,rTtHhKkwo);
            if("${DIALSTATUS}"=="BUSY") {
                Verbose(Encaminhamento Incondicional);
                Playback(one-moment-please);
                goto internal_pbx_extensions|5099|1;
            };
            HangUp();
    };
    
    _5XXX => {
            Verbose(Comutação para a Telefonista);
            Dial(IAX2/TRUNK-SRV-SP/${EXTEN},45,rTtHhKkwo);
            if("${DIALSTATUS}"=="BUSY") {
                Playback(call-sorry&is-in-use&call-goodbye);
                HangUp();
            };
            HangUp();
    };

    h => {
            Verbose(//----> Chamada encerrada...: ORIG-${CALLERID(num)});
    };
};

Inclui:

Os contextos podem ser incluídos em outros contextos. Todos os contextos incluídos são listados em um único bloco.

context internal_pbx_extensions {
        includes { 
                chamadas_local;
                chamadas_ddd;
                chamadas_ddi;
        };
};

Dialplan Switches:

Os switches são listados em seu próprio bloco dentro de um contexto.

context internal_pbx_extensions {
        switches {
                DUNDi/e164;
                IAX2/TRUNK-SRV-SP;
        };

        eswitches {
                IAX2/context@${CURSERVER};
        };
};

Ignore Padrão (ignorepat):

ignorepat pode ser usado para instruir os drivers de canal a não cancelar o tom de marcação ao receber um determinado padrão (pattern). O exemplo mais comumente usado é '9'.

context chamadas_local {
        ignorepat=> 9;
};

OBS: A chave de abertura deve aparecer como acima. Movê-la para a linha seguinte pode ter consequências desastrosas.

Variáveis:

As variáveis no Asterisk® SCF™ não têm um tipo, então para definir uma variável, ela só precisa ser especificada com um valor. 

As variáveis podem ser definidas nas extensões. 

context chamadas_local {
        _92929XXXX => {
            Set(ignore_pattern=9); // definindo uma variável.
            ignorepat=> ${ignore_pattern}; // usando a variável.
        }
};

Variáveis globais são definidas em seu próprio bloco.

globals {
        CONSOLE=Console/dsp;
        TRUNK-GOIP=DAHDI/g2;
};

OBS: A chave de abertura deve aparecer como acima. Movê-la para a linha seguinte pode ter consequências desastrosas.


.

Nenhum comentário

Toda vez que um homem supera os reveses, torna-se mentalmente e espiritualmente mais forte!

Tecnologia do Blogger.