Inicio > Manuales y tutoriales > Howto consulta de stocks usando ASTERISK, PHPAGI y MYSQL

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
Categorías:Manuales y tutoriales
  1. PAul
    noviembre 18, 2008 de 7:32 pm

    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. Alejandro
    agosto 4, 2009 de 9:54 pm

    buenas, queria decirte que tengo el elastix instalado, e hice los paso q me decis ahi pero no me funciona, soy nuevo en esto te agradeceria se me pegaras una mano, te dejo mi msn ale_sabal@hotmail.com gracias saludos

  3. marcelo
    octubre 12, 2009 de 4:51 am

    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

    • Fernando
      mayo 16, 2014 de 4:05 am

      eLaStIx2oo7 para mi funciona con este ten en cuenta q si estas en el elastix tienes q poner por delante -peLaStIx2oo7

  4. Gilberto
    octubre 14, 2009 de 2:49 am

    Saludos, gracias por tu aporte… funciono perfectamente.

    • Angie
      septiembre 9, 2011 de 5:17 pm

      Gilberto me podras dar una manito ya que te salio?

      • joan
        septiembre 5, 2012 de 7:35 pm

        HOLA, espero que funcione contigo si es asi porfavor echame ahora tu una mano te lo agradecerìa muchisimo.

    • MARVIN
      diciembre 14, 2011 de 9:56 pm

      YO TAMBIEN NECESITO AYUDA, O UN EJEMPLO, ES QUE HAGO TODOS LOS EJEMPLOS DE INTERNET PERO EL AGI NO HACE NADA
      nivisaw@yahoo.com.co

  5. Alexis
    febrero 28, 2010 de 4:54 am

    es eLaStIx.2oo7

    no son ceros son letras o

  6. diciembre 28, 2010 de 5:18 am

    Funcionó!! soy nuevo en asterisk pero tienes la misma idea pero con festival igual se usaria AGI?

    Saludos

    • joan
      septiembre 5, 2012 de 7:31 pm

      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.

  7. mayo 10, 2011 de 2:40 am

    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

  8. mayo 10, 2011 de 3:36 am

    Hola

    No no existe ningún conflicto, trata de pintar los parámetros que envías. en el CLI.

    Saludos

  9. Rafael
    septiembre 29, 2011 de 7:40 pm

    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

  10. Rafael
    septiembre 29, 2011 de 7:41 pm

    #!/usr/bin/php -q

  11. edward
    octubre 21, 2011 de 3:50 pm

    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.

  12. acastellanos
    noviembre 20, 2011 de 7:02 pm

    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

    • acastellanos
      noviembre 24, 2011 de 1:26 am

      te agradeseria mucho si me puedes ayudar, ya te ecribi al correo que dejaste, te llego?, si no por favor me puedes enviar a este correo: lcastellanosa@hotmail.com

      muchas gracias.

    • RicardoGalue
      diciembre 14, 2011 de 2:43 pm

      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

    • mayo 18, 2018 de 3:56 pm

      Hola, me gustaría que por favor me compartes a mi también, alejom49@gmail.com

  13. elester
    diciembre 11, 2015 de 3:00 pm

    hola cuando hago el debud en el cli me aparece este error
    pbx_builtin_waitexten: Timeout but no rule ‘t’ or ‘e’ in context ‘consulta’

  14. mayo 18, 2018 de 4:12 pm

    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

  1. No trackbacks yet.

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 )

Conectando a %s

A %d blogueros les gusta esto: