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
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
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
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
eLaStIx2oo7 para mi funciona con este ten en cuenta q si estas en el elastix tienes q poner por delante -peLaStIx2oo7
Saludos, gracias por tu aporte… funciono perfectamente.
Gilberto me podras dar una manito ya que te salio?
HOLA, espero que funcione contigo si es asi porfavor echame ahora tu una mano te lo agradecerìa muchisimo.
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
es eLaStIx.2oo7
no son ceros son letras o
Funcionó!! soy nuevo en asterisk pero tienes la misma idea pero con festival igual se usaria AGI?
Saludos
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.
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
Hola
No no existe ningún conflicto, trata de pintar los parámetros que envías. en el CLI.
Saludos
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
#!/usr/bin/php -q
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.
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
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.
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
Hola, me gustaría que por favor me compartes a mi también, alejom49@gmail.com
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’
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