VOZ logo
6248

Cómo programar un AGI en PHP sin librerías raras

Muchas personas que están aprendiendo Asterisk y que ya conocen las posibilidades de esta aplicación, quieren empezar a desarrollar sus propias soluciones para que Asterisk pueda interactuar con bases de datos, archivos del sistema de ficheros y en función de algún valor, conseguir que Asterisk haga una llamada, reproduzca una locución, o mil cosas más.

Esto se realiza gracias a un concepto en Asterisk llamado AGI (Asterisk Gateway Interface) y que viene a ser un programa desarrollado por nosotros (o por otro usuario) que Asterisk ejecuta (importante esto último) y que sirve para que interactúe Asterisk con el sistema Linux, pudiendo acceder a archivos locales, puertos físicos (usb, puertos series, paralelos, etc.), bases de datos, páginas webs, y prácticamente cualquier otra cosa que pueda manejar nuestro sistema Linux.

No voy a entrar en la «profundidad» en la que se entra en el curso Asterisk Advanced, pero sí ofrecer un esqueleto básico de un AGI programado en PHP sin necesidad de librerías externas y utilizando una programación muy sencilla (ideal para empezar a familiarizarse con este tipo de sistemas de integración Asterisk-*)

A continuación tenéis un ejemplo ultra-básico sobre cómo puede ser un AGI programado en PHP y sin necesidad de librerías tipo «php-agi» ni «AstPHPAGI», ni ninguna otra, tan solo tu Asterisk, tú y PHP con sus modulitos.

Debo decir que este ejemplo no lo he programado yo, pero para ilustrar el ejemplo sirve igualmente.

Los comentarios sí son míos y creo que ayudan bastante a entender cómo funciona y qué precauciones debemos tomar antes, durante y después de programar un AGI.

También sé que para muchos, programar un AGI no tiene ninguna ciencia, pero hay que entender que muchos lectores se consideran muy, muy novatos, así que para seguir aprendiendo, aquí tenéis este ejemplo:

#!/usr/bin/php
<?php

// Lo primero es entrar en el Asterisk y ejecutar el comando: "agi set debug on" para ver 
// qué va haciendo el AGI.
// Hay que evitar enviar por la "salida estandar" nada, salvo los comandos para el Asterisk.

// El Asterisk nada más ejecutar el AGI, nos envía información para aburrir...
 $agivars = array();
 while (!feof(STDIN)) {
    $agivar = trim(fgets(STDIN));
    if ($agivar === '') {
      break;
    }
    $agivar = explode(':', $agivar);
    $agivars[$agivar[0]] = trim($agivar[1]);
 }

// la variable $agivars es un array bidimensional con los datos recogidos por el Asterisk
// Un ejemplo de esto puede ser:
// exten=>00,1,AGI(prueba.php,600123456)
/*
Array
 (
 [agi_request] => prueba.php    ;; Nombre del archivo que contiene el AGI que está ejecutando.
 [agi_channel] => SIP/100-00000008   ;; Canal SIP que llama al AGI. (canal, que no usuario)
 [agi_language] => en           ;; Idioma por defecto del canal
 [agi_type] => SIP              ;; tipo de Tecnología utilizada para llamar al AGI
 [agi_uniqueid] => 1305795790.9 ;; UniqueID de la "llamada al AGI"
 [agi_version] => 1.8.4         ;; Versioń del sistema AGI utilizado. ¿coincide con el Asterisk?
 [agi_callerid] => 100          ;; CallerID del usuario que ejecuta el AGI
 [agi_calleridname] => 100      ;; CallerIDname del usuario que ejecuta el AGI
 [agi_callingpres] => 0         ;; ...
 [agi_callingani2] => 0         ;; ...
 [agi_callington] => 0          ;; ...
 [agi_callingtns] => 0          ;; ...
 [agi_dnid] => 00               ;; Número marcado en el dialplan para llamar al AGI
 [agi_rdnis] => unknown         ;; ...
 [agi_context] => salientes     ;; Contexto donde se ejecuta el AGI
 [agi_extension] => 00          ;; Extensión donde se ejecuta el AGI
 [agi_priority] => 1            ;; Prioridad donde se ejecuta el AGI
 [agi_enhanced] => 0.0          ;; Agi "mejorado" 
 [agi_accountcode] =>           ;; El AccountCode (si lo hemos definido)
 [agi_threadid] => -1239581840  ;; ...
 [agi_arg_1] => 600123456       ;; Argumento 1 del AGI (el Argumento 0 es el nombre del AGI)
 [agi_arg_2] =>                 ;; Argumento 2 del AGI
 ...                            ;; ...
 )
*/

// Vamos a decirle a Asterisk que haga un Dial al número que le hemos pasado por parámetro:

echo "EXEC Dial DAHDI/g1/".$agivars[agi_arg_1];

// Podemos usar los comandos propios de los AGI (como hemos usado el 'EXEC') que podemos obtener
// ejecutando en la consola "agi show commands" o "agi show commands topic <comando>" para una
// información más detallada de cada comando.

// Importante... despues del "?" y el ">" del 'fin del PHP' no debe haber ni siquiera un [ENTER]... 
// ya que en caso contrario, Asterisk devolverá un error del tipo:
//   ERROR[24598]: utils.c:1133 ast_carefulwrite: write() returned error: Broken pipe
?>

El código no puede ser más sencillo, quizá lo más interesante pueden ser los comentarios que explican el comienzo y los comandos básicos para programar un AGI.

 

Anterior artículoCómo instalar Asterisk en un gateway Mediatrix
Siguiente artículo 6304-6248Un pequeño capítulo sobre Asterisk para entender algunas cosas