Diferencia entre revisiones de «AGI»

De Asterisk Wiki
Ir a la navegación Ir a la búsqueda
 
(No se muestran 10 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
{{Format}}
+
Asterisk Gateway Interface (AGI), o Interfaz Pasarela de Asterisk, es una interfaz del sistema Asterisk, que permite la comunicación con sistemas terceros, pero a diferencia de [[AMI]], lo hace de forma directa, dado que ejecuta un script a voluntad, tan pronto la aplicación AGI sea invocada.
{{ToDo}}
 
  
Asterisk Gateway Interface (AGI), o Interfaz Pasarela de Asterisk, es una interfaz del sistema Asterisk, que permite la comunicación con sistemas terceros, pero a diferencia de [[AMI]], lo hace de forma directa, dado que ejecuta un script a voluntad, tan pronto la aplicación AGI sea invocada.
+
{{Centrar|{{#Widget:AdSense}}}}
  
 
__TOC__  
 
__TOC__  
 
[[Image:logo_asterisk.png|thumb|Logo Asterisk|right|200px]]
 
  
 
== Funcionamiento ==
 
== Funcionamiento ==
Línea 18: Línea 15:
 
* El script puede ejecutar cualquier algoritmo, y entre sus secuencias, puede ejecutar comandos específicos de AGI para influenciar en el flujo de llamada en curso. Este script puede perdurar en ejecución incluso después de finalizar la llamada.
 
* El script puede ejecutar cualquier algoritmo, y entre sus secuencias, puede ejecutar comandos específicos de AGI para influenciar en el flujo de llamada en curso. Este script puede perdurar en ejecución incluso después de finalizar la llamada.
  
== Pasarelas AGI ==
+
=== Pasarelas AGI ===
  
 
La pasarela AGI se establece directamente desde el Plan de Marcación, utilizando una de varias aplicaciones disponibles para efectuar esta gestión. Las disponibles actualmente son:
 
La pasarela AGI se establece directamente desde el Plan de Marcación, utilizando una de varias aplicaciones disponibles para efectuar esta gestión. Las disponibles actualmente son:
Línea 30: Línea 27:
 
* Async AGI: Se establece una conexión con [[AMI]], y el flujo se realizaría a través de dicha interfaz. Podría servir como una capa de abstracción de AMI dado que se considera de alguna forma un CTI y los problemas de estándares que acarrea.
 
* Async AGI: Se establece una conexión con [[AMI]], y el flujo se realizaría a través de dicha interfaz. Podría servir como una capa de abstracción de AMI dado que se considera de alguna forma un CTI y los problemas de estándares que acarrea.
  
== Variables de Entrada ==
+
=== Variables de Entrada ===
  
 
En el momento que se establece la conexión AGI con cualquiera de las Pasarelas, se lanzan todas las variables a la aplicación y estas son accesibles. Las variables tienen mucho que ver con el canal en curso, e incluso podemos mandar variables especificas de canal y otras posibilidades más concretas:
 
En el momento que se establece la conexión AGI con cualquiera de las Pasarelas, se lanzan todas las variables a la aplicación y estas son accesibles. Las variables tienen mucho que ver con el canal en curso, e incluso podemos mandar variables especificas de canal y otras posibilidades más concretas:
Línea 38: Línea 35:
 
* '''agi_language''': El idioma seleccionado en el canal que ejecuta AGI.
 
* '''agi_language''': El idioma seleccionado en el canal que ejecuta AGI.
 
* '''agi_type''': El tipo de canal ([[SIP]], [[IAX]], etc)
 
* '''agi_type''': El tipo de canal ([[SIP]], [[IAX]], etc)
 +
* '''agi_uniqueid''': Identificador único para el canal
 +
* '''agi_version''': Versión del sistema Asterisk en uso
 +
* '''agi_callerid''': El identificador del llamante, de la llamada en curso
 +
* '''agi_dnid''': El número marcado asociado al canal AGI
 +
* '''agi_rdnis''': El número de redirección en caso que lo hubiera, asociado al canal, en otro caso pondría "unknown"
 +
* '''agi_context''': El contexto donde se ejecuto la aplicación AGI
 +
* '''agi_extension''': La extensión del contexto
 +
* '''agi_priority''': La prioridad de la extensión
 +
* '''agi_enhanced''': Indicación de si eAGI o AGI fue utilizado (1 significa que eAGI fue utilizado)
 +
* '''agi_accountcode''': Código de cuenta en caso que utilicemos un sistema de '''billing'''
 +
* '''agi_threadid''': El numero de proceso en el que Asterisk esta ejecutando la aplicación
 +
* '''agi_arg_<numero>''': Considerando que '''numero''' puede ser cualquier numero natural, es la variable que almacena los argumentos que pasamos directamente desde la aplicación AGI, podría considerarse un método puro de entrada.
 +
 +
=== Procesamiento y Comandos ===
 +
 +
Una vez que la pasarela ha sido establecida, y los variables asignadas, llega el momento de aprovecharlo para lanzar los comandos a voluntad con la intención de interactuar desde fuera de nuestra máquina con nuestro sistema Asterisk.
 +
 +
Para ello existen una serie de comandos específicos que ejecutarán diversas funcionalidades del sistema como podemos ver algunos significativos a continuación <ref>[http://www.voip-info.org/wiki/view/Asterisk+AGI#AGIcommands Lista Comandos AGI] Olle E. Johansson (2003)</ref> <ref>[http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/AGI-communication.html#AGI_id269002 Comandos AGI Asteirsk 1.8] Leif Madsen, Jim Van Meggelen y Russell Bryant (2010)</ref>:
 +
 +
* '''ANSWER''': Responde la llamada entrante
 +
* '''CHANNEL STATUS''': Podemos sacar el estado de la llamada (contestada, llamando, o no responde)
 +
* '''DATABASE DEL/DELTRE/GET/PUT''': Comandos basicos para editar valores en [[AstDB]]
 +
* '''EXEC''': Ejecuta cualquiera aplicación como si estuviera en el Plan de Marcación
 +
* '''GET DATA''': Recibe los tonos [[DTMF]] marcados por el llamante
 +
* '''NOOP''': Igual que la [[Aplicaciones Básicas|Aplicación NoOp()]]
 +
* '''SAY ALPHA''': Dice como audio una cadena de caracteres
 +
* '''RECORD''': Tiene un funcionamiento similar a la [[Aplicaciones Básicas|aplicación Record()]] para grabar un sonido temporalmente.
 +
* '''SET VARIABLE''': Podemos pasar una variable con contenido, a nuestro Plan de Marcación
 +
 +
== Entornos de Programación ==
 +
 +
[[Image:php_logo.png|thumb|Logo PHP|right|200px]]
 +
 +
Considerando que los comandos se pasan a Asterisk por la salida estándar e igual que ocurre con las variables que entran en nuestro script por la entrada, quiere decir que son escalables prácticamente a cualquier sistema o lenguaje de programación que pueda establecer esta comunicación con nuestro sistema UNIX.
 +
 +
Por tanto con la introducción de AGI, surgieron diferentes Interfaces de Programación de Aplicaciones (Application Programming Interface, API) para los lenguajes de programación más populares, y con esto se introdujo la posibilidad de convertir nuestros sistemas Asterisk en potentes [[Dialplan Avanzado|IVRs]] de una forma relativamente sencilla.
 +
 +
La mayoría de las API para los diferentes lenguajes se basan en el paradigma de la Programación Orientada a Objetos con la intención de diseñar una clase llamada AGI, incorporando una serie de métodos especificos para tratar todos y cada uno de los comandos, e incluso, para recibir todas las variables de entrada.
 +
 +
=== PHP ===
 +
 +
Existe una variedad de API y Frameworks para PHP, los más destacados:
 +
 +
* [http://phpagi.sourceforge.net/ PHPAGI], es el más popular con diferencia, y simple de aplicar
 +
* [https://code.google.com/p/agispeedy/ AGISpeedy], es un servidor AGI, creado en PHP.
 +
 +
==== Instalando PHP-AGI ====
 +
 +
El metodo de instalación de PHP-AGI es muy sencillo, considerando que simplemente debemos meter la API en el directorio de AGI por defecto '''/var/lib/asterisk/agi-bin/''':
 +
 +
{{Comando|cd /usr/src}}
 +
{{Comando|wget http://sourceforge.net/projects/phpagi/files/latest/ -O phpagi.tgz}}
 +
{{Comando|tar –xvf phpagi.tgz}}
 +
{{Comando|mkdir /var/lib/asterisk/agi-bin/phpagi}}
 +
{{Comando|cp -r /usr/src/phpagi-<version_phpagi>/* /var/lib/asterisk/agi-bin/phpagi/}}
 +
 +
=== Perl ===
 +
 +
Tenemos componentes similares a los de otros lenguajes de programación como:
 +
 +
* [http://www.freeiris.org/agispeedy AGISpeedy para Perl], un servidor AGI, pero basado en PERL
 +
* [http://asterisk.gnuinter.net/ Asterisk Perl], es un framework basado en PERL para interaccionar con AGI
 +
 +
=== Python ===
 +
 +
También podemos encontrar una varidad de complementos:
 +
 +
* [http://starpy.sourceforge.net/ StarPy], sirve tanto para interactuar con [[AMI]] como con FastAGI
 +
* [http://sourceforge.net/projects/pyst/ Pyst], API Python para gestionar AGI
 +
 +
=== C ===
  
 +
Para el lenguaje principal de Asterisk también existen extensiones:
  
agi_type SIP The channel type for agi_channel.
+
* [http://sourceforge.net/projects/cagi/ cAGI], es un API específico para promover programas basados en AGI
agi_uniqueid 1284382003.9 The uniqueidof agi_channel.
+
* [http://sourceforge.net/projects/quivr/ QuIVR], hace referencia a QuickIVR para poder diseñar IVR basados en AGI, en lenguaje de programación C
agi_version 1.8.0-beta4 The Asterisk version in use.
 
agi_callerid 12565551212 The full caller ID string that is set on agi_channel.
 
agi_callerid
 
name
 
Russell Bryant The caller ID name that is set on agi_channel.
 
agi_callingpres 0 The caller presentation associated with the caller ID set on
 
agi_channel. For more information, see the output of core
 
show function CALLERPRESat the Asterisk CLI.
 
agi_callingani2 0 The caller ANI2 associated with agi_channel.
 
agi_callington 0 The caller ID TON (Type of Number) associated with
 
agi_channel.
 
agi_callingtns 0 The dialed number TNS (Transit Network Select) associated
 
with agi_channel.
 
agi_dnid 7010 The dialed number associated with agi_channel.
 
agi_rdnis unknown The redirecting number associated with agi_channel.
 
agi_context phones The context of the dialplan that agi_channelwas in when
 
it executed the AGI()or EAGI()application.
 
agi_extension 500 The extension in the dialplan that agi_channelwas exe-cuting when it ran the AGI()or EAGI()application.
 
agi_priority 1 The priority of  agi_extensionin  agi_contextthat exe-cuted AGI()or EAGI().
 
agi_enhanced 0.0 An indication of whether AGI()or EAGI()was used from
 
the dialplan. 0.0indicates that AGI()was used. 1.0indi-cates that EAGI()was used.
 
agi_accountcode myaccount The accountcodeassociated with agi_channel.
 
agi_threadid 140071216785168 The threadidof the thread in Asterisk that is running the
 
AGI()or EAGI()application. This may be useful for associ-ating logs generated by the AGI application with logs generated
 
by Asterisk, since the Asterisk logs contain thread IDs.
 
agi_arg_<argu
 
ment number>
 
my argument These variables provide the contents of the additional argu-ments provided to the AGI()or EAGI()application
 
  
 
== Referencias ==
 
== Referencias ==
Línea 78: Línea 119:
  
 
* [[AMI]]
 
* [[AMI]]
 +
* [[Dialplan Avanzado#Interactive Voice Response|IVR]]
  
 
== Enlaces Externos ==
 
== Enlaces Externos ==
  
* [http://www.10000horas.com 10000 Horas] es un ejemplo de enlace externo
+
* [http://phpagi.sourceforge.net/ PHP AGI], página oficial del proyecto PHP-AGI
  
[[Categoría:General]]
+
[[Categoría:Avanzado‏‎]]

Revisión actual del 17:46 6 jul 2014

Asterisk Gateway Interface (AGI), o Interfaz Pasarela de Asterisk, es una interfaz del sistema Asterisk, que permite la comunicación con sistemas terceros, pero a diferencia de AMI, lo hace de forma directa, dado que ejecuta un script a voluntad, tan pronto la aplicación AGI sea invocada.

Funcionamiento

La interfaz AGI, fue diseñada originalmente, para servir de pasarela entre los distintos lenguajes de programación y Asterisk específicamente, los canales de comunicación especialmente.

El funcionamiento de AGI es relativamente sencillo:

  • Primero hay que establecer una pasarela, entre el canal en curso, y un script ejecutable a voluntad.
  • Cuando la conexión se establece, lanza una serie de variables al script ejecutado, que son accesibles desde el mismo. La mayoría de estas variables tienen algo que ver con el canal
  • El script puede ejecutar cualquier algoritmo, y entre sus secuencias, puede ejecutar comandos específicos de AGI para influenciar en el flujo de llamada en curso. Este script puede perdurar en ejecución incluso después de finalizar la llamada.

Pasarelas AGI

La pasarela AGI se establece directamente desde el Plan de Marcación, utilizando una de varias aplicaciones disponibles para efectuar esta gestión. Las disponibles actualmente son:

  • AGI: Sería la aplicación estándar. Ejecuta la aplicación en la misma máquina que asterisk, y se abre un flujo de entrada y salida clásico por la entrada y salida asociada correspondiente.
  • EAGI: Hace referencia a Enhanced AGI, es exactamente igual que AGI, pero además se incorpora a la entrada, el canal en curso, pero solo en modo "lectura".
  • Fast AGI: Se diferencia de AGI, dado que el proceso se establece a través de una conexión TCP/IP (el flujo de información), concretamente por el puerto 4573, y de esta forma es posible liberar el "peso" de la máquina Asterisk de forma bastante eficiente
  • Async AGI: Se establece una conexión con AMI, y el flujo se realizaría a través de dicha interfaz. Podría servir como una capa de abstracción de AMI dado que se considera de alguna forma un CTI y los problemas de estándares que acarrea.

Variables de Entrada

En el momento que se establece la conexión AGI con cualquiera de las Pasarelas, se lanzan todas las variables a la aplicación y estas son accesibles. Las variables tienen mucho que ver con el canal en curso, e incluso podemos mandar variables especificas de canal y otras posibilidades más concretas:

  • agi_request: Ese nombre de la aplicación externa AGI que va a ser ejectuada en caso de ser AGI/eAGI, para el caso de FastAGI, es la URL que ejecutara el proceso en la máquina remota
  • agi_channel: El nombre del canal que ha ejecutado AGI
  • agi_language: El idioma seleccionado en el canal que ejecuta AGI.
  • agi_type: El tipo de canal (SIP, IAX, etc)
  • agi_uniqueid: Identificador único para el canal
  • agi_version: Versión del sistema Asterisk en uso
  • agi_callerid: El identificador del llamante, de la llamada en curso
  • agi_dnid: El número marcado asociado al canal AGI
  • agi_rdnis: El número de redirección en caso que lo hubiera, asociado al canal, en otro caso pondría "unknown"
  • agi_context: El contexto donde se ejecuto la aplicación AGI
  • agi_extension: La extensión del contexto
  • agi_priority: La prioridad de la extensión
  • agi_enhanced: Indicación de si eAGI o AGI fue utilizado (1 significa que eAGI fue utilizado)
  • agi_accountcode: Código de cuenta en caso que utilicemos un sistema de billing
  • agi_threadid: El numero de proceso en el que Asterisk esta ejecutando la aplicación
  • agi_arg_<numero>: Considerando que numero puede ser cualquier numero natural, es la variable que almacena los argumentos que pasamos directamente desde la aplicación AGI, podría considerarse un método puro de entrada.

Procesamiento y Comandos

Una vez que la pasarela ha sido establecida, y los variables asignadas, llega el momento de aprovecharlo para lanzar los comandos a voluntad con la intención de interactuar desde fuera de nuestra máquina con nuestro sistema Asterisk.

Para ello existen una serie de comandos específicos que ejecutarán diversas funcionalidades del sistema como podemos ver algunos significativos a continuación [1] [2]:

  • ANSWER: Responde la llamada entrante
  • CHANNEL STATUS: Podemos sacar el estado de la llamada (contestada, llamando, o no responde)
  • DATABASE DEL/DELTRE/GET/PUT: Comandos basicos para editar valores en AstDB
  • EXEC: Ejecuta cualquiera aplicación como si estuviera en el Plan de Marcación
  • GET DATA: Recibe los tonos DTMF marcados por el llamante
  • NOOP: Igual que la Aplicación NoOp()
  • SAY ALPHA: Dice como audio una cadena de caracteres
  • RECORD: Tiene un funcionamiento similar a la aplicación Record() para grabar un sonido temporalmente.
  • SET VARIABLE: Podemos pasar una variable con contenido, a nuestro Plan de Marcación

Entornos de Programación

Logo PHP

Considerando que los comandos se pasan a Asterisk por la salida estándar e igual que ocurre con las variables que entran en nuestro script por la entrada, quiere decir que son escalables prácticamente a cualquier sistema o lenguaje de programación que pueda establecer esta comunicación con nuestro sistema UNIX.

Por tanto con la introducción de AGI, surgieron diferentes Interfaces de Programación de Aplicaciones (Application Programming Interface, API) para los lenguajes de programación más populares, y con esto se introdujo la posibilidad de convertir nuestros sistemas Asterisk en potentes IVRs de una forma relativamente sencilla.

La mayoría de las API para los diferentes lenguajes se basan en el paradigma de la Programación Orientada a Objetos con la intención de diseñar una clase llamada AGI, incorporando una serie de métodos especificos para tratar todos y cada uno de los comandos, e incluso, para recibir todas las variables de entrada.

PHP

Existe una variedad de API y Frameworks para PHP, los más destacados:

  • PHPAGI, es el más popular con diferencia, y simple de aplicar
  • AGISpeedy, es un servidor AGI, creado en PHP.

Instalando PHP-AGI

El metodo de instalación de PHP-AGI es muy sencillo, considerando que simplemente debemos meter la API en el directorio de AGI por defecto /var/lib/asterisk/agi-bin/:

# cd /usr/src


# wget http://sourceforge.net/projects/phpagi/files/latest/ -O phpagi.tgz


# tar –xvf phpagi.tgz


# mkdir /var/lib/asterisk/agi-bin/phpagi


# cp -r /usr/src/phpagi-<version_phpagi>/* /var/lib/asterisk/agi-bin/phpagi/


Perl

Tenemos componentes similares a los de otros lenguajes de programación como:

Python

También podemos encontrar una varidad de complementos:

  • StarPy, sirve tanto para interactuar con AMI como con FastAGI
  • Pyst, API Python para gestionar AGI

C

Para el lenguaje principal de Asterisk también existen extensiones:

  • cAGI, es un API específico para promover programas basados en AGI
  • QuIVR, hace referencia a QuickIVR para poder diseñar IVR basados en AGI, en lenguaje de programación C

Referencias

  1. Lista Comandos AGI Olle E. Johansson (2003)
  2. Comandos AGI Asteirsk 1.8 Leif Madsen, Jim Van Meggelen y Russell Bryant (2010)

Véase también

Enlaces Externos

  • PHP AGI, página oficial del proyecto PHP-AGI