Upload
duongtram
View
214
Download
0
Embed Size (px)
Citation preview
1
CAPÍTULO 3.
DISEÑO Y CONFIGURACIÓN DEL IVR
3.1 GENERACIÓN DE LA BASE DE DATOS
El IVR es una poderosa plataforma para el desarrollo de aplicaciones telefónicas que
permite integrar, diseñar, implementar y administrar sistemas de respuesta interactiva de
voz. Una plataforma IVR viene preparada para el manejo de voz, fax, acceso y escritura a
base de datos vía ODBC o sockets, reconocimiento de voz, texto a voz, entre otros.
El proceso para establecer la comunicación por medio de la red es el siguiente:
1. Se debe configurar en el servidor Asterisk, los números de acceso al IVR.
2. Se configuran las extensiones de los usuarios.
3. El usuario a través de un dispositivo IP softphone hace una llamada a los números
configurados en el servidor para comunicarse con el IVR.
4. La llamada pasa por el concentrador y éste la envía al servidor Asterisk donde se
encuentra la aplicación IVR.
5. El IVR da como respuesta una serie de opciones para el usuario.
6. La respuesta pasa nuevamente por el concentrador para de esta manera llegar al
destino.
Este proceso vuelve a repetirse al momento que el usuario escoge una opción para obtener
la información requerida; y termina la fase al momento de colgar la llamada. (Fig. 3.1)
2
Fig. 3.1 PROCESO DE COMUNICACIÓN CON LA RED
El funcionamiento de un IVR, parte de la creación de una Base de Datos a la que debe
accederse para consultas. Para el desarrollo del presente proyecto se ha creado una base de
datos que contenga los registros básicos de un estudiante de la Universidad Politécnica
Salesiana Campus Sur; dichos datos son: datos personales del alumno, facultades o
facultad en la que está inscrito, materias que coge según la facultad con sus respectivas
notas y si tiene en trámite una solicitud el IVR dará información sobre la misma.
La base se llama proyecto y contiene las siguientes tablas.
Fig. 3.2 tablas que conforman la base de datos proyecto
3
Esta base de datos esta diseñada para la puesta en producción del proyecto propuesto; es
decir está hecha para consultas básicas que el alumno requiere, como por ejemplo consulta
de notas semestrales de cada materia en la que se inscribió, la facultad a la que pertenece
cada materia y si aprobó o no la misma y podrá consultar el estado de solicitudes en caso
de haber procesado una en el campus, el estado de solicitudes tendrá tres casos: aprobada,
negada, pendiente.
3.1.1 CONSIDERACIONES DE LA BASE DE DATOS
Fig. 3.3 Flujo de información del IVR
4
En la figura 3.3 se observa como se da el flujo de información cuando el usuario entra al
sistema de consulta de IVR. De esta manera son gestionados los datos por el IVR y éstos
son todos los posibles casos que se podrían presentar para el usuario.
3.1.1.1 Consulta de notas
Para poder obtener la información debe ingresar el número de cédula de identidad
perteneciente a cada estudiante.
Si éste es correcto debe ingresar un código secreto asignado al momento de
matricularse.
Si ingresa correctamente estos dos números el IVR le dará como información el
nombre de las materias asignadas al estudiante, las notas correspondientes a la
misma, el nivel y la facultad a la que pertenece la materia que está tomando.
El IVR no tiene asociado un número fijo de registros, devolverá como respuesta
tantos registros según el número de materias que haya cogido el estudiante en el
período.
En el caso que el estudiante ingrese menos de diez dígitos para realizar la consulta
obtendrá un mensaje de que los datos no existen y será redirigido al menú principal
para que vuelva a ingresar el número.
Si el estudiante ingresa mal el número de cédula o el código secreto el IVR le
informará que los datos no se registran en la base de datos y le mandará al menú
principal de opciones.
3.1.1.2 Consulta de solicitudes
Para poder obtener información sobre el estado de su solicitud el estudiante obtiene
un número único (número impreso en la parte superior derecha de la solicitud) y en
base a dicho número podrá informarse sobre el estado de la misma. Se tomaron las
mismas consideraciones de la consulta anterior para poder obtener la respuesta
requerida sobre el estado de la solicitud.
Al momento de ingresar el número el IVR dará como respuesta negada, aprobada o
pendiente.
5
Si el número ingresado es incorrecto o no existe el IVR le enviará un mensaje
diciendo que los datos son incorrectos y será dirigido al menú principal de opciones
para que vuelva a ingresar el número de la solicitud.
3.2 ESTRUCTURA DE MÓDULOS
Hasta ahora se ha estudiado cada uno de los componentes del IVR para consulta de notas y
servicios adicionales de una manera aislada sin tomar en cuenta los módulos que requiere
el ASTERISK.
En esta sección se explicará a breves rasgos qué componentes se necesitan y como estará
estructurado el sistema.
3.2.1 MÓDULOS ASTERISK
Se ha puesto como punto de partida para la aplicación de este proyecto una PBX como
ASTERISK que recepte las llamadas entrantes de los estudiantes y que pase el control al
IVR para que ejecute las respectivas consultas y devuelva la información solicitada.
Por tal motivo se pone a continuación la estructura de Asterisk.
1. Archivos para el buen desempeño del software:
a. Librerías: archivo libpri.
b. Compiladores: archivo make.
c. Conector para la base de datos: Asterisk adonns.
2. Otro componente es la base de datos que guarda la información, la misma que ya
está creada y que es el motor para las consultas que se van a realizar, se encuentra
en el mismo servidor que la PBX, aquí juega un papel importante la flexibilidad de
la PBX que se utilice y para este caso ASTERIK ofrece una puerta de
comunicación con cualquier tipo de aplicación informática en un lenguaje de
programación determinado como es MySQL.
6
3.2.2 MÓDULOS IVR
Hay que recordar que un IVR es una prestación de atención por contestadora automática
que suele incorporarse en los sistemas de telefonía, por eso es muy común que exista
manera de crear uno en las PBX que se venden hoy en día, las que generalmente son cajas
cerradas con hardware especializado para manejar telefonía tradicional y actualmente
telefonía IP.
Con esto no se descarta que para un IVR como el de éste proyecto pueda existir hardware o
software que esté especializado solamente en la creación de IVRs y que no maneje toda la
funcionalidad de una PBX, de todos modos como se mencionó anteriormente el punto
inicial de este proyecto es la PBX ASTERISK por tal razón los módulos del IVR se
encuentran dentro de los archivos de configuración de ASTERISK.
Desarrollo de los módulos del IVR:
a. Sip.conf: archivo en el cual se define las extensiones. Los sub-módulos que usa
sip.conf son:
1. General.- sub-módulo donde se define los puertos, contextos y direcciones
ip.
2. 11000- 11xyz.- sub-módulo para la creación de extensiones de usuarios con
sus respectivas propiedades. (xyz son los identificativos del usuario)
b. Extensions.conf: donde se genera el IVR con todos sus contextos para su óptimo
funcionamiento; a continuación se enumeran los sub-módulos que usa
extensions.conf
1. General.- sub-módulo donde están definidas las propiedades del script.
2. Globals.- sub-módulo donde están definidas las variables que se usarán para
capturar los valores que vendrán de la consulta.
7
3. interno_tesis.- sub-módulo para procesar los requerimientos de las
extensiones de usuario definidas.
4. ivr_tesis.- sub-módulo donde se procesa el árbol de rutas del IVR.
5. consulta_notas.- sub-módulo donde se hace la conexión a la base de datos y
las respectivas sentencias SQL para consultar las notas.
6. consulta_estado_solicitud.- sub-módulo donde se hace la conexión a la base
de datos y las respectivas sentencias SQL para consultar el estado de la
solicitud.
c. Use proyecto: módulo dónde se hace uso de la base de datos para gestionar la
información del alumnado.
3.3 DISEÑO PREVIO DEL SOFTWARE
3.3.1 CASOS DE USO
El diagrama de casos de uso representa la forma en como un Cliente (Actor) opera con el
sistema en desarrollo, además de la forma, tipo y orden en como los elementos interactúan.
A continuación en la figura 3.4 se observa como el Actor interactuar con el sistema de
consulta y todos los elementos que éste contiene.
8
Fig. 3.4 Diagrama de casos de uso
9
3.3.2 DIAGRAMA DE INTERACCIÓN
El diagrama de interacción, representa la forma en como un Actor u Objetos (Clases) se
comunican entre si en petición a un evento. Dicho diagrama puede ser obtenido de dos
partes, el Diagrama Estático de Clases o el de Casos de Uso.
De igual manera en la figura 3.5 vemos más específicamente como el sistema interactúa
con el usuario ante una petición del mismo.
Fig. 3.5 Diagrama de Interacción
10
3.4 GENERACIÓN DE CÓDIGO SCRIPTS
En esta sección se pondrá la estructura de cómo están desarrollados los scripts.
3.4.1 GENERACIÓN DE SIP.CONF
Este script se lo configuró para la definición de las extensiones que van a ser usadas por la
PBX de Asterisk, las extensiones pertenecerán a un mismo contexto (grupo) en este caso
interno_tesis, de esta forma podrán interactuar entre sí, cada una de ellas tiene propiedades
que permite que la PBX las identifique, las propiedades mínimas con las que debe constar
cada extensión son:
Tipo de extensión.- puede tener como valores lo siguiente friend, family, etc; para
este proyecto se ha definido como tipo friend que es el más usado.
Contexto a la que pertenece la extensión (esta característica es necesaria para la
PBX y se usa también en caso de haber sucursales).
Username.- es el nombre de la extensión.
Mailbox .- buzón de mensajes viene por defecto en Asterisk.
Dtmfmode.- valor del modo en el que va a funcionar el teléfono, esta definido por
el protocolo SIP.
Host.- dirección IP que tiene la extensión, en este caso es dinámico.
[general]port = 5060 ; Puerto que usa ASTERISKbindaddr = 0.0.0.context = interno_tesislanguage = es
[11000]type=friendcontext = interno_tesisusername=11000mailbox=11000dtmfmode=rfc2833host=dynamic
[11001]type=friend
11
context = interno_tesisusername=11001mailbox=11001dtmfmode=rfc2833host=dynamic
[11002]type=friendcontext = interno_tesisusername=11002mailbox=11002dtmfmode=rfc2833host=dynamic
[11003]type=friendcontext = interno_tesisusername=11003mailbox=11003dtmfmode=rfc2833host=dynamic
[11004]type=friendcontext = interno_tesisusername=11004mailbox=11004dtmfmode=rfc2833host=dynamic
3.4.2 GENERACIÓN DE VOICEMAIL.CONF
En este script se configura el buzón de voz de las extensiones creadas.
[default]; Define el número máximo de mensajes que va a guardar la carpeta de un
contexto en particular.
; maxmsg=50
1234 => 4242,Example Mailbox,root@localhost11001 => 1111,Universidad,[email protected] => 1111,Universidad,[email protected] => 1111,Universidad,[email protected]
Donde: 11001 es la extensión
12
1111 es la clave para escuchar las grabaciones Universidad es el nombre [email protected] es el mail al que le va a llegar el buzón de mensajes
3.4.3 GENERACIÓN DE EXTENSIONS.CONF
En éste script se definen todas las variables, las secuencias de las extensiones, sus
funciones, la interacción entre los sub-módulos (interno_tesis, ivr_tesis, consulta_notas,
consuta_solucitud) y la conexión a la base de datos con las respectivas sentencias SQL.
En éste módulo nos encontraremos con sentencias SQL y comandos de asterisk como los
siguientes:
MYSQL(Connect conn localhost root asterisk proyecto)
Aquí, realizamos la conexión con nuestra base de datos donde:
connid es el nombre de la conexión.loscalhost es la dirección que apunta al servidorroot es el usuario con el que se conecta al servidorasterisk es el password para hacer uso del usuarioproyecto es el nombre de la base de datos
MYSQL(Query result ${conn} SELECT\ id_materia\ from\ alumno_materia\ where cedula=${cedula}\)
En esta sentencia lo que realizamos es la consulta a la base de datos para que nos devuelva el id de la materia según la cédula que almacenamos en una variable, la misma que ingresamos al momento de ingresar a la opción1 del IVR.
MYSQL(Fetch foundRow ${result} fla)
Aquí, busca en la tabla registro por registro si existe o no información.
Set(flaq=${fla})
En esta línea se captura en una nueva variable llamada flaq la información encontrada en la variable fla.
MYSQL(Query resultid ${connid} SELECT\ nombre_materia\ from\ materia\ where id_materia=${flaq}\)
13
Esta sentencia SQL hace una consulta a la tabla materia para obtener el nombre de materia y el condicionante es que el id de la materia sea igual al valor obtenido en nuestra variable flaq.
MYSQL(Fetch fetchid ${resultid} nombr)
De igual manera que dos líneas anteriores esta sentencia lo que hace es buscar fila por fila los registros en la tabla y el resultado la almacena en una nueva variable llamada nombr.
Set(nombre=${nombr})Aquí captura el resultado encontrado y lo va almacenando en una nueva variable llamada nombre.
BackGround(tesis/${nombre})
Finalmente este comando realiza la búsqueda en nuestro sistema de la grabación con el nombre de la materia.
Lo que realiza (quien) ace es lo siguiente: una vez capturado el nombre de la materia en la variable nombre este comando la mantiene de manera temporal mientras va a la carpeta donde se encuentran las grabaciones, en este caso la carpeta donde almacenamos es tesis. Hay que tener en cuenta que para que el sistema encuentre fácilmente las grabaciones deben primero llamarse de la misma manera que los registros almacenados en la base de datos, por ejemplo si una materia se llama Comunicación de plc pues el nombre de la grabación deberá ser exactamente el mismo incluyendo espacios en blanco, letras mayúsculas y minúsculas así como también tildes o símbolos especiales. Como segundo punto importante es que para toda grabación Asterisk tiene un URL determinado para que funcione sin ningún problema y esté es var/lib/asterisk/sounds/y la carpeta donde estarán las grabaciones del proyecto, en este caso es tesis por lo tanto el URL correcto será var/lib/asterisk/sounds/tesis
Una vez explicado las sentencias SQL y comandos Asterisk, podremos entender de mejor manera el script que a continuación mencionamos y que fue desarrollado para que funcione correctamente el IVR y poder obtener la información requerida.
[general]static=yeswriteprotect=no
[globals];-------- VARIABLES TESISalumno=materia=nombre=nota=numero=flaq=solicitud=estado=
14
nivel=obs=
[interno_tesis]exten => 11000,1,Goto(ivr_tesis,s,1)exten => 11001,1,Dial(SIP/11001,10)exten => 11001,2,Voicemail(u11001)exten => 11002,1,Dial(SIP/11002,10)exten => 11002,2,Voicemail(u11002)exten => 11003,1,Dial(SIP/11003,10)exten => 11003,2,Voicemail(u11003)exten => 11004,1,Dial(SIP/11004,10)exten => 11004,2,Voicemail(u11004)exten => 11999,1,Dial(SIP/11999,10)exten => 11999,2,Voicemail(u11999)exten => 8500,1,Wait,1exten => 8500,2,VoicemailMain(${ARG1},u)exten => 8500,3,Goto(#,1)
[ivr_tesis]exten => s,1,Answerexten => s,2,Ringingexten => s,3,Wait,2exten => s,4,SetMusicOnHold,randomexten => s,5,SIPDtmfMode(rfc2833)exten => s,6,BackGround(tesis/bienvenida)exten => s,7,WaitExten(3)exten => 1,1,Goto(consulta_notas,s,1)exten => 2,1,Goto(consulta_estado_solicitud,s,1)exten => 9,1,Dial(SIP/11001)exten => 9,2,Voicemail(u11001)exten => 0,1,Hungupexten => t,1,Goto(#,1)exten => i,1,BackGround(tesis/opinvalida)exten => i,2,Goto(s,1)
[consulta_notas]exten => s,1,Answerexten => s,2,BackGround(tesis/cedula)exten => s,3,Read(cedula,,10)exten => s,4,MYSQL(Connect connid localhost root asterisk proyecto)exten => s,5,MYSQL(Query resultid ${connid} SELECT\ cedula\ from\ alumno\ where cedula=${cedula}\)exten => s,6,MYSQL(Fetch fetchid ${resultid} alumn)exten => s,7,Set(alumno=${alumn})exten => s,8,MYSQL(Clear ${resultid})exten => s,9,MYSQL(Disconnect ${connid})exten => s,10,GotoIf($[${LEN(${alumno})} = 0]?11:20)exten => s,11,BackGround(tesis/novalida)
15
exten => s,12,Goto(ivr_tesis,s,1)exten => s,20,BackGround(tesis/encabezado)exten => s,21,MYSQL(Connect conn localhost root asterisk proyecto)exten => s,22,MYSQL(Query result ${conn} SELECT\ id_materia\ from\ alumno_materia\ where cedula=${cedula}\)exten => s,23,MYSQL(Fetch foundRow ${result} fla)exten => s,24,GotoIf($["${foundRow}" = "1"]?25:50)exten => s,25,Set(flaq=${fla})exten => s,26,MYSQL(Connect connid localhost root asterisk proyecto)exten => s,27,MYSQL(Query resultid ${connid} SELECT\ nombre_materia\ from\ materia\ where id_materia=${flaq}\)exten => s,28,MYSQL(Fetch fetchid ${resultid} nombr)exten => s,29,Set(nombre=${nombr})exten => s,30,BackGround(tesis/${nombre})exten => s,31,MYSQL(Connect connid localhost root asterisk proyecto)exten => s,32,MYSQL(Query resultid ${connid} SELECT\ nivel\ from\ materia\ where id_materia=${flaq}\)exten => s,33,MYSQL(Fetch fetchid ${resultid} nive)exten => s,34,Set(nivel=${nive})exten => s,35,BackGround(tesis/${nivel})exten => s,36,MYSQL(Connect connid localhost root asterisk proyecto)exten => s,37,MYSQL(Query resultid ${connid} SELECT\ nota\ from\ alumno_materia\ where id_materia=${flaq}\ and cedula=${cedula}\)exten => s,38,MYSQL(Fetch fetchid ${resultid} not)exten => s,39,Set(nota=${not})exten => s,40,BackGround(tesis/${nota})exten => s,41,MYSQL(Connect connid localhost root asterisk proyecto)exten => s,42,MYSQL(Query resultid ${connid} SELECT\ observacion\ from\ alumno_materia\ where id_materia=${flaq}\ and cedula=${cedula}\)exten => s,43,MYSQL(Fetch fetchid ${resultid} ob)exten => s,44,Set(obs=${ob})exten => s,45,BackGround(tesis/${obs})exten => s,46,Goto(23)exten => s,47,MYSQL(Clear ${conn})exten => s,50,MYSQL(Disconnect ${conn})exten => s,51,BackGround(tesis/retorno)exten => s,52,WaitExten(3)exten => 1,1,Goto(consulta_notas,s,20)exten => 2,1,Goto(ivr_tesis,s,1)exten => 3,1,Hangup
[consulta_estado_solicitud]exten => s,1,Answerexten => s,2,BackGround(tesis/solicitud)exten => s,3,Read(solici,,3)exten => s,4,MYSQL(Connect connid localhost root asterisk proyecto)exten => s,5,MYSQL(Query resultid ${connid} SELECT\ num_solicitud\ from\ alumno_solicitud\ where num_solicitud=${solici}\)exten => s,6,MYSQL(Fetch fetchid ${resultid} solicitu)
16
exten => s,7,Set(solicitud=${solicitu})exten => s,8,MYSQL(Clear ${resultid})exten => s,9,MYSQL(Disconnect ${connid})exten => s,10,GotoIf($[${LEN(${solicitud})} = 0]?11:20)exten => s,11,BackGround(tesis/novalida1)exten => s,12,Goto(1)exten => s,20,MYSQL(Connect connid localhost root asterisk proyecto)exten => s,21,MYSQL(Query resultid ${connid} SELECT\ estado\ from\ alumno_solicitud\ where num_solicitud=${solicitud}\)exten => s,22,MYSQL(Fetch fetchid ${resultid} estad)exten => s,23,Set(estado=${estad})exten => s,24,BackGround(tesis/${estado})exten => s,25,MYSQL(Clear${connid})exten => s,26,MYSQL(Disconnect ${connid})exten => s,27,BackGround(tesis/retorno)exten => s,28,WaitExten(3)exten => 1,1,Goto(consulta_estado_solicitud,s,20)exten => 2,1,Goto(ivr_tesis,s,1)exten => 3,1,Hangup
3.5 MONITOREO Y PUESTA EN PRODUCCIÓN DEL SISTEMA
En las pantallas que se presentan a continuación se puede observar desde el momento en
que usuario entra al sistema, y todos los procesos que hace son monitoreados por el IVR.
Fig. 3.6 Llamada entre extensiones
En la figura 3.6 podemos observar la comunicación entre dos extensiones que pertenecen
al mismo contexto o grupo (interno_tesis), la llamada la esta haciendo la extensión 11001
(transmisor) hacia la extensión 11003 (receptor), como primer acto que realiza el receptor
es timbrar (ringing), y luego contesta la llamada proveniente del transmisor; luego de una
corta conversación el receptor cuelga la llamada y se produce un evento de salida (exited).
17
Fig. 3.7 Transferencia de llamada
En la figura 3.7 la extensión 11003 (transmisor) llama a la extensión 11001 (receptor) para
que a su vez le transfiera hacia la extensión 11000 y poder acceder al sistema de consulta
de la Universidad Politécnica Salesiana.
18
Fig. 3.8 Llamada al IVR
La figura 3.8 muestra la conexión de una extensión con el IVR, y como respuesta obtiene
la bienvenida al menú de opciones.
Fig. 3.9 Ingreso a la opción 1 del menú
En la figura 3.9 el usuario ingresa al IVR y escoge la opción número 1 (consulta de notas),
en ésta le pide que ingrese el número de cédula y el sistema ejecuta la sentencia para que se
ingrese máximo 10 dígitos.
Fig. 3.10 Ingreso de Cédula para consulta
En la figura 3.10 el usuario ingresa el número de cédula y el sistema se conecta a la base de
datos para hacer la verificación correspondiente y ver si existe en el sistema.
19
Fig. 3.11 Consulta con cédula registrada
La figura 3.11 el sistema después de haber verificado si existe en la base de datos la
información ingresada da como resultados el nombre de la materia, el nivel al que
pertenece esa materia, la nota que tiene y si aprobó o no la materia.
Fig. 3.12 Consulta con cédula no registrada
20
En la figura 3.12 el usuario ingresó una cédula que no esta registrada en la base de datos y
el sistema envió la información que la cédula no se encuentra en el sistema y le retornó al
usuario al menú principal de opciones para que lo vuelva a intentar.
Fig. 3.13 Ingreso a la opción 2 del menú
La figura 3.13 el usuario ingresa a la opción dos de menú del IVR consulta de estado de
solicitud. El sistema como primer evento da la bienvenida al sistema de consulta y le pide
al usuario que escoja una opción, luego de escogida el sistema solicita que ingrese el
número de solicitud y antes de que ingrese el dicho número el sistema restringe para que
solo se ingrese como máximo 3 dígitos.
21
Fig. 3.14 Consulta con número de solicitud registrada
La figura 3.14 el usuario realiza la petición del IVR e ingresa el número de solicitud (en
este caso se ingresó un número registrado en la base de datos), el sistema hace la respectiva
consulta a la base de datos y envía como resultado el estado de la solicitud. En éste caso el
estado de la solicitud es “Pendiente”, luego se desconecta de la base de datos y limpia
todas las variables que se utilizaron para realizar la conexión.
Fig. 3.15 Consulta con número de solicitud no registrada
22
En este caso la figura 3.15 muestra el resultado que da cuando el usuario ingresa un
número de solicitud no registrada, primero el usuario ingresa el número de solicitud, luego
el IVR hace la conexión con la base de datos para hacer la correspondiente consulta y
como resultado nos envía que el número de solicitud no es correcto y luego le manda al
menú principal para que lo vuelva a intentar.
Fig. 3.16 Ingreso a la opción 9 del menú del IVR
La figura 3.16 muestra el ingreso del usuario para conectarse con la operadora desde una
de las opciones del IVR, como primero paso se realiza la conexión con el IVR, luego el
IVR responde con el saludo inicial y le da como alternativa la comunicación con la
operadora si escoge la opción 9 del menú.
Fig. 3.17 Ingreso a la opción 0 del menú del IVR
En la figura 3.17 el usuario ingresa al IVR y decide salir del sistema pulsando la opción 0
del menú.
23
Fig. 3.18 Ingreso de opción errada
La figura 3.18 el usuario ingresa al IVR e ingresa una opción que no consta en el menú de
bienvenida, a lo cual el IVR envía como resultado un mensaje de que la opción no es
válida y le retorna al menú principal para que lo vuelva a intentar.