29 may 2009

Asterisk Func_odbc.conf - ODBC y Base de datos | VozToVoice

Asterisk Func_odbc.conf - ODBC y Base de datos | VozToVoice: "Asterisk Func_odbc.conf - ODBC y Base de datos"

Estoy firmemente convencido que seguir las guías que publican los “tipos” de “Nerd Vittles” es siempre un buen ejercicio para aprender cosas nuevas. En este caso veremos, siguiendo unas de las guías recientemente publicadas, como usar el conector ODBC y el archivo de configuración de asterisk func_odbc.conf para hacer consultas en una base de datos MySQL y restituir los resultados, todo a través de unas cuantas líneas del Diaplan. La guía de Nerd Vittles es pensada para asterisk 1.4.X, para que funcionara en asterisk 1.6.X tuve que hacerle unas cuantas modificaciones.

Antes que nada para el soporte de ODBC en Asterisk tenemos que descargar unos archivos y volver a compilar las fuentes:

si no tenemos instalado MySQL escribimos:

yum install mysql mysql-devel mysql-server

seguimos con ODBC:

yum install unixODBC unixODBC-devel libdbi-dbd-mysql mysql-connector-odbc

Compilamos asterisk:

cd /usr/src/asterisk.1.6.0.9

./configure

make

make install

Ahora continuamos con la configuración del driver ODBC:

nano /etc/odbcinst.ini

pegamos las siguientes líneas (para Centos 32bit)

[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc3.so
Setup = /usr/lib/libodbcmyS.so
FileUsage = 1

Ahora creamos una base de datos de prueba en MySQL:

wget http://pbxinaflash.net/source/odbc/timeclock.sql

mysql –u root –p <>

si miramos la base de datos viene con dos records insertados

mysql –u root –p

mysql> SELECT * FROM users;
+----+--------+----------+----------+------------+
| id | empnum | lastin | lastout | comments |
+----+--------+----------+----------+------------+
| 1 | 12345 | 00:00:00 | 00:00:00 | Uncle Ward |
| 2 | 23456 | 00:00:00 | 00:00:00 | Miss Mary |
+----+--------+----------+----------+------------+
2 rows in set (0.00 sec)

mysql> quit

Ahora tenemos que modificar algunos archivos de asterisk para que todo funcione:

nano /etc/asterisk/res_odbc.conf

añadimos las siguientes líneas

[timeclock]
enable=yes
dns=timeclock
username=root
password=clave
loguniqueid=yes
pre-connect=yes

en el campo password ponemos la contraseña configurada en MySQL para el usuario root (normalmente definida al momento de instalar mysql-server)

nano /etc/asterisk/func_odbc.conf

añadimos las líneas:

[TIMECLOCK]
dsn=timeclock
readsql=SELECT comments FROM users WHERE empnum='${SQL_ESC(${ARG1})}'
writesql=UPDATE users SET empnum='${SQL_ESC(${VAL1})}' WHERE empnum='${SQL_ESC(${ARG1})}'

seguimos con:

nano /etc/odbc.ini

[timeclock]
Description = MySQL ODBC TIMECLOCK
Driver = MySQL
Server = localhost
User = root
Password = clave
Database = timeclock
Port = 3306
Option = 3

En clave volvemos a poner la contraseña configurada en MySQL para el usuario root

Ahora solo nos falta la parte del dialplan que usaremos para hacer consultas en la base de datos:

nano /etc/asterisk/extensions.conf

exten => 222,1,Answer
exten => 222,n,Wait(2)
exten => 222,n,Flite("Please enter the 5 digit employee number.")
exten => 222,n,Read(EMPNUM,beep,5)
exten => 222,n,NoOp(EMPNUM: ${EMPNUM})
exten => 222,n,Set(EMPNAME=${ODBC_TIMECLOCK(${EMPNUM})})
exten => 222,n,GotoIf($["${EMPNAME}foo" = "foo"]?notfound)
exten => 222,n,Flite("The employee name is ${EMPNAME}. Good bye.")
exten => 222,n,NoOp(Employee: ${EMPNAME})
exten => 222,n,Hangup
exten => 222,n(notfound),Flite("No such employee on file. Good bye.")
exten => 222,n,Hangup

Volvemos a arrancar Asterisk

/etc/init.d/asterisk reload

o

/etc/init.d/asterisk restart

Como pueden ver, se contesta la llamada, se usa un programa de síntesis de voz (podrías ser también festival o cepstral), en este caso Flite (festival-lite). Se espera que el llamante digite una serie de 5 números(aplicacion Read); se consulta la base de datos para ver si ese numero existe. Si no existe el dialplan sigue desde la etiqueta (notfound) sino desde la línea que sigue donde escucharemos la frase con el nombre del empleado asociado a los 5 dígitos que hemos enviados.

Hagan sus pruebas y luego me cuentan


1 comentario:

Mario Andrés Pedraza G. dijo...

Buenas noches!!! Excelente ejemplo!!! Usted sabe si puedo hacer lo mismo con una base de datos externa en Oracle ??? maripedg@hotmail.com