Asterisk Func_odbc.conf - ODBC y Base de datos

Actualizado 12 Septiembre 2009

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 < timeclock.sql

si miramos la base de datos viene con dos records insertados

mysql -u root -p

mysql> use timeclock

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)

Ahora asignamos a un usuario los privilegios para conectarse a la base de datos:

mysql> GRANT ALL PRIVILEGES ON timeclock.* TO 'root'@'localhost' IDENTIFIED BY 'clave';

salimos de cliente MySQL

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
dsn=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

 

Etiquetas de Technorati: ,,

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

12 comentarios

crear accesos a bases de datos en VoiceXML con Asterisk...

El dialplan es un entorno de configuración estático orientado a configurar las extensiones del Asterisk, su potente lenguaje de macros abre puertas para casi todo; pero analizando tu planteamiento de poner un acceso a una base datos desde el mismo se vuelve bastante complicado y muy rígido... Además cualquier planteamiento similar requiere tratar dinámicamente una o varias respuestas que a su vez pueden requerir nuevos accesos a la base de datos...

Es mucho más simple hacer lo mismo y con código dinámico usando unas pocas líneas de PHP estándar con VoiceXML... Para eso que indicas precisamente se ha creado el lenguaje VoiceXML de los portales de voz... para poder programar un servicio vocal con la misma agilidad que un servicio web y usando herramientas comunes como PHP/ASP/JSP...etc. Solo requiere tener un motor de VoiceXML dentro de Asterisk.

http://www.i6net.com/2008/02/07/voicexml-database-access/

Hola me pueden alguien ayudar

Hola me pueden alguien ayudar a confgurar vxiasterisk 4.2 en asterisk 1.4 con asr y tts de verbio y codigo voicexml para acceso a base de datos
gracias

Resultado prueba

Siempre que digito, 12345, ó 23456, siempre me dice que no existe el registro, que puede haber mal?

siempre me salta a nofound

 

Executing [333@from-internal:1] Answer("SIP/332-00000005", "") in new stack
    -- Executing [333@from-internal:2] Wait("SIP/332-00000005", "2") in new stack
    -- Executing [333@from-internal:3] Read("SIP/332-00000005", "EMPNUM,beep,5") in new stack
    -- Accepting a maximum of 5 digits.
    -- <SIP/332-00000005> Playing 'beep.ulaw' (language 'en')
    -- User entered '23456'
    -- Executing [333@from-internal:4] NoOp("SIP/332-00000005", "EMPNUM: 23456") in new stack
    -- Executing [333@from-internal:5] Set("SIP/332-00000005", "EMPNAME=") in new stack

 

"creo que el error se ve en la linea anterior, ya que la sentencia:

exten => 333,n,Set(EMPNAME=${ODBC_TIMECLOCK(${EMPNUM})})
no guarda bien el valor digitado ""

 

    -- Executing [333@from-internal:6] GotoIf("SIP/332-00000005", "1?notfound") in new stack
    -- Goto (from-internal,333,9)
  == Spawn extension (from-internal, 333, 9) exited non-zero on 'SIP/332-00000005'

 

Gracias de antemano.

Para añadir decir que no

Para añadir decir que no tenia instalado flite por lo que comente dichas lineas, no creo que sea ningun inconveniente, si no las comentaba directamente me colgaba.

Gracias otra vez

primero averigua que la

primero averigua que la configuración de odbc esté bien:

isql timeclock root clave

debe aparecerte:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

Si esto está bien, averigua que haya conexión en asterisk al DSN:

CLI> odbc show

Debe aparecerte:

 Name:   timeclock
  DSN:    timeclock
  Pooled: No
  Connected: Yes

Si esto tambien funciona todo debería estar bien.

El error parece relacionado con la "query" que hace en la base de datos timeclock.

Cuentame

odbc show

cuando coloco el odbc show me sale error, pero si hago select a mi base, a mis tablas todo sale bien , tambien me sale bien  al poner

isql timeclock root clave, que podria ser ?

Re: odbc show

Hola angie,

mira en los registros de Asterisk si hay algun de error de conexión a la base de datos.

Si con el comando:

CLI> odbc show

te sale error, debe haber algo en la configuración de Asterisk que está mal.

Revisa y nos cuentas.

Saludos

Suscribirse a Comentarios de "Asterisk Func_odbc.conf - ODBC y Base de datos" Suscribirse a VozToVoice - Todos los comentarios