Howto consulta de stocks usando ASTERISK, PHPAGI y MYSQL

Hola, hace tiempo que no posteo, ya que he entrado en un training complicado, y no dispongo de mucho tiempo, pero , siempre es posible hacerse de un espacio, bueno en este pequeno howto, voy a tratar de explicar como implementar un sistema de consulta de stocks, con datos almacenados una base de datos en mysql , que será invocado vía al dialplan de asterisk y consultado usando phpagi.

Cual es la idea , podemos automatizar un sistema de consulta de productos vía nuestra central en asterisk, y así liberar un poco a nuestro departamento de ventas, además de otras aplicaciones que podamos realizar en teniendo como base esta idea.

1.- Creación de la base de datos en Mysql

#mysql -p
mysql>create database stock;
mysql>CREATE TABLE `productos` (
mysql>`producto` int(4) NOT NULL default ‘0’,
mysql>`cantidad` int(4) NOT NULL default ‘0’
mysql> );

mysql>INSERT INTO productos (producto,cantidad) VALUES (4001,5);
mysql>INSERT INTO productos (producto,cantidad) VALUES (4002,3);
mysql>SELECT * FROM productos;

2.- Implementando el dialplan en extension.conf

[local] ;contexto de todos mis anexos
exten=> _*5,1,Goto(consulta,s,1)   ;cuando marquemos *5 saltara al contexto consulta

[consulta] ;contexto para la consulta de datos
exten=> _s,1,Answer
exten=> _s,2,Background(solicita-codigo-producto) ; reproduzco un audio que pregunte  por el codigo
exten=> _s,3,Waitexten(4) ; espero 4 segundos
exten=> _XXXX,1,Set(COD=${EXTEN}) ; capturo lo digitado y lo guardo en la variable COD
exten=> _XXXX,2,AGI(consulta.php|${COD}) ; lanzo el agi y le envio la variable COD
exten=> _XXXX,3,HangUp

3. – Implementado el phpagi  , lo que hara es recibir la variable COD , se conectara con la base de datos ¨stock¨  , para esto tenemos que tener los privilegios de acceso , y luego con la consulta echa , reproducirá la cantidad encontrada en voz mediante la función SayDigits , en   ¨/var/lib/asterisk/agi-bin/¨     crear consulta.php con el siguiente código :

consulta.php

