domingo, 30 de octubre de 2016

AGI Asterisk - Consumir Webservice parte 1

Hoy me ha tocado consumir un webservice en Internet desde asterisk, de tal modo que se pueda llamar y enviarle el callerId, un pin y un numero de cédula o Id y que este retorne un valor para que luego el "llamante" escuche dicho valor .

primero que nada hay que pensar.... necesito ir a consultar a un sistema externo estos datos,
y pues investigando veo que hay que usar AGI (Asterisk Gateway Interface) que me permite ejecutar un script en variedad de lenguajes, como ser: C#, C, Ruby, PHP, Java, Bash entre algunos....

ahora pensemos... ¿cual de estos lenguajes es mas eficiente?

pues empecemos a analizar:
  • C# y C, son muy buenos estos son binarios, la dificultad es que si hay que cambiar algo rápido, pues hay que ir al IDE y hacer el cambio, luego compilarlo y pasar el compilado a asterisk.
  • Ruby y PHP, esta es la mejor opción de todas, y entre las dos está PHP ya que es un lenguaje muy popular y ya hay mucha documentación y librerias como ser phpagi que está desarrollada para ayudarnos con los scripts en php, hay que tener cuidado de tener instalado y corriendo php en el sistema donde tenemos instalado Asterisk de lo contrario nos podriamos topar con un "no such file or directory found" en la consola de Asterisk y el script no se ejecutará. Si todo sale bien podemos notar que PHP se ejecuta casi de manera nativa y es de facil integración al momento de hacer cambios, tanto que se puede modificar desde el sistema donde tenemos corriendo asterisk con un simple comando: nano script.php.
  • Java y Bash, estas son las menos recomendadas, Java porque al ejecutar un script, se crea una máquina virtual de java para ejecutar ese script, lo que consume mucho mas recursos, a mi ver, se debería de usar solo en caso de no tener otra alternativa por x o y razón. y Bash por que cada script agre una consola en el servidor para ejecutarse por lo que consumen muchos recursos. En definitiva, estos dos ultimos lenguajes cargan el servior por cada llamada que llama al script AGI por eso no son convenientes.
Ya tengo elegído PHP, al menos de momento. ahora lo siguiente: hay 4 tipos de AGI:
  • 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. (mas info: wikiasterisk)
yo elegiré lo que es el AGI (normal)
una vez temos estas dos cosas (el lenguaje y el tipo de AGI | [php,agi]) preparamos las librerias de phpagi para evitar problemas futuros, lo pueden descargar de su página oficial o la descargan desde aquí y las colocamos en /var/lib/asterisk/agi-bin/
en esta misma ruta pondremos los scripts a ejecutar, yo usaré uno llamado "juego.php" que me fue dado en un curso de Asterisk para usarlo como prueba.

 luego solo creamos una extension donde llamamos al AGI, podemos hacer un contexto entero para probarlo y solo allí ejecutar el script.

[context-agi]
exten => 800,1,Verbose(1|AGI)
same => n,Answer
same => n,agi(juego.php)
same => n,Hangup 

hay que tener en cuenta que debemos darle permisos al script AGI a ejecutar. lo hacemos en la consola de linux con el comando : chmod 755 script.php 
y luego de esto ya tendremos que cuando el usuario SIP al que hemos asignado el contexto [context-agi] marque a la extensión 800 primero conteste y luego ejecuta el AGI, que en este caso en un juego IVR (Interactive Voice Response) de adivinar un numero.

¡En otra entrada crearemos nuestro propio script AGI que consuma el Webservice, por ahora lo principal ya está!

ahora aquí la parte 2

No hay comentarios.:

Publicar un comentario