Asterisk Manager Interface (AMI) desde Java mediante asterisk-java

6:08 pm Asterisk, Networking, Sistemas, Software Libre

Tras haber hablado del uso del AGI para ejecutar aplicaciones externas en nuestro Asterisk, hoy toca hablar de como hacer que aplicaciones externas interactúen con nuestro Asterisk a través del AMI (en este caso para obtener datos, aunque también se puede usar el AMI para efectuar acciones sobre nuestra centralita favorita).

Como hay por Internet bastante ejemplos de como acceder al AMI desde scripts BASH o desde lenguajes interpretados tipo PHP o python, he decidido preparar un pequeño ejemplo para acceder desde Java. Para ello es necesario utilizar la librería asterisk-java (que también se puede usar para hacer AGI’s), de cuya documentación he modificado ligeramente uno de sus ejemplos para adaptarlo a un uso mucho más útil en la vida real.

En primer lugar tendremos que habilitar el AMI, para lo que es necesario editar el fichero manager.conf en nustro /etc/asterisk poniendo enabled a yes en la zona general, y añadiendo un usuario tal que así:

[general]
enabled=yes

[admin]
write=system,call,log,verbose,command,agent,user
read=system,call,log,verbose,command,agent,user
secret=admin

Con el usuario creado recargamos la configuración de nuestro Asterisk, y ya podemos empezar a acceder desde nuestro programa en Java. Para conseguir lo que queremos, hemos hecho que sólo se tengan en cuenta los eventos de tipo Dial, y una vez obtenidos sacamos por pantalla el CallerId y el canal de destino. El código resultante sería el siguiente:

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;
import org.asteriskjava.manager.event.DialEvent;

public class DialEvents implements ManagerEventListener
{
private ManagerConnection managerConnection;

public DialEvents() throws IOException
{
ManagerConnectionFactory factory = new ManagerConnectionFactory(
“1.2.3.4″, “admin”, “admin”);

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();

// request channel state
managerConnection.sendAction(new StatusAction());

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

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

public void onManagerEvent(ManagerEvent event)
{
// just print received events
if(event instanceof DialEvent) {
DialEvent de = (DialEvent) event;
System.out.println(de.getCallerId() + ” llamando a ” + de.getDestination());
}

}

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

dialEvents = new DialEvents();
dialEvents.run();

}
}

Sólo nos queda compilar, ejecutar el programa y empezar a monitorizar las llamadas que se realizan en nuestra centralita:

$ java DialEvents

19-sep-2008 17:50:01 org.asteriskjava.manager.internal.ManagerConnectionImpl connect
INFO: Connecting to 192.168.2.99:5038
19-sep-2008 17:50:02 org.asteriskjava.manager.internal.ManagerConnectionImpl setProtocolIdentifier
INFO: Connected via Asterisk Call Manager/1.0
19-sep-2008 17:50:02 org.asteriskjava.manager.internal.ManagerConnectionImpl doLogin
INFO: Successfully logged in
19-sep-2008 17:50:02 org.asteriskjava.manager.internal.ManagerConnectionImpl doLogin
INFO: Determined Asterisk version: Asterisk 1.4
119 llamando a SIP/110-082121e8

Una vez que tenemos estos datos dentro de nuestro programa en Java, ya podemos proceder a realizar cualquier cosa que se nos ocurra, desde simplemente mostrarlos como hacemos aquí, hasta llegar a niveles de CTI y comunícarselo a otros programas en Java para que actualicen con la información que se crea relevante conocer sobre el llamante.

Bueno, y de momento eso es todo, tengo varios artículos en el tintero sobre varias cosas, a ver si tengo algo de tiempo para ir escribiéndolos.

Una respuesta
  1. benon :

    Date: September 24, 2008 @ 9:19 am

    Pues sí que tiene integraciones Asterisk.

    Tendré que ponerme a revisar Java…

Deja tu comentario

Tu comentario

Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Advertencia: Está habilitada la moderación de comentarios y puede verse retrasada la publicación. No es necesario que reenvies tu comentario.