Mysql dialplan Asterisk.

En algunos escenarios, trabajando con Asterisk, tenemos la necesidad de consultar datos de una base de datos, para por ejemplo, dar la posibilidad a un usuario a traves de una página dinámica en PHP activar o desactivar un buzón de voz. Esto como he dicho, se puede conseguir realizando consultas a Mysql desde el mismo dialplan de asterisk.

Es bastante sencillo, con lo que pondré varias lineas a modo de ejemplo:

Utilizaremos la función Noop de asterisk para saber en todo momento como recorre asterisk nuestro pequeño plan de marcado.

Para conseguir esto en asterisk se utiliza la función Mysql.

Lo primero que se tiene que hacer es conectar con el servidor (Mysql) y la base de datos con la que queremos trabajar.

Mysql(connect conex localhost usuario password base_de_datos)

– conex: Esta variable almacenara la sesión de la conexión. (La tendremos que indicar a las futuras consultas de mysql)
– Localhost: Seria la IP o nombre del servidor donde se aloja la base de datos
– Usuario: Aqui se indicaria el usuario de la base de datos
– Password: Password de la base de datos
– base_de_datos: Aqui el nombre de la base de datos con la que vamos a trabajar.

Ejemplo:

Mysql(connect conex localhost myuser mypassword dbasterisk)

Una vez explicado esto, se debe saber que este es el primer punto a realizar.

El segundo punto a realizar seria la consulta.
Lo único que cambia en este caso es la palabra connect por query. Indica a la función mysql que vamos a realizar una consulta.

Mysql(query consulta ${conex} ..CONSULTA MYSQL.. )

– consulta: Variable que retornará el retorno de la consulta
– ${conex}: Variable que indicamos anteriormente para realizar la conexion. Pasandole esta variable hacemos referencia a la conexión establecida anteriormente.
– ..CONSULTA MYSQL.. : Aqui se indicará una consulta Mysql estándar.

Ejemplo:

Mysql(query consulta ${conexion} SELECT dst FROM tabla_1 WHERE id=1 )

Recogeremos los valores del campo dst, cuya tabla es tabla_1 y el valor id sea 1..

Hemos conectado con mysql en el punto 1, hemos realizado la consulta en el punto 2. Ahora nos falta poder “leer” el contenido que nos a retornado dicha consulta.

Para esto utilizamos la función mysql seguida de fetch:

Mysql(fetch asignar ${consulta} var1)

– asignar: Esta variable retornará si la operación tubó exito o no.
– ${consulta}: Es la variable que indicamos anteriormente en la consulta. Le estamos diciendo que nos “extraiga” el resultado de dicha consulta que anteriormente ejecutamos con query.

– var1: Seria la variable a la que se pasaria el valor ya legible. Ahora podriamos utilizar Noop para leer su resultado en la consola de asterisk o para tratarla a lo largo del dialplan.

En el caso de que query nos devuelva más de un registro y queramos acceder al siguiente, podemos utilizar la nueva funcionalidad que SOLAMENTE ESTA DISPONIBLE PARA ASTERISK 1.8.

Mysql(Nextresult sigregistro ${connid})

-Nextresult: Se trata de la nueva funcionalidad agregada por asterisk en la versión 1.8. Permite ir avanzando entre todos los registros “soltados” por mysql. Si la consulta devolvió 4 registros diferentes, podremos acceder a esos 4 haciendo un Nextresult & fetch para cada uno de ellos. Con Nextresult pasamos de registro y con fetch lo rescatamos a una variable.

– sigregistro: Se trata de la variable donde se retornará el puntero al registro. Seria esta variable la que tendriamos que utilizar ahora en fetch.

Ejemplo:

Mysql(fetch asignar ${sigregistro} var1)

Con la linea anterior, el registro pasará a estar disponible desde la variable ${var1}

Una vez hemos terminado con todo lo relaciono con mysql tenemos que “limpiar” todo lo relacionado con la consulta y desconectarnos del servidor mysql.
Se consigue con:

Mysql(clear ${consulta})    # Para limpiar

– ${consulta}: Seria el puntero que indica la consulta anteriormente realizada.

Mysql(disconnect ${conex}) # para desconectar

– ${conex}: Seria el puntero que indica la conexión de la que queremos desconectarnos. (La anteriormente realizada)

Despues de aprender todo lo comentado, dejo a modo de ayuda todo el dialplan referente a las pruebas realizadas.

exten => 111,n,Noop(Vamos a conectar con Mysql)
exten => 111,n,Mysql(connect conex localhost miusuarioasterisk password999 asterisk-tabla)
exten => 111,n,Noop(Resultado de conexion: = ${conex})
exten => 111,n,Noop(Consultamos datos de la DB)
exten => 111,n,Mysql(query consulta ${conex} SELECT dst FROM cdr WHERE dst=123456789)
exten => 111,n,Noop(Resultado de consulta: ${consulta})
exten => 111,n,Noop(Asignamos el resultado de la consulta a var1)
exten => 111,n,Mysql(fetch asignacion ${consulta} var1)
exten => 111,n,Noop(Valor de variable VAR1 es: ${var1})
exten => 111,n,Noop(Limpiamos con clear)
exten => 111,n,Mysql(clear ${consulta})
exten => 111,n,Mysql(Vamos a desconectarnos del servidor Mysql con disconnect)
exten => 111,n,Mysql(disconnect ${conex})
exten => 111,n,Noop(Terminado…monovarlinux.org 😀 :=). Conocimiento libre! . Gracias linux & asterisk por existir)
exten => 111,n,Hangup

Como podeis ver, dicho dialplan se ejecutara al marcar 111. Podran ver todos los mensajes Noop, su salida, en la consola de asterisk, entrando a ella con asterisk -vvvvvvvvvr.

 

Espero que una vez más sirva de utilidad a alguien.
Como siempre, cada dia más y mejores. Conocimiento libre!

Un saludo.

Share

Un pensamiento en “Mysql dialplan Asterisk.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Anti-spam image