jueves, 10 de noviembre de 2016

AGI Asterisk - Consumir Webservice parte 2

<- Primera parte
Ya estamos en la parte dos... necesitamos aun dos cosas, unos repositorios Extra llamados EPEL en centros. para ello ejecutamos el comando: yum install epel-release
la segunda cosa es, unas librerías para manejar Webservices con php, para ello ejecutamos el comando: yum install php-soap

Ahora editamos con nano el archivo de configuración de php con el comando: nano /etc/php.ini
al final del archivo escribimos la siguiente línea:
extension='/usr/lib/php/modules/soap.so'

también ocupamos las clases de nusoap para manejar mas fácilmente el webservice
puedes descargarla de aquí. estas librerías las colocas junto con las de php-agi en /var/lib/asterisk/agi-bin  yo elegí colocarlas dentro de una carpeta llamada nusoap para tener mas orden, eso si, tenerlo en mente al momento de hacer el AGI,
como pueden ver allí están las librerías php junto con los AGI's


y reiniciamos Asterisk, ya con eso debería de estar instalado lo necesario.

Ahora si, a programar el AGI que consuma el Webservice.

El Webservice que tengo de prueba es sencillo, solo para asegurarse de que el AGI se conecte, envíe los parámetros correctos y reciba otro parámetro.

Para ello, mi Webservice pide dos parámetros, el CallerId y un numero (password) dependiendo de este último, se devolverá un valor.

aquí les dejo la muestra de mi archivo pruebaws2.php (AGI)

#!/usr/bin/php -q
<?php
    include 'phpagi.php';
    require_once 'nusoap/nusoap.php'; //incluimos las librerias de phpagi y nusoap
 
    $agi =new AGI();     // creamos un objeto de la clase AGI
    $agi->answer();     // contestamos el canal
    $callerId=$agi->request[agi_callerid]; // obtiene el CallerId
    //Variables
    $pass = $agi->get_data('please-enter-your');
    $pass = $pass['result'];
    $agi->verbose('ingrese su...'.$callerId.'-'.$pass);// utilizamos verbose para ir depurando que todo valla bien
    //**************************Obtener resultados del WebService
    $cliente = new nusoap_client('http://192.168.22.110/asteriskTest002.netEnvironment/apruebaAGIws.aspx?wsdl',true);
    $parametros = array('Callerid'=>$callerId,'Pass'=>$pass); //parametros que resibe el webService
    $respuesta = $cliente->call("Execute",$parametros); //Execute es el metodo del WS que deseo llamar
    $saldo=$respuesta['Saldo'];
    $agi->verbose('Respuesta:'.$saldo);          //parametros de salida del webservice
    $agi->say_number($saldo);

$agi->hangup();
?>

recuerden darle permisos con chmod 755 pruebaws2.php de lo contrario no funcionará... además hacer el archivo en el mismo linux para evitar problemas con el juego de caracteres, en caso de algún problema, les dejo el archivo php ya con permisos de ejecución, pueden descargarlo aquí 

lunes, 31 de octubre de 2016

Instalar PHP y MySQL en Centos 6 - Asterisk AGI

ahora quiero mostrar como instalar PHP, MySQL y ODBC en Centos 6 para ser utilizados en los scripts AGIs en lenguaje PHP.

yum -y install php-cli php-mysql mysql-server mysql-devel mysql-connector-odbc unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel

tengan en cuenta que se instalan las versiones developer que son las recomendadas. Tambien vean que hay mayúsculas y minúsculas, todos esos comandos van en una sola línea, si ustedes gustan pueden tambien instalarlos de dos en dos, poniendo "yum -y install"  y separados de espacio los siguientes dos elementos del comando, cada elemento está separado por un espacio.
luego para checkar e iniciar MySQL damos los siguientes comandos:

chkconfig mysql on

/etc/init.d/mysqld start

las dos lineas son comandos separados. al ejecutarse el segundo  comando nos mostrará la información de inicio de MySQL

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