MySQL y Asterisk - Ultimo numero llamado y ultima llamada recibida

Se hemos seguido esta guía para la instalación del paquete adicional de Asterisk (asterisk-addons) seguramente tenemos el registro de las llamadas en una base de datos. Ahora que tenemos todas las llamadas registradas, a través de una aplicación de asterisk, podemos consultar la base de datos y extraer lo que necesitamos. En este articulo veremos como sacar de la base de datos el ultimo numero llamado y la ultima llamada recibida de la extensión que está haciendo la consulta. Una vez que tengamos estos datos podemos usarlos como queramos. Algunos ejemplos:

  • rellamada del ultimo numero marcado
  • rellamada del ultimo numero llamante
  • anuncio del ultimo numero llamado
  • anuncio de la ultima llamada recibida

Vamos a empezar; abrimos el archivo extensions.conf y añadimos unas cuantas líneas:

nano /etc/asterisk/extensions.conf

En nuestro contesto local ponemos

;Ultima llamada hecha
exten => 75,1,MYSQL(Connect connid localhost usuario contraseña nombrebasededatos)
exten => 75,n,NoOp(connid = ${connid})
exten => 75,n,MYSQL(Query resultid ${connid} SELECT dst FROM cdr WHERE src="${CALLERID(num)}" ORDER BY calldate DESC LIMIT 1)
exten => 75,n,NoOp(resultid = ${resultid})
exten => 75,n,MYSQL(Fetch fetchid var1)
exten => 75,n,NoOp(Variabili = ${fetchid},${var1})
exten => 75,n,MYSQL(Clear ${resultid})
exten => 75,n,MYSQL(Disconnect ${connid})
exten => 75,n,Hangup

La aplicación MySQL es la que permite hacer consultas de cualquier base de datos en MySQL que hemos creado. En este caso la usaremos solamente para consultar el CDR.

Con la primera línea nos conectamos a la base de datos. Los datos que tenemos que indicar son:

  • el host donde se encuentra el servidor MySQL (en mi caso localhost)
  • nombre de usuario que tiene acceso a la base de datos
  • la contraseña del usuario
  • el nombre de la base de datos donde tenemos los registros de las llamadas

Si la conexión tiene éxito a la variable connid será asociado el valor 1

Hacemos este tipo de control en la segunda línea. Si la conexión no funciona asterisk colgará la llamada

En la Tercera línea interrogamos la base de datos (Query) usando la conexión creada con la línea 1. Queremos seleccionar la columna dst (destinación) de la tabla cdr donde el llamante es la extensión que está haciendo la consulta y queremos el resultado ordenado por fecha en orden descendiente. Con LIMIT 1 indicamos que queremos solo el ultimo registro de esa columna). La variable resulid contendrá el numero de los resultados de la búsqueda.

Para asociar el resultado de la consulta a una variable usamos la quinta línea (Fetch) y asignamos el resultado de la consulta a la variable var1. La variable var1 contendrá el valor de la consulta (el ultimo numero llamado). Ahora borramos la variable resultid (línea 7) e nos desconectamos de la base de datos (línea 8).

Ahora que tenemos el resultado de la consulta lo podemos usar como queremos (llamarlo, anunciarlo, etc.)

;Ultima llamada recibida
exten => 76,1,MYSQL(Connect connid localhost usuario contraseña nombrebasededatos)
exten => 76,n,NoOp(connid = ${connid})
exten => 76,n,MYSQL(Query resultid ${connid} SELECT src FROM cdr WHERE dst="${CALLERID(num)}" ORDER BY calldate DESC LIMIT 1)
exten => 76,n,NoOp(resultid = ${resultid})
exten => 76,n,MYSQL(Fetch fetchid ${resultid} var1)
exten => 76,n,NoOp(Variabili = ${fetchid},${var1},)
exten => 76,n,MYSQL(Clear ${resultid})
exten => 76,n,MYSQL(Disconnect ${connid})
exten => 76,n,Playback(last-num-to-call)
exten => 76,n,Saydigits(${var1})
exten => 76,n,Hangup

Este bloque es casi igual al de arriba solo que en esta consulta pedimos el numero de la ultima llamada recibida.

Al final usamos un anuncio de la ultima llamada recibida e lo anunciamos con Saydigits.

Estos son solamente unos ejemplos de como consultar la base de datos con los registros de las llamadas.

Para mayor información sobre como hacer consultas a base de datos en MySQL pueden consultar esta muy buena guía en español

 

Etiquetas de Technorati: ,,

Vota el Articulo: 

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

3 comentarios

Aporte

Gracias Andrea por publicar códigos de tan gran valor.

Pero siempre es necesario aportar nuestro granito de arena.

Con este contexto se puede calcular el total de minutos consumidos en el mes de Junio que comiencen por 09, en Colombia son llamadas nacionales por Telecom.

Al realizar la consulta sum(round(duration/60)), primero convertimos cada campo en minutos dividiéndolo en 60, luego lo redondeamos para hacer la aproximación y por último sumamos todos lo campos. 

De esta forma al marcar 987 sabemos cuanto se ha hablado en el mes de Junio.

exten => 987,1,MYSQL(Connect connid localhost root contrasena asteriskcdrdb)

exten => 987,n,NoOp(connid = ${connid})

exten => 987,n,MYSQL(Query resultid ${connid} select sum(round(duration/60)) from cdr where dst like '09%' and calldate like '2012-06%')

exten => 987,n,NoOp(resultid = ${resultid})

exten => 987,n,MYSQL(Fetch fetchid ${resultid} var1)

exten => 987,n,NoOp(Variabili = ${fetchid},${var1},)

exten => 987,n,MYSQL(Clear ${resultid})

exten => 987,n,MYSQL(Disconnect ${connid})

exten => 987,n,Playback(custom/total_Junio)

exten => 987,n,Saydigits(${var1})

exten => 987,n,Hangup

Agradezco cualquier corrección y/o comentario...

Andres Ramirez
Administrador VoIP
Bogotá - Colombia

INFO..

Buen día Andres, gracias por el aporte que has dado y que es de gran utilidad, sobre todo para novatos pero gomosos en el mundo Asterisk y a2billing.

Deseo consultarte algo, como puedo hacer para que por medio de este código, lo pueda implementar para que al marcar por ejemplo 300 me diga la duración de la ultima llamada realizada.  Seria un gran aporte a la comunidad :)

Nuevamente te doy gracias por tus aportes, Bendiciones

Suscribirse a Comentarios de "MySQL y Asterisk - Ultimo numero llamado y ultima llamada recibida" Suscribirse a VozToVoice - Todos los comentarios