#!/usr/bin/php -q
<?php
ob_implicit_flush(true);
set_time_limit(6);
error_reporting(0);
$in = fopen(“php://stdin”,”r”);
$stdlog = fopen(“/var/log/asterisk/agi.log”, “w”);

// Habilita modo debugging (mas verbose)
$debug = true;

// Hacer las definiciones de funciones antes de empezar el bucle principal
function read() {
global $in, $debug, $stdlog;
$input = str_replace(“\n”, “”, fgets($in, 4096));
if ($debug) fputs($stdlog, “read: $input\n”);
return $input;
}

function write($line) {
global $debug, $stdlog;
if ($debug) fputs($stdlog, “write: $line\n”);
echo $line.”\n”;
}

// Colocamos headers AGI dentro de un array
while ($env=read()) {
$s = split(“: “,$env);
$agi[str_replace(“agi_”,””,$s[0])] = trim($s[1]);
if (($env == “”) || ($env == “\n”)) {
break;
}
}

// Función que conecta al banco de datos
function connect_db() {
$db_connection = mysql_connect(‘localhost’,’usuario’,’contrasena’) or die
(mysql_error());
$db_select = mysql_select_db(‘stock’) or die (mysql_error());
}

// Programa Principal
connect_db();
// Almacena valor de la variable COD en
write(“GET VARIABLE COD”);

//lee variable in
$c = fgets($in, 4096);
// reemplaza retorno de carro por espacios
$c = str_replace(“\n”,””,$c);
// quita 14 caracteres a la izquiera y 1 a la derecha
$c = substr($c,14);
$c = substr($c,0,-1);
$query = “SELECT cantidad FROM productos WHERE producto=’$c'”;
$query_result = @mysql_query($query);
$result = mysql_fetch_row($query_result);
$valor = “$result[0]”;
write(“EXEC SayDigits \” $valor \”\n”);
read();
fclose($in);
fclose($stdlog);
exit;
?>

Espero que les sirva
Saludos
Juan Oliva

Anuncios
Esta entrada fue publicada en Manuales y tutoriales por jroliva. Guarda el enlace permanente.

Acerca de jroliva

Juan Oliva, es un consultor de seguridad informática y telefonía IP con 10 años de experiencia en el campo . Muy involucrado en proyectos de pruebas de penetración , análisis y explotación vulnerabilidades, pruebas de ingeniería social, seguridad física, revisión de código, entre otras tareas de seguridad informática. Así mismo, desarrolla proyectos de implementación y mantenimiento de VoIP, basadas en Asterisk y Elastix, proyectos de callcenter, soluciones en la nube y hosted PBX, Aseguramiento de plataformas Linux, Windows. Ha estado trabajando para una variedad de empresas en donde ha desarrollado proyectos para el estado peruano, así como para entidades privadas, nacionales y del extranjero, cuenta con certificaciones vigentes en Ethical hacking, Linux y telefonía IP. Es instructor de cursos de Ethical Hacking y certificaciónes como Linux Professional Institute y Elastix, donde ha tenido oportunidad de realizar capacitaciones en el Perú, así como en el extranjero. Es investigador de vulnerabilidades, y creador de contenidos, que son publicados en su blog personal jroliva.wordpress.com el cual mantiene desde hace mas de 6 años.

22 pensamientos en “Howto consulta de stocks usando ASTERISK, PHPAGI y MYSQL

  1. hola juan quiero saber como puedo escuchar ya los datos de la base ya q marco *5 y no tengo ninguna respuesta sera que me falta algo y no le entiendo en la parte de la funcion del saydisgits espero tu comentario gracias

  2. Hola jroliva muy buena introduccion para juntar mysql y elastix.
    Te queria hacer una pregunta corta, solo queria saber que password, si alguien lo sabe, tiene mysql en elastix, pr que me canse de probar con “ElaStIx.2007” y nada,,,alguno me puede decir si esta bien?Gracias de antemano

    • HOLA, Me emociona saber que te por lo menos en el foro hay alguien a quien le funcionò podrias hecarme la mano con tu ejemplo de antemano te lo agradecerìa gracias.

  3. Hola,

    consulta…he intentado hechar a andar este ejemplo, pero al momento de ejecutar el AGI no escucho nada.

    mi consulta es SayDigits tendra conflicto con debian-asterisk 1.4 ??

    quedo atento

  4. Saludos,
    He seguido este ejemplo y no consigo que el balance de mi Base de datos sea dicho mediante Asterisk, me gustaria de su ayuda :(.

    Tengo esta configuración:
    Asterisk 1.7.1
    PHP 5.1.6 (cli) (built: Nov 29 2010 16:47:37)

    Mi Dial Plan es este:
    [ConsultaBalance-inbound]

    exten => 4005,1,Answer()
    exten => 4005,2,Read(nrocontrato,numerocuenta,4,,1,5)
    exten => 4005,n,Read(pin,nropin,4,,1,5)
    exten => 4005,n,Set(dnrocontrato=${nrocontrato})
    exten => 4005,n,Set(dpin=${pin})
    exten => 4005,n,AGI(‘/var/lib/asterisk/agi-bin/consultabalance.php’,${dnrocontrato},${dpin})
    exten => 4005,n,Set(elbalance=${ScriptResult})
    exten => 4005,n,SayNumber(${elbalance},m)
    exten => 4005,n,Hangup()

    [ConsultaBalance-outbound]
    exten => 4005,1,Answer()
    exten => 4005,n,Read(nrocontrato,numerocuenta,4,,1,5)
    exten => 4005,n,Read(pin,nropin,4,,1,5)
    exten => 4005,n,Set(dnrocontrato=${nrocontrato})
    exten => 4005,n,Set(dpin=${pin})
    exten => 4005,n,AGI(‘/var/lib/asterisk/agi-bin/consultabalance.php’,${dnrocontrato},${dpin})
    exten => 4005,n,Set(elbalance=${ScriptResult})
    exten => 4005,n,SayNumber(${elbalance},m)
    exten => 4005,n,Hangup()

    Y mi Screipt PHP es este:
    #!/usr/bin/php -q

  5. Lo que sucede es que tengo los logs activos para mi agi pero no aparecere nada, sucede que no me muestra donde esta el error por que corro mi dialplan me pide codigo de producto pero luego se cuelga. se alcanza a ver que se envia el codigo del producto pero no mas y ya lo he revisado almenos 6 veces me ayudan porfavor.

  6. Hola jroliva, me parece muy interesante tu ejemplo, soy nuevo en asterisk y en php, quiero implementar esomismo pero para buscar en la base de datos si el numero telfonico que esta llamando existe o no, me podrias ayudar un poco por favor?, te dejo mi correo, muchas gracias.

    lcastellanosa@hotmail.com

  7. Hola estas son recomendaciones generales :

    1.- Dialplan hacia AGI
    Asegurarse que los datos en las variables estén siendo capturadas y enviadas correctamente hacia el AGI , para esto ayuda usar en el dialplan NOOP(${VARIABLE})

    2.- El programa AGI.
    Aqui viene realmente el tema , ya que asterisk no te dice si hay un error en el AGI , si le falta una coma o una variable esta mal definida, la recomendacion es ir de menos a mas , primero asegurarse que estan recibiendo bien las variables , luego que la conexión a la base de datos este correcta , luego que la consulta a la BD que el SQL este correcto y finalmente que estén devolviendo las variables hacia el dialplan bien, para superar errores básicos les recomiendo hacer en la consola de Linux

    php programa.php

    de esa forma saldrán los errores básicos que tengan en sintaxis.

    3.- Recibir las variables del AGI en el dialplan
    Aquí lo básico es hacer NOOP(${VARIABLE}) de la variable que recibes para ver si el AGI retorno lo que esperabas, si no vas cercando donde esta el problema en el envío , el AGI o la recepción.

    Finalmente de manera general y se los repito en todos los cursos que desarrollo en Asterisk que dicto, tienen que saber leer el CLI de Asterisk , si no lees CLI mejor no te metas en estas cosas.

    Espero les sirva
    Saludos.
    Juan Oliva

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s