Primeros pasos con AMI

23 Ene

AMI o Asterisk Manager Interface permite la conexión de un cliente a una instancia de Asterisk para ejecutar comandos o leer eventos sobre TCP/IP.

El título tal vez no sea prometedor a quienes ya hayan hecho algunas cosas con AMI, pero el objetivo es mostrar una pequeña aplicación que genera llamadas y les envía una grabación predeterminada.

Antes de comenzar directamente con AMI, es necesario tener configurada una extensión SIP para realizar las pruebas, y el contexto que queremos que se ejecute al llevarse a cabo la llamada.

En el archivo casi siempre ubicado en /etc/asterisk/sip.conf, configuramos una extensión:

null   
[5000]
type=friend
secret=5000
host=dynamic
dial=SIP/5000
context=from-internal

Y en el archivo /etc/asterisk/extensions.conf creamos el contexto:

null   
[adodm]
;Auto-Dial Out Deliver Message Context
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Background(tt-monkeys)
exten => s,n,Hangup

Primero se debe permitir la conexión desde el archivo manager.conf de Asterisk, generalmente se encuentra en /etc/asterisk/manager.conf:

null   
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0 
 
[adodm]
secret = 123456
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.255
read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate

En la sección [general] vemos habilitada la interfaz, el valor del puerto que corresponder al valor por defecto, y el acceso habilitado desde cualquier máquina.

La sección [adodm] corresponde a los valores con los cuales se va a llevar a cabo la conexión, adodm es el nombre de usuario, luego sigue…, se prohibe el acceso desde cualquier pc para luego habilitarlo solo localmente, a continuación siguen las operaciones de lectura y escritura que se pueden hacer sobre los elementos de asterisk, cada uno de esos elementos se explicarán en detalle en otro momento, en esta configuración se están dando todos los permisos posibles.

Se guardan los cambios sobre el archivo y se recarga el módulo:

null   
sudo asterisk -rx "module reload manager"

Se puede verificar si la conexión funciona por medio de telnet:

null   
telnet localhost 5038

La salida debe ser algo como esto:

Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]’.
Asterisk Call Manager/1.0

Hasta aquí se ha verificado que el sistema está escuchando por el puerto, sin embargo, se puede interactuar un poco más; Asterisk Manager provee dos facilidades principales de comunicación, Eventos y Acciones. Los Eventos son invocados por varias partes de Asterisk, pueden ser drivers de canal, aplicaciones, recursos o cualquier otro componente conectado directamente al core de Asterisk. El propósito de un evento es permitir a un sistema externo, obtener información de Asterisk a partir de la recolección, análisis y correlación de dichos eventos, y la inicialización de acciones de acuerdo con la información obtenida. Las Acciones proveen un método que permite a un sistema externo, enviar comandos operacionales a Asterisk pidiéndole que desempeñe una tarea específica. Mientras una acción puede resultar en efectos operacionales verdaderos, tales como originar una llamada, también sucede que nuevos eventos empiezan a ser enviados por Asterisk Manager con nueva información.

Veamos algunas de esas acciones, las cuales permitirán llevar a cabo la llamada:

null   
Action: Login
Username: adodm
Secret: 123456

Luego de dar enter, hay que dar un enter nuevamente, el sistema responderá con:

Response: Success
Message: Authentication accepted

Lo anterior muestra la forma en la que se han enviado las acciones al Manager Interface, de forma general sería:

Action: <Action Type><crlf>
<key 1>: <value 1><crlf>
<key 2>: <value 2><crlf>

Variable: <variable 1>=<value 1><crlf>
Variable: <variable 2>=<value 2><crlf>

<crlf>

Luego de habernos logueado, se procede:

null   
Action: Originate
Channel: SIP/5000
Context: adodm
Exten: s
Priority: 1

No olvidemos el otro enter; un ejemplo de las variables sería colocar junto con lo anterior:

null   
Variable: origen_llamada=JhonDoe

Finalmente, para cerrar la conexión, enviamos la acción Logoff.

null   
Action: Logoff

Ahora se hará lo mismo pero con php. Se hace uso de la clase phpagi-asmanager, en el archivo se requiere phpagi.php, pero este incluye phpagi-asmanager.

null   
<?php
 
$astHost = "localhost";
$astUser = "adodm";
$astPass = "123456";
 
require "phpagi.php";
 
$astManager = new AGI_AsteriskManager();
$astRess = $astManager->connect($astHost, $astUser, $astPass);
 
if(!$astRess) {
  syslog(LOG_INFO, "Connection to Asterisk Manager failed.");
  die(100);
} else {
  $channel = "SIP/5000";
  $exten = "s";
  $context = "adodm";
  $priority = 1;
 
  $astRess = $astManager->Originate($channel, $exten, $context, $priority);
 
  echo "Dump of returned data:\n";
  foreach($astRess as $var=>$val)
      echo "$var = $val\n";
}
 
$astManager->disconnect();
 
?>

Acerca del autor

Christian Gutierrez ha escrito 22 publicaciones en este blog.

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why. – Anonymous Developer

2 Comentarios a “Primeros pasos con AMI”

  1. jorge 19 octubre, 2011 at 10:59 #

    Que tal me parece interesante tu explicacion quiero realizar una interfaz para asterisk, solo que es un poco confuso como interactua la base de datos con asterisk y de que manera obtener los datos

    quisiera saber si me puede proporcionar como crear usuarios directamente desde un formulario con php y de que manera consulta cada una de ellos para saber cuantas llamadas han ralizado aquien etc… bueno espero puedas ayudarme un poc gracias

    • Chesstrian 19 octubre, 2011 at 12:29 #

      Hola Jorge, gracias por tus comentarios.

      Quisiera que nos contaras un poco más sobre lo que quieres que haga tu interfaz para poder ayudarte; en esta publicación usamos un usuario para el manager, por medio del cuál se puede obtener información de Asterisk, pero cuando hablas de un usuario, te refieres también a cuántas llamadas ha realizado, por lo que debe estar asociado a una extensión, generalmente SIP o IAX2; según entiendo, quieres algo más administrativo, inicialmente pienso que no es necesario que uses lo que en esta publicación se explica, estaremos atentos a tu comentario para ayudarte.

Deja un comentario