Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Configurar Asterisk para trabajar con Mysql usando Odbc (3 de 3)

David Muñoz
  • Escrito por David Muñoz el 24 de Octubre de 2013
  • <1 min de lectura | Sistemas
Configurar Asterisk para trabajar con Mysql usando Odbc (3 de 3)

Después del primer y segundo post, llega el último y definitivo donde cerramos la explicación de cómo configurar Asterisk para trabajar con Mysql. Este post está basado en el libro Asterisk: the definitive guide de O’Reilly, considerado la biblia de asterisk.  http://ofps.oreilly.com/titles/9781449332426/asterisk-DB.html Ahora que tenemos Mysql instalado y configurado para usarlo con ODBC y hemos comprobado la conexión, vamos a ver recompilar asterisk para usar ODBC y veremos algunos ejemplos de uso. Vamos al directorio donde tengamos los sources de Asterisk y volvemos a ejecutar ./configure para que reconozca que tenemos instalada la dependencia unixODBC, después ejecutamos make menuselect para seleccionar los módulos de odbc: cdr_odbc , cdr_adaptive_odbc , func_odbc , func_realtime , pbx_realtime , res_config_odbc , and res_odbc .  Después ejecutamos make install para instalar estos módulos. No nos hace falta volver a ejecutar make porque la función “automake” se encarga de comprobar que modulos nuevos tiene que compilar e instalar.

$ cd ~/src/asterisk-complete/asterisk/11
$ ./configure
$ make menuselect
$ make install
El siguiente paso es volver es editar el fichero res_odbc.conf dentro de /etc/asterisk. Este fichero es el que se encarga de configurar asterisk para conectarse con ODBC. Incluimos en este fichero la siguiente configuración:
[asterisk]
enabled => yes
dsn => asterisk-connector
username => asterisk
password => welcome
pooling =>; no
limit => 1
pre-connect => yes
La opción dsn indica el nombre de la conexión que habíamos creado en el fichero /etc/odbc.ini. El usuario y la clave es de la base de datos a la que nos vamos a conectar. La opción pre-connect=yes nos mantiene la conexión abierta mientra el módulo está cargado. Si tenemos muchas conexiónes a la base de datos es mejor tenerla activada. Reiniciamos Asterisk o recargamos el módulo res_odbc.so para cargar la nueva configuración si no queremos reinicar asterisk.
service asterisk condrestart
También podemos utilizar
asterisk -rx 'module reload res_odbc.so'
Entramos en la consola de asterisk y comprobamos que el módulo se ha cargado correctamente.
$sudo rasterisk -vvvvv
*CLI> odbc show
ODBC DSN Settings
-----------------
Name:   asterisk
DSN:    asterisk-connector
Last connection attempt: 1969-12-31 19:00:00
Pooled: No
Connected: Yes
Ya tenemos nuestro asterisk conectado con mysql a través de ODBC. Ahora vamos a configurar nuestro dialplan para hacer nuestra primera query. Vamos a configurar un pequeña tabla para de ejemplo para probar nuestra nueva configuración. Creamos una tabla en nuestra base de datos para que el sistema nos avise si el que nos está llamando es un cliente o no. Yo voy a usar el cli de mysql pero podeis usar por ejemplo phpmyadmin para vuestra comodidad. Entramos en la consola de mysql:
$ mysql -u asterisk -p asterisk
Creamos la tabla e introducimos un cliente:
mysql> CREATE TABLE Clientes (Nombre varchar(80),Apellido varchar(80),telefono varchar(80));
mysql> INSERT INTO Clientes (nombre,Apellido,telefono) VALUES ('Manuel','Lopez','999444333');
mysql> exit
Creamos el contexto en nuestro extensions para comprobar si el número que nos llama es un cliente o no.
[entrantes]
exten => _X.,1,NoOp(llamada entrante)
same => n,GotoIf($[${ODBC_Cliente(${CALLERID(number)})}]?cliente)
same => n(no-cliente),Goto(contexto-clientes)
same => n(cliente),Goto(contexto-nocliente)
same => n,Hangup
Fijaros en la linea resaltada.  En esta linea enviamos con un GotoIF la llamada a un contexto llamado cliente en caso de que el Callerid del que nos llame nos devuelva algún valor en la query ODBC_Cliente. Vamos a crear esta query en el fichero que utiliza asterisk para ello llamado func_odbc.conf.
vim /etc/asterisk/func_odbc.conf
[Cliente]
dsn=asterisk
readsql=SELECT COUNT(*) FROM Clientes WHERE telefono='${SQL_ESC(${ARG1})}'
El dsn tiene que ser el mismo del nombre del contexto que pusimos en res_odbc en el post anterior. Recargamos func_odbc y el dialplan:
$ sudo rasterisk -vvvv
*CLI> module reload func_odbc.so
Loaded func_odbc.so
  == Registered custom function 'ODBC_Cliente'
*CLI> dialplan reload
Si queremos probar la query desde la consola podemos usar el comanto ODBC:
*CLI> odbc read ODBC_Cliente 999444333 exec
COUNT(*)              1
Returned 1 row.  Query executed on handle 0 [asterisk]
Vemos que ya nos sale la función que hemos creado. Ahora vamos a probarlo todo. Para ello vamos a usar el comando originate para generar una llamada desde la consola y para simular una llamada entrante usamos el pseudocanal Local que nos permite indicar como canal una extensión dentro de un contexto:
*CLI&gt; channel originate Local/999444333@entrantes application echo
    -- Executing [999444333@entrantes:1] NoOp("Local/999444333@entrantes-00000004;2", "llamada entrante") in new stack
    -- Executing [999444333@entrantes:2] GotoIf("Local/999444333@entrantes-00000004;2", "0?cliente") in new stack
    -- Executing [999444333@entrantes:3] Goto("Local/999444333@entrantes-00000004;2", "contexto-clientes") in new stack
Si todo ha ido bien, vemos que hace la query y  que nos manda al contexto-clientes ya que existe ese número en la tabla Clientes. Espero que os haya sido de utilidad estos posts sobre Asterisk. Cualquier duda que tengáis no dudeis en preguntar en los comentarios.

Estas son algunas de las empresas que ya confían en OpenWebinars

Profesores y profesionales

Nuestros docentes son profesionales que trabajan día a día en la materia que imparten

Conviértete en profesor de OpenWebinars