Ver Indice Tutorial

La base de datos interna de Asterisk

Asterisk cuenta con una base de datos interna que utiliza para diferentes propósitos pero que también podemos utilizar, por ejemplo, complementar el plan de marcado con contenido dinámico o incluso crear condiciones de bloqueo como la del ejemplo de este artículo.

La base de datos de Asterisk está basada en Berkeley v1 (a partir de Asterisk 10) y su uso es bastante sencillo. La información se agrupa en familias , entradas y valores . Por hacer un símil, una familia representaría una columna de una tabla, cada entrada sería una fila de esa columna y el valor es el valor propio que almacena esa fila.

Si queremos usar la base de datos interna de Asterisk en nuestro dialplan tenemos varias opciones:

  1. Añadir una entrada o modificar una existente:

    exten => *543,1,Set(DB(contestador/activo)=1)

  2. Borrar una entrada:

    exten => *544,1,NoOp(${DB_DELETE(contestador/activo)})

  3. Copiar el valor de una entrada a una variable:

    exten => *545,1,Set(mivariable=${DB(contestador/activo)})

  4. Salto en función del valor de una entrada:

    exten => *546,1,GotoIf($["${DB(contestador/activo)}"="1"]?contestador_activo,contestador_inactivo

Vamos a ver cómo se puede hacer un desvío básico de llamadas con Asterisk:

[extensiones]
exten => _1XX,1,NoOp(Llamada a la extensión ${EXTEN})
same => n,Set(destino=${DB(desvios/${EXTEN})})
same => n,Dial(SIP/${destino},,tTr)
same => n,Hangup()

include => desvios


[desvios]
exten => _*XXX,1,NoOp(Se realiza un desvío de ${CALLERID(num)} a ${EXTEN:1})
same => n,Set(DB(desvios/${CALLERID(num)})=${EXTEN:1})
same => n,Answer()
same => n,Playback(beep)
same => n,Hangup()

exten => _*000,1,NoOp(Se elimina el desvío de ${CALLERID(num)})
same => n,Set(DB(desvios/${CALLERID(num)})=${CALLERID(num)})
same => n,Answer()
same => n,Playback(beep)
same => n,Hangup()

Conexión con bases de datos externas

Este punto es quizás una de las mejores características que ofrece Asterisk a sus usuarios avanzados. Gracias a la posibilidad de ejecutar unas funciones u otras en el dialplan en función de consultas a una BBDD como puede ser MySQL, podemos encontrar cientos de aplicaciones como agendas telefónicas, ivr personalizados en función del CALLERID (sin límites de entradas de usuario) o simplemente una consulta a una entrada de una tabla vía telefónica. En este punto centramos la mirada en cómo se configura una conexión a una base de datos MySQL y cómo se puede realizar una consulta a la misma desde nuestro dialplan. Podéis ampliar más información sobre este tema en el artículo de David Muñoz (@dperilla), Configurar Asterisk para trabajar con MySQL usando ODBC disponible a través de la plataforma de OpenWebinars.net .

Para trabajar con una base de datos ODBC necesitamos instalar los paquetes unixodbc-dev y libmyodbc (el primero es un conector genérico para ODBC y el segundo es una librería con la que podemos trabajar con MySQL). ¿Hacia qué base de datos vamos a apuntar? Vamos a suponer que tenemos instalado MySQL Server (si no lo tenemos, tan sólo tendremos que hacer apt-get install mysql-server ), y que el programa está ejecutándose. La configuración inicial tendrá la siguiente forma:


Conectando con la BBDD

Lo primero es editar el fichero /etc/odbcinst.ini para especificar el tipo de base de datos a la que se quiere acceder:

[MySQL]
Description = MySQL ODBC Driver
Driver = /usr/lib/odbc/libmyodbc.so
FileUsage = 1

Lo segundo, editar el fichero /etc/odbc.ini con el que especificamos a qué base de datos queremos apuntar:

[MySQL-Asterisk]
Description = Conector ODBC para MySQL
Driver = MySQL
Socket = /var/run/mysqld/mysqld.sock
Server = direccion_bbdd
User = usuario_bbdd
Password = password_bbdd
Database = nombre_bbdd
Option = 3

En el escenario más común, la base de datos estará en la misma máquina en la que está ejecutándose el Asterisk. Si este es el caso, el campo Server apuntará a localhost .

Para hacer que Asterisk pueda acceder a la base de datos objetivo, se edita el fichero /etc/asterisk/res_odbc.conf con la siguiente configuración:

[asterisk]
enabled => yes
dsn => MySQL-Asterisk
username => usuario_bbdd
password = password_bbdd
pooling => no
limit => 1
pre-connect => yes


Aplicando la nueva configuración

Si toda la configuración es correcta, tan sólo tendremos que hacer que Asterisk cargue la nueva configuración para trabajar con la base de datos en MySQL. Para ello, tan sólo hay que ejecutar la siguiente línea en el CLI de Asterisk (para los que no lo conozcan, en el siguiente capítulo le hemos dedicado un apartado entero).

CLI >      module reload res_odbc.so

Llamadas a la base de datos desde el Dialplan

Aunque ya estamos preparados para leer y escribir datos en la base de datos que hemos configurado anteriormente, primero vamos a crear una función personalizada en el fichero /etc/asterisk/func_odbc.conf con el siguiente contenido:

[CALLERID]
dsn=asterisk
readsql=SELECT nombre FROM agenda_telefonica WHERE numero='${SQL_ESC(${ARG1})}'

En realidad lo que estamos haciendo es editar una función que consulte en la tabla agenda_telefónica el nombre asociado al número que le pasemos como argumento a la función.

Para que Asterisk registre esta función, o cualquier otra que hayamos editado, tendremos que volver al CLI de Asterisk y cargar el módulo func_odbc.so :

CLI >      module reload res_odbc.so

Ahora sí, editamos el fichero extensions.conf y configuramos para cada llamada entrante que se haga una consulta a la base de datos:

[llamadas-entrantes]
exten => _X.,1,NoOp(Llamada entrante de ${CALLERID(num)})
same => n,Set(CALLERID(name)=${ODBC_CALLERID(${CALLERID(num)})})