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.

21 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

    • Hola me puedes escribir a yelmox de gmail y te envio un ejemplo completamente funcional, tuve mucha dificultad para poder echar a andar esto, luego de conseguirlo, quiero compartir el conocimiento con todo el que le interese.

      • mis cordiales amigo si puedes hacerme llegar el ejemplo con todas las especificaciones te lo agradeciria mucho viejo otra cosa si tienes algo parecido a la creacion de un ivr que consulte a una base de datos mysql y regrese en dtmf el valor por favor agradecido…. estoy trabajando en mi tesis y estoy desarrollando pasantias en una empresa muy prestigiosa en venezuela por favor viejo gracias estare atento a tu ayuda

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 )

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 )

Google+ photo

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

Conectando a %s