[AsteriskBrasil] Asterisk Manager API - AMI - Asterisk-Java

Silvio Netto silvionetto em hotmail.com
Quinta Janeiro 18 10:42:19 BRST 2007


Bom dia,

Estive tentando acessar um servidor Asterisk a partir de uma máquina Windows realizar uma ligação e transferir para um atendente.
Com isso descubri várias facilidades do Asterisk e resolvi enviar para a lista algumas coisas interessantes na minha opinião para resolver o problema.
A primeira coisa que me apareceu foi o Asterisk Manager API. Uma interface que disponibiliza acesso ao Asterisk via protocolo TCP/IP.
Para utilizar o Asterisk Manager basta habilitar o serviço editando o arquivo de configuração "/etc/asterisk/manager.conf" como no exemplo abaixo:

; 
 ; Asterisk Call Management support 
 ; 
 [general] 
 enabled = yes 
 port = 5038  
 bindaddr = 0.0.0.0 

 [mark] 
 secret = mysecret 
 deny=0.0.0.0/0.0.0.0 
 permit=209.16.236.73/255.255.255.0 
 permit=127.0.0.1/255.255.255.0 
 read = system,call,log,verbose,command,agent,user 
 write = system,call,log,verbose,command,agent,user

Para verificar se tudo funcionou basta acessar o servidor Asterisk através de outra máquina com Windows entrando via Telnet. Com um comando como o abaixo:

telnet 192.168.0.1 5038

Irá aparecer a seguinte mensagem:

Asterisk Call Manager/1.0


Agora basta digitar:

Action: login
Username: mark
Secret: mysecret

Obs: Lembrando que qualquer caracter digitado errado, mesmo sendo apagado depois e corrigido faz com que o comando não funcione. Por isso não se preocupe se digitar uma palavra errada e depois apagar e o comando não funcionar. Basta digitar de novo sem errar nada. Para que isso não ocorra aconselho que tudo seja digitado em um bloco de notas e depois copiado para o prompt do DOS. Evitando erros e gardando para futura utilização dos comandos.

E dar dois [enter].
E irá aparecer a mensagem:

Response: Success
Message: Authentication accepted

Para realizar uma ligação e tranferir para um ramal pode-se usar o comando originate. Como no exemplo:

Action: Originate
Channel: SIP/123
Context: default
Exten: 123
Priority: 1

Neste exemplo eu liguei para meu próprio softphone e transferi a ligação para mim também.

Para sair basta digitar:

action: logoff

E terá como resposta:

Response: Goodbye
Message: Thanks for all the fish.
Conexão ao host perdida.

Blz, mas e ai toda vez q eu for ligar vou precisar ir no telnet?
Com isso cheguei ao Asterisk-Java. Uma biblioteca de classes em java para facilitar o acesso ao Asterisk Manager.
Para utilizar o Asterisk-Java basta criar um projeto em java e importar o arquivo .jar do Asterisk-Java para o projeto.
Após isso é só criar uma classe utilizando essa biblioteca. Como no exemplo abaixo:

import java.io.IOException;

import org.asteriskjava.manager.AuthenticationFailedException;
import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.ManagerEventListener;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.action.StatusAction;
import org.asteriskjava.manager.event.ManagerEvent;

public class HelloEvents implements ManagerEventListener
{
    private ManagerConnection managerConnection;

    public HelloEvents() throws IOException
    {
        ManagerConnectionFactory factory = new ManagerConnectionFactory(
                "192.168.0.1", "mark", "mysecret");

        this.managerConnection = factory.createManagerConnection();
    }

    public void run() throws IOException, AuthenticationFailedException,
            TimeoutException, InterruptedException
    {
        // register for events
        managerConnection.addEventListener(this);
        
        // connect to Asterisk and log in
        managerConnection.login();
        
    OriginateAction originateAction = new OriginateAction();

    originateAction.setChannel("SIP/123");

    originateAction.setContext("default");

    originateAction.setExten("123");

    originateAction.setPriority(1);

    originateAction.setTimeout(new Long(60000));


    managerConnection.sendAction(originateAction);

        
        // wait 10 seconds for events to come in
        Thread.sleep(10000);

        // and finally log off and disconnect
        managerConnection.logoff();
    }

    public void onManagerEvent(ManagerEvent event)
    {
        // just print received events
        System.out.println(event);
    }

    public static void main(String[] args) throws Exception
    {
        HelloEvents helloEvents;

        helloEvents = new HelloEvents();
        helloEvents.run();
    }
}

Essa classe faz a mesma coisa que foi feita com o telnet. Realiza uma ligação para o meu ramal e transfere o canal para o meu ramal também. Na vida real não tem muita utilidade mas para fazer um teste você só vai precisar de um X-Lite configurado com o ramal 123.

Tomara que esse tutorial possa ajudar alguém. Ou pelo menos mostrar mais uma funcionalidade do Asterisk.

Abraço a todos,

Silvio Netto
Asterisk Counter 241






-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20070118/7b8c0eec/attachment-0001.html


Mais detalhes sobre a lista de discussão AsteriskBrasil