Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Diseño de Aplicaciones PDF
Diseño de Aplicaciones PDF
Any: 2014
A Isaac y a mi familia,
por la infinita paciencia que han
demostrado a lo largo de este viaje
II
Resumen
N LOS ÚLTIMOS AÑOS , la VoIP se ha ido introduciendo cada vez en más aspectos
E de nuestra vida cotidiana. Este proyecto nace de la intención de explorar las
posibilidades que ésta nos ofrece. Con la decisión de trabajar siempre con tecnología
open source se opta por utilizar dos tecnologías en auge en este momento. Asterisk,
utilizada cada vez en más empresas por su facilidad de implantación y flexibilidad.
No sólo ofrece la posibilidad de implementar una centralita de telefonía con VoIP de
forma económica, sino que además integra algunos servicios de valor añadido como los
ofrecidos por las más potentes centralitas comerciales. Android, que ha experimentado
un gran crecimiento desde su aparición, siendo uno de los dos sistemas operativos más
utilizado para smartphones y que nos permite crear aplicaciones de forma gratuita y
con un gran abanico de posibilidades a nuestra disposición.
El desarrollo de este proyecto nos ha servido para darnos cuenta de la potencia que
tienen las herramientas que hemos utilizado y las amplias posibilidades que ofrecen
para proyectos futuros.
iii
IV
CONTENIDO
1 Introducción 9
1.1 P LATAFORMA DE V O IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 C ASOS DE USO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Conceptos Generales 13
2.1 V O IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.1 ¿Q UÉ ES LA V O IP? . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.2 A RQUITECTURA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.2.1 C OMPONENTES FUNDAMENTALES DE UNA RED V O IP . . . 14
2.1.2.2 T RANSMISIÓN DE LA V O IP POR LA RED . . . . . . . . . . 15
2.1.3 C ÓDECS DE AUDIO . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.4 P ROTOCOLOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.4.1 SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.4.1.1 E JEMPLO DE UNA COMUNICACIÓN SIP/RTP . . 18
2.1.4.2 H.323 . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.1.4.3 IAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2 A STERISK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2.1 ¿Q UÉ ES A STERISK ? . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2.2 C ONCEPTOS BÁSICOS . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.3 A RQUITECTURA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.3.1 S ERVICIOS Y FUNCIONALIDADES QUE OFRECE . . . . . . . 25
2.2.4 I NTEGRACIÓN CON LA RED CONMUTADA DE TELEFONÍA . . . . . . . 26
2.2.4.1 TARJETAS ANALÓGICAS . . . . . . . . . . . . . . . . . . . 26
2.2.4.2 TARJETAS DIGITALES . . . . . . . . . . . . . . . . . . . . 26
2.3 A NDROID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.3.1 ¿Q UÉ ES A NDROID ? . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1
2.3.1.1 A RQUITECTURA . . . . . . . . . . . . . . . . . . . . . . . 27
2.3.1.2 A PLICACIONES . . . . . . . . . . . . . . . . . . . . . . . 28
2.3.1.2.1 A NATOMÍA DE UNA APLICACIÓN . . . . . . . . . 29
2.3.1.2.2 A NDROID M ANIFEST . . . . . . . . . . . . . . . 30
2.3.2 A CTIVIDADES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.3.2.1 C ICLO DE VIDA DE UNA A CTIVIDAD . . . . . . . . . . . . 31
2.3.3 I NTENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.3.4 I NTERFAZ DE U SUARIO . . . . . . . . . . . . . . . . . . . . . . . . 33
2.3.4.1 C OMPONENTES DE LA PANTALLA . . . . . . . . . . . . . . 33
2.3.4.1.1 V ISTAS . . . . . . . . . . . . . . . . . . . . . . 33
2.3.4.1.2 L AYOUTS . . . . . . . . . . . . . . . . . . . . . 34
2.3.4.2 M ENÚS . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.3.4.3 D IÁLOGOS . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.3.4.4 N OTIFICACIONES . . . . . . . . . . . . . . . . . . . . . . 36
2.3.5 S ERVICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3.6 B ROADCAST R ECEIVERS . . . . . . . . . . . . . . . . . . . . . . . 37
2.3.7 P ERSISTENCIA DE D ATOS . . . . . . . . . . . . . . . . . . . . . . . 37
2.3.7.1 S HARED P REFERENCES . . . . . . . . . . . . . . . . . . . 37
2.3.7.2 B ASE DE DATOS LOCAL . . . . . . . . . . . . . . . . . . . 37
2.3.8 LBS (L OCATION B ASED S ERVICES ) . . . . . . . . . . . . . . . . . 38
3 Implementación de la Centralita 39
3.1 O BJETIVO . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . 39
3.2 E NTORNO DE SIMULACIÓN . . . . . . . . . . . .
. . . . . . . . . . . . . . 39
3.3 I NSTALACIÓN DEL ENTORNO . . . . . . . . . . .
. . . . . . . . . . . . . . 40
3.3.1 TARJETA D IGIUM TDM808 . . . . . . . .
. . . . . . . . . . . . . . 41
3.3.2 C ANCELADOR DE ECO O SLEC . . . . . . .
. . . . . . . . . . . . . . 41
3.3.3 G ESTOR DE CORREO . . . . . . . . . . .
. . . . . . . . . . . . . . 42
3.3.4 R ECONOCIMIENTO DE VOZ . . . . . . . .
. . . . . . . . . . . . . . 42
3.3.5 S OFTPHONE . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . 42
3.4 C ONFIGURACIONES . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . 43
3.4.1 TARJETA D IGIUM Y C ANCELADOR DE ECO O SLEC . . . . . . . . . . 43
3.4.2 C ANALES DAHDI . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.4.3 A STERISK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.4.3.1 U SUARIOS . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.4.3.2 D IALPLAN . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4.3.3 M ÚSICA EN ESPERA . . . . . . . . . . . . . . . . . . . . . 50
3.4.3.4 B UZÓN DE VOZ . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.3.5 F OLLOW M E . . . . . . . . . . . . . . . . . . . . . . . . 50
3.4.3.6 S ALA DE C ONFERENCIAS . . . . . . . . . . . . . . . . . . 51
3.4.3.7 C OLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2
3.4.3.8 T RANSFERENCIA Y PARKING DE LLAMADAS . . . . . . . . 52
3.4.4 C ENTRALITA PBX . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.4.4.1 I NTEGRACIÓN DEL RECONOCIMIENTO DE VOZ . . . . . . . 55
3.4.5 E JECUCIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6 Bibliografía 111
3
A.2.1 C ANALES DAHDI . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
A.2.2 U SUARIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
A.2.3 D IALPLAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
A.2.4 M ÚSICA EN ESPERA . . . . . . . . . . . . . . . . . . . . . . . . . . 125
A.2.5 B UZÓN DE VOZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
A.2.5.1 G ESTOR DE CORREO . . . . . . . . . . . . . . . . . . . . 126
A.2.6 F OLLOW M E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
A.2.7 S ALA DE C ONFERENCIAS . . . . . . . . . . . . . . . . . . . . . . . 127
A.2.8 C OLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
A.2.9 T RANSFERENCIA Y PARKING DE LLAMADAS . . . . . . . . . . . . . . 127
4
LISTA DE FIGURAS
5
LISTA DE FIGURAS
6
LISTA DE TABLAS
7
LISTA DE TABLAS
8
1
Introducción
La idea principal era realizar un proyecto basado en VoIP, cosa que se ha mantenido
a lo largo de todo el desarrollo. En principio, se empezó con el estudio de Asterisk
con la idea de desarrollar una centralita telefónica, por ejemplo, para una empresa y
utilizarla como punto de partida. Al estudiar las posibilidades de Asterisk se decidió
realizar un cambio de dirección y crear algo que pudiera aprovechar el trabajo ya
realizado. Fue entonces cuando se decidió implementar una aplicación Android que
utilizara la VoIP, como un softphone. Una vez terminada la aplicación, se pensó en
conseguir un valor añadido para el mismo, que acabara de redondear el proyecto y
que unificara la idea de la centralita con el softphone realizado.
Como últimamente casi todas las aplicaciones Android utilizan de una forma u otra
la ubicación del usuario, se decidió que el valor añadido de las aplicaciones estaría
relacionado con el sensor GPS del smartphone. Para ello se enfocó el proyecto a un
hipotético caso real: una residencia de ancianos. Algunas residencias y centros de
día permiten a sus residentes salir a pasear o a comprar por sus alrededores. Como
algunos de ellos pueden perderse o desorientarse una vez en el exterior, se desea
mantener su ubicación controlada cuando se alejan demasiado de la residencia.
Así es como se consiguió el proyecto final: una plataforma de VoIP diseñada espe-
cialmente para su utilización en una residencia de ancianos. La centralita realizada
en Asterisk se convirtió en la centralita de la residencia de ancianos. Por último, a
partir del softphone inicial, se crearon dos softphones con distintas características: uno
9
CAPÍTULO 1. I NTRODUCCIÓN
diseñado para los residentes del centro y el otro diseñado específicamente para los
trabajadores, concretamente para el personal de la recepción.
* Implantación de Asterisk.
* Softphone para la recepción del centro: softphone con un sistema que permita
gestionar las alertas generadas por los residentes.
1.1 P LATAFORMA DE V O IP
* LAMP: servidor y base de datos. Esta base de datos se utiliza para guardar y
consultar información sobre los residentes del centro (localización y estado de la
batería del teléfono).
10
1.2. C ASOS DE USO
11
CAPÍTULO 1. I NTRODUCCIÓN
12
Conceptos Generales
2
2.1 V O IP
2.1.1 ¿Q UÉ ES LA V O IP?
13
CAPÍTULO 2. C ONCEPTOS G ENERALES
2.1.2 A RQUITECTURA
14
2.1. V O IP
Los paquetes de VoIP se transmiten sobre la red IP utilizando el modelo TCP/IP con
algunas diferencias. Estas diferencias residen en los protocolos utilizados en cada capa
por los paquetes de datos y los paquetes de VoIP. En algunas capas se utilizan los
mismos para ambos; en otras, se utilizan protocolos propios para cada tipo.
A continuación se detallan las funciones de las cinco capas del modelo TCP/IP con
los protocolos utilizados en los paquetes de VoIP:
* Aplicación: Asegura la calidad y entregabilidad de los paquetes VoIP. Se utilizan
los siguientes protocolos:
– NTP: Network Time Protocol. Permite sincronización, lo que nos asegura que
las señales son transmitidas y recibidas en el margen de tiempo adecuado
para asegurar calidad.
– RTP: Real-time Transport Protocol. Proporciona funciones de transporte de
red extremo-a-extremo para las señales de voz digitales encapsuladas en los
paquetes VoIP.
– RTCP: Real-time Transport Control Protocol. Monitoriza la entrega de las
señales de voz y proporciona funciones mínimas de control para asegurar la
entrega de los paquetes.
* Transporte: El protocolo UDP2 transporta los paquetes desde el origen al destino.
2
User Data Protocol
15
CAPÍTULO 2. C ONCEPTOS G ENERALES
Los códecs5 son los medios por los cuales se puede convertir la señal de voz analógica a
digital para poder transportarla por la red. Se pueden definir como modelos matemáti-
cos usados para codificar y comprimir digitalmente información de audio analógica.
La mayoría tienen en cuenta la capacidad del cerebro humano de interpretar la
información recibida a pesar de que esté incompleta. Los algoritmos de compresión de
voz se aprovechan de nuestra tendencia a interpretar lo que creemos que debemos oír
en vez de lo que realmente oímos. El propósito de los algoritmos de codificación es
encontrar un equilibrio entre eficiencia y calidad.
En VoIP se pueden utilizar una gran variedad de códecs de audio. La elección para
cada caso varía en función de los requerimientos de calidad de sonido, ancho de banda
necesario y carga computacional. A continuación se enumeran y describen algunos de
los más utilizados.
G.711 Códec fundamental de la PSTN estandarizado por la ITU en 1972. Tiene una
frecuencia de muestreo de 8 kHz y utiliza la modulación PCM6 . Existen dos
métodos de compansión7 : µ − law en América del Norte y Japón y a − law en
el resto del mundo. La principal diferencia radica en el número de muestras
3
Medium Access Control
4
Network Interface Card
5
Abreviatura de codificador – decodificador, aunque actualmente también se utiliza como abre-
viatura de compresor-decompresor.
6
Pulse Code Modulation.
7
Método aplicable a señales para mejorar la transmisión de las mismas en canales limitados. Está
formado por dos procesos: compresión y expansión.
16
2.1. V O IP
G.729A Este códec presenta una calidad de sonido muy buena teniendo en cuenta
el poco ancho de banda que utiliza, sólo 8 kbps. Para ello utiliza el método de
compresión de habla CS-ACELP8 . Debido a patentes, este códec no se puede usar
sin pagar una licencia. Además, la carga computacional de este algoritmo es
bastante elevada.
GSM9 Este códec, que opera a 13 kbps, es el preferido de Asterisk. No requiere licencia
y ofrece un gran rendimiento en relación a los requerimientos de CPU. La calidad
de sonido se considera ligeramente peor que la obtenida con G.729A.
2.1.4 P ROTOCOLOS
Los protocolos propios de las redes IP no fueron diseñados para soportar streaming
en tiempo real. Los terminales de estas redes suelen esperar la recepción de paquetes
perdidos, piden retransmisiones o simplemente los ignoran. Obviamente, la forma en
la que hablamos es totalmente incompatible con la manera en que los protocolos de
Internet transportan los datos: no se puede aceptar la pérdida de letras o palabras o
los retrasos apreciables entre emisor y receptor.
El mecanismo para llevar a cabo una conexión de VoIP consta de una serie de
intercambios de señalización entre los terminales (y gateways intermedios) que
culminan en dos flujos de media continuos que transportan la conversación (uno para
cada dirección). Manejar esto es el objetivo de los protocolos de VoIP. A continuación
se definen los más relevantes y utilizados.
2.1.4.1 SIP10
Protocolo desarrollado por el IETF11 para establecer, modificar y terminar sesiones mul-
timedia. Estas sesiones incluyen llamadas de voz y vídeo, conferencias multimedia, etc.
8
Conjugate-Structure Algebraic-Code-Excited Linear Prediction. Método de compresión del habla
que consiste en enviar códigos correspondientes a los sonidos en vez del sonido muestreado real.
9
Global System for Mobile Communications
10
Session Initiation Protocol
11
Internet Engineering Task Force
17
CAPÍTULO 2. C ONCEPTOS G ENERALES
18
2.1. V O IP
ejemplo hay tres agentes a tener en cuenta: los clientes 501 (IP 192.168.1.33) y 202
(IP 192.168.1.34), siendo el primero el que inicia y finaliza la llamada; y el servidor de
VoIP (IP 192.168.1.38). En la figura 2.3 se muestran las tramas más relevantes de esta
llamada.
* Tramas 8-9: El cliente 202 descuelga el teléfono. Esto se indica al servidor me-
diante un paquete (OK) con la información de la sesión: audio, puerto 4006 y
protocolo RTP. A partir de este momento, se inicia la conversación.
* Tramas 10-17: Estas tramas representan el intercambio de datos (audio) entre los
dos terminales. Como se ha indicado antes, el protocolo utilizado para ello es el
RTP.
19
CAPÍTULO 2. C ONCEPTOS G ENERALES
* Tramas 18-21: El cliente 501 cuelga el teléfono, enviando al servidor una petición
(BYE) para que comunique al cliente 202 que se va a finalizar la comunicación.
El servidor confirma la petición al cliente 501 e informa al otro cliente de la
finalización de la comunicación, enviando otra petición (BYE) especificando el
motivo de la finalización (normal clearing).
2.1.4.2 H.323
Protocolo desarrollado por la ITU13 en 1996 como medio para transmitir comunica-
ciones de voz, vídeo, datos y fax sobre redes IP manteniendo conectividad con la PSTN.
Originalmente, fue diseñado para proporcionar un mecanismo de transporte IP para
videoconferencias y desde entonces ha evolucionado para cubrir todas las necesidades
de la VoIP. La señalización de llamadas está basada en el protocolo Q.391 de la ITU-T
y es adecuada para transmitir llamadas a través de redes utilizando una mezcla de IP,
PSTN y ISDN.
2.1.4.3 IAX14
20
2.2. A STERISK
2.2 A STERISK
2.2.1 ¿Q UÉ ES A STERISK ?
Asterisk es un software open source que implementa las funciones de una central
telefónica PBX15 . Este proyecto de comunicaciones fue creado en 1999 por Mark
Spencer, miembro fundador de la compañía Digium, principal desarrolladora de
Asterisk. Está publicado como open source bajo la licencia GNU GPL16 . Aunque
originalmente fue diseñado para funcionar en Linux, también existen versiones para
otros sistemas operativos como BSD, Mac OS X, Solaris y Windows.
Asterisk cuenta con toda una comunidad, liderada por Digium, que lo desarrolla y
soporta. Esta comunidad ha sido valorada como factor clave para en el crecimiento de
la VoIP. Entre sus miembros se encuentran profesionales del ámbito de las telecomuni-
caciones, de redes y de tecnologías de la información.
15
Private Branch eXchange.
16
GNU General Public License.
17
Zapata Telephony Project: proyecto concebido por Jim Dixon, basado en la creación de sistemas
telefónicos más económicos utilizando tarjetas PCI con la electrónica básica para comunicarse con un
circuito de telefonía. En vez de tener componentes caros en la tarjeta, el procesado de la señal digital
(DSP) se maneja en la CPU, por software. Fue la base para la creación del interfaz DAHDI, que se
explicará más adelante.
21
CAPÍTULO 2. C ONCEPTOS G ENERALES
Canales
Los canales son las conexiones que realizan una llamada entrante o saliente a la PBX
Asterisk. Cada llamada se realiza o recibe mediante un canal distinto. Asterisk no
hace ninguna distinción entre ellos. Entre los canales soportados más importantes se
encuentran: SIP, IAX2, H323, MGCP, Console y DAHDI.
Dialplan
El dialplan es el corazón de Asterisk. Todos los canales que llegan al sistema pasan
por el dialplan, que contiene los scripts de flujo de llamadas que determinan el
manejo de las llamadas entrantes y salientes. Está dividido en secciones llamadas
contextos. Dentro de estos contextos encontramos las extensiones y la definición de
las actuaciones o pasos que debe realizar el sistema al recibir una llamada para cada
extensión.
Contextos
Un contexto es, básicamente, una colección de extensiones. Cuando se crean canales,
estos siempre deben ubicarse en un contexto. Esto implica que las llamadas originadas
desde ese canal se ubicarán en dicho contexto.
El objetivo más importante de los contextos es ofrecer seguridad, evitando que las
diferentes secciones del dialplan interactúen entre ellas. Los canales sólo podrán
realizar llamadas hacia las extensiones incluidas en su contexto o acceder a funcionali-
dades propias del mismo.
Extensiones
Al contrario que en los sistemas telefónicos convencionales, donde las extensiones
se asocian a terminales, interfaces, menús, etc., en Asterisk las extensiones se
asocian a un listado de instrucciones a ejecutar. Estas instrucciones pueden tanto
llamar a un número de teléfono como acceder al buzón de voz o cualquier otra función.
18
Asterisk Extension Logic
22
2.2. A STERISK
2.2.3 A RQUITECTURA
Asterisk está formado por un conjunto de bloques o módulos que el usuario tiene
a su disposición para crear aplicaciones de comunicación. Por este motivo se hace
referencia a Asterisk con los términos tool-kit o plataforma de desarrollo.
23
CAPÍTULO 2. C ONCEPTOS G ENERALES
para definir las diversas acciones que se pueden aplicar a una llamada. Por ejem-
plo: marcar un número, transferir una llamada, acceder al buzón de voz, etc.
* CDR modules (Call Detail Recording): Diseñados para facilitar tantos métodos
de guardar detalles de las llamadas como sea posible. Estos detalles pueden
guardarse en un archivo (por defecto), una base de datos, RADIUS o syslog.
* CEL modules (Channel Event Logging): Proporcionan control sobre los informes de
actividad de una llamada. El uso de estos módulos requiere una planificación del
dialplan más cuidadosa.
* Channel drivers: Necesarios para realizar llamadas. Cada driver es específico para
el protocolo o tipo de canal que soporta (SIP, IAX2, ISDN, DAHDI, etc.). Este
módulo actúa como un gateway con el núcleo de Asterisk. La lista de protocolos
soportados por Asterisk se puede ver en la tabla 2.1.
* Format interpreters: Realizan la misma función que los codec translators pero en
archivos, en vez de canales. Por ejemplo: cambiar el formato a una grabación de
un menú en GSM para que se pueda reproducir en un canal que no soporte este
formato.
* Resource modules: Integran a Asterisk con recursos externos. Por ejemplo: permi-
tir la operatividad con bases de datos ODBC, la utilización de la música en espera,
grabar una llamada, etc.
24
2.2. A STERISK
* Buzón de voz.
25
CAPÍTULO 2. C ONCEPTOS G ENERALES
Las tarjetas analógicas permiten conectar el servidor Asterisk con la red conmutada de
telefonía y/o con teléfonos analógicos. Existen dos tipos:
* FXO (Foreign eXchange Office): permiten interactuar con los portadores de la red
de telefonía.
Las tarjetas analógicas diseñadas por Digium reciben el nombre de TDM y pueden
interactuar tanto con líneas externas como con teléfonos analógicos en función de
los módulos presentes en la tarjeta. Al inspeccionar visualmente estas tarjetas, se
diferencian los tipos de módulos por el color: FXO (rojos); FXS (verdes).
Las tarjetas digitales permiten conectar Asterisk con una red digital RDSI. De esta clase
de tarjetas se encuentran dos tipos:
* Básicas (BRI): cada puerto BRI tiene dos canales de voz más uno de señalización,
permitiendo mantener dos conversaciones de forma simultánea.
* Primarios (PRI): cada primario tiene 30 canales de voz más uno de señalización,
permitiendo establecer unas 30 conversaciones simultáneas.
En un sistema Asterisk que requiera el uso de estas tarjetas para conectarse a la red
telefónica será necesaria la instalación de:
26
2.3. A NDROID
* DAHDI19 : Interfaz utilizado para controlar una gran cantidad de tarjetas analógi-
cas y/o digitales.
2.3 A NDROID
2.3.1 ¿Q UÉ ES A NDROID ?
Su código está publicado bajo la licencia de código abierto Apache, por lo que
cualquiera que quiera trabajar con Android puede descargarlo y editarlo. Esta cualidad
hace de Android un producto muy atractivo, ya que permite competir con el gran
despliegue y éxito que el iPhone de Apple está teniendo en el mercado.
Este SO está basado en un sistema intuitivo que permite a los usuarios navegar
por los distintos menús y aplicaciones del terminal de forma sencilla, sin necesidad de
recurrir a un manual de instrucciones que, a veces, es incluso inexistente.
2.3.1.1 A RQUITECTURA
27
CAPÍTULO 2. C ONCEPTOS G ENERALES
* Linux Kernel: kernel en el que se basa Android. Esta capa contiene todos los
drivers de bajo nivel para los componentes hardware de un terminal.
* Android Runtime: Contiene una conjunto de librerías que permiten a los desarro-
lladores escribir aplicaciones Android usando el lenguaje Java. También incluye
la máquina virtual Dalvik, que está diseñada y optimizada específicamente para
terminales Android.
2.3.1.2 A PLICACIONES
Las aplicaciones Android se escriben en lenguaje Java. Las herramientas Android SDK
compilan el código, junto con los datos y archivos necesarios, en un paquete Android
(archivo con extensión .apk). Este archivo es lo que utilizan los dispositivos Android
28
2.3. A NDROID
29
CAPÍTULO 2. C ONCEPTOS G ENERALES
* gen: contiene el archivo R.java, que referencia todos los recursos del proyecto.
No hay que modificarlo ya que se regenera cada vez que se realiza una compi-
lación.
* assets: contiene todos los bienes de la aplicación: HTML, archivos de texto, bases
de datos, etc.
* res: contiene todos los recursos de la aplicación: imágenes, layouts, strings, etc.
En la carpeta res/layout se encuentran los archivos XML, donde se definen las
IUs de las distintas actividades de la aplicación.
30
2.3. A NDROID
2.3.2 A CTIVIDADES
La clase Actividad define una serie de métodos imprescindibles que gobiernan su ciclo
de vida y cuya implementación es crucial para desarrollar aplicaciones flexibles y
robustas.
El ciclo de vida de una actividad y los métodos que lo definen pueden observarse en
la figura 2.6.
* onCreate(): se llama cuando una actividad se crea por primera vez. Aquí se
deben inicializar los componentes esenciales de la actividad, así como especificar
el layout que se usará como IU. Este método también recupera el estado previo
de la actividad, en caso de haber sido guardado en una ejecución anterior.
* onStop(): se llama cuando la actividad deja de ser visible por el usuario. En este
estado, igual que onPause(), el sistema puede destruir la actividad en caso de
necesitar la memoria ocupada por ésta.
31
CAPÍTULO 2. C ONCEPTOS G ENERALES
2.3.3 I NTENTS
32
2.3. A NDROID
En función de las necesidades del usuario, los objetos de tipo Intent pueden
utilizarse para pasar información necesaria al componente que los recibe o al sistema
Android.
Todas las categorías añadidas a un objeto Intent tienen que coincidir con el Intent
Filter para que el componente deseado pueda ser invocado.
Una actividad, por si misma, no tiene presencia en la pantalla, sino que debe dibujar
los elementos de la IU utilizando objetos de tipo View (vistas) y ViewGroup (layouts).
Normalmente, la IU se define mediante un archivo XML, donde se especifican todos sus
componentes. Dependiendo de las necesidades del usuario, la IU puede programarse
dinámicamente, en tiempo de ejecución.
2.3.4.1.1 V ISTAS
Una vista es un widget que tiene presencia en la pantalla. Una ViewGroup propor-
ciona el layout en el que se ordenan todas las vistas que aparecen en la pantalla de una
actividad. A través de las vistas, el usuario es capaz de interactuar con la actividad.
33
CAPÍTULO 2. C ONCEPTOS G ENERALES
FIGURA 2.7: Ejemplo de un Linear Layout con las vistas más comunes y los dos tipos
de menús existentes.
2.3.4.1.2 L AYOUTS
Los layouts son la arquitectura de la IU en una actividad: definen la estructura de la
pantalla y la posición de los elementos que la componen (vistas).
34
2.3. A NDROID
2.3.4.2 M ENÚS
Los menús se utilizan en las actividades para mostrar opciones adicionales que no se
ven directamente en la IU. En Android nos encontramos con dos tipos:
* Options menu: muestra opciones relacionadas con la actividad actual. En la ver-
sión de Android 2.3 o inferior, este menú se muestra en la parte baja de la pantalla
al pulsar la tecla MENU del terminal. A partir de la versión 3.0, estas opciones
se muestran en la Action Bar, que es una barra situada permanentemente en la
parte superior de la actividad. En esta barra aparecen accesos directos del menú
y un listado de opciones.
* Context menu: muestra opciones relacionadas con una vista específica de la activi-
dad. Este menú se activa al mantener pulsada una vista de la IU. Aparece como
una lista flotante de opciones en la pantalla. Se puede definir un context menu
diferente para cada elemento de la IU.
El aspecto de estos menús se puede observar en la pantalla mostrada en la figura 2.7.
2.3.4.3 D IÁLOGOS
Un diálogo es una ventana pequeña que aparece al frente de la actividad actual. Los
diálogos interrumpen la actividad para notificar algo al usuario o para realizar algunas
tareas relacionadas con la actividad en curso.
35
CAPÍTULO 2. C ONCEPTOS G ENERALES
* Progress Dialog: se usa para mostrar algún progreso relativo a la actividad, como
por ejemplo, el estado de una descarga.
2.3.4.4 N OTIFICACIONES
2.3.5 S ERVICIOS
36
2.3. A NDROID
Normalmente, este componente se utiliza como una puerta hacia otros compo-
nentes y se pretende que haga el mínimo trabajo posible: recibe el evento y activa
otro componente para que lo maneje. Aunque la aplicación no esté funcionando, el
broadcast receiver puede continuar escuchando por si llegan nuevos eventos.
Esta opción consiste en un mecanismo ligero que permite guardar datos simples de
la aplicación, por ejemplo, las preferencias de usuario. El objeto SharedPreferences
guarda, de forma automática, en un archivo XML, los datos que se especifiquen con
el formato de pares key/value. Estos datos persisten aunque se finalice la aplicación
(tanto de forma manual como forzada por el sistema).
37
CAPÍTULO 2. C ONCEPTOS G ENERALES
Las principales funciones que se pueden realizar con los LBS en Android son las
siguientes:
* Mostrar mapas, navegar por ellos, hacer zoom y cambiar de vista (satélite, calle-
jero, tráfico).
* Añadir objetos que se dibujen encima del mapa, como por ejemplo, marcadores o
letreros.
Si se desea utilizar Google Maps hay que especificarlo en la build target del proyecto,
ya que Google Maps no forma parte del Android SDK estándar.
38
3
Implementación de la Centralita
3.1 O BJETIVO
en la introducción de este documento, uno de los ob-
C OMO SE HA COMENTADO
jetivos del proyecto es la implantación de un sistema de telefonía VoIP con la
implementación de una centralita telefónica para la residencia de ancianos. Para ello
se ha escogido Asterisk, ya que permite, de forma sencilla, construir una PBX en un
ordenador convencional.
39
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
* Asterisk 10.0.0
* libPRI 1.4.12
40
3.3. I NSTALACIÓN DEL ENTORNO
Además de estos paquetes básicos, también se instalarán otros que servirán para
añadir funcionalidades y mejorar la calidad de los servicios ofrecidos por la centralita.
Estos paquetes son:
Para comunicar Asterisk con la red de telefonía se instala en el servidor una tarjeta
analógica de Digium, la TDM808. Las tarjetas de la serie 800 soportan hasta ocho
conexiones por tarjeta utilizando sus ocho puertos. Estos puertos pueden tener dos
tipos de interfaces diferentes y se distinguen visualmente por su color: FXO (rojo) y
FXS (verde). La TDM808 está compuesta por ocho módulos rojos, de tipo FXO.
Por defecto, el cancelador de eco software para las líneas analógicas que maneja
DAHDI es el mg2. Dado que el rendimiento del cancelador por defecto no es
demasiado bueno, se decide utilizar Oslec en su lugar. Oslec es un cancelador de
eco de línea open source de alto rendimiento que, aunque no viene incluido en el
paquete DAHDI, se puede integrar de forma fácil para que funcione con DAHDI. A
continuación se detallarán los pasos a seguir para instalar Oslec en el sistema. La
41
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
posterior configuración e integración con DAHDI se explicará más adelante. Los pasos
seguidos para su instalación se pueden observar en el anexo A.1.5.
SSMTP es un programa que sirve para enviar correos electrónicos desde un ordenador
local a un host de correo configurado (mailhub). Uno de sus principales usos es el
reenvío de correos electrónicos automatizados desde el ordenador a una dirección de
correo externa.
3.3.5 S OFTPHONE
42
3.4. C ONFIGURACIONES
3.4 C ONFIGURACIONES
1
Los módulos FXO se definen con la nomenclatura contraria ’fxs’. Estos módulos usan señalización
’ks’ (Kewlstart Signalling), que corresponde a señalización loopstart con supervisión de desconexión.
43
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
# Global data
loadzone = es
defaultzone = es
A continuación hay que cargar los drivers de DAHDI en el kernel mediante la si-
guiente instrucción. El driver adecuado para la serie 800 es el wctdm24xxp.
> cd / etc / dahdi
> modprobe wctdm24xxp
Para habilitar el cancelador de eco Oslec, hay que modificar las siguientes líneas en
dos archivos ubicados en el directorio /etc/dahdi del sistema:
> nano / etc / dahdi / init . conf
# Descomentamos esto :
DAHDI_UNLOAD_MODULES = " dahdi echo " # If you use OSLEC
44
3.4. C ONFIGURACIONES
Las configuraciones de señalización y los códigos utilizados para los tonos en la red
de telefonía varían en función de la zona o el país en el que nos encontremos. Por eso
hay que realizar unos cambios para conseguir que la configuración de la tarjeta sea la
adecuada para operar en España. Con este fin, se hacen las siguientes modificaciones
en estos archivos:
> nano / etc / asterisk / indications . conf
country = es
Por último, se verifica que la configuración de los módulos de la tarjeta sea la co-
rrecta y que se hayan aplicado correctamente todos los cambios. Para ello se utiliza
una instrucción que muestra por pantalla un resumen de los puertos de la tarjeta y su
configuración.
> dahdi_cfg - vvv
Configuration
======================
Channel map :
Channel 01: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 01)
Channel 02: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 02)
Channel 03: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 03)
Channel 04: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 04)
Channel 05: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 05)
Channel 06: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 06)
Channel 07: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 07)
Channel 08: FXS Kewlstart ( Default ) ( Echo Canceler : oslec ) ( Slaves : 08)
8 channels to configure .
Se hace una última comprobación mediante la instrucción dmesg, que lista el buffer
de mensajes del núcleo, y se buscan las líneas relativas a las configuraciones que se han
45
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
llevado a cabo. A continuación se muestran estas líneas, donde vemos que se detecta
la tarjeta Digium con los puertos de tipo FXO configurados para funcionar con los tonos
de España y que se han encontrado también los dos canceladores de eco: hardware
(HWEC VPMADT032) y software (Oslec).
wctdm24xxp 0000:07:04.0: Freed a Wildcard
wctdm24xxp 0000:07:04.0: PCI INT A disabled
dahdi : Telephony Interface Unloaded
dahdi : Telephony Interface Registered on major 196
dahdi : Version : 2.5.0.2
wctdm24xxp 0000:07:04.0: PCI INT A -> GSI 20 ( level , low ) -> IRQ 20
wctdm24xxp 0000:07:04.0: Port 1: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 2: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 3: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 4: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 5: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 6: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 7: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 8: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Booting VPMADT032
wctdm24xxp 0000:07:04.0: VPM present and operational ( Firmware
version 125)
wctdm24xxp 0000:07:04.0: Found a Wildcard TDM : Wildcard TDM800P (0
BRI spans , 8 analog channels )
wctdm24xxp 0000:07:04.0: Freed a Wildcard
wctdm24xxp 0000:07:04.0: PCI INT A disabled
dahdi : Telephony Interface Unloaded
dahdi : Telephony Interface Registered on major 196
dahdi : Version : 2.5.0.2
wctdm24xxp 0000:07:04.0: PCI INT A -> GSI 20 ( level , low ) -> IRQ 20
wctdm24xxp 0000:07:04.0: Port 1: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 2: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 3: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 4: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 5: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 6: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 7: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Port 8: Installed -- AUTO FXO ( SPAIN mode )
wctdm24xxp 0000:07:04.0: Found a Wildcard TDM : Wildcard TDM800P (0
BRI spans , 8 analog channels )
dahdi_echocan_oslec : Registered echo canceler ' OSLEC '
46
3.4. C ONFIGURACIONES
Se definen los ocho canales disponibles dentro de un único grupo (1), por lo
tanto, todos los canales tendrán las mismas características. Se especifica el tipo de
señalización (fxs_ks) y que el identificador de llamada de estos canales venga marcado
por el obtenido de la red telefónica. También se define el contexto que utilizarán todos
los canales ([f rom − pstn]). Esto quiere decir que todas las llamadas que utilicen estos
canales (entrantes desde la red telefónica) ejecutarán las instrucciones del dialplan
correspondientes a este contexto. Como se puede deducir, el contexto [f rom − pstn] es
donde se ubica la definición de la centralita (PBX).
3.4.3 A STERISK
3.4.3.1 U SUARIOS
47
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
Residentes [PermisosResidentes]
200, 201, 202
501 (recepción)
502 (trabajadora social)
503 - 505 (gerocultoras)
506 (despacho directora)
Trabajadores [PermisosTrabajadores]
507 (móvil directora)
508 (casa directora)
509 (psicóloga)
500 (jefa de enfermeras)
Para realizar las simulaciones se han definido una serie de clientes que representan
a los posibles usuarios del sistema implementado en la residencia de ancianos. Se
diferencian dos tipos: los residentes y los trabajadores. A cada tipo se le asigna un
contexto diferente ya que no todos podrán acceder a las mismas extensiones en el
dialplan. A todos los usuarios se les habilita el códec G.711 en sus dos versiones (a-law
y u-law).
3.4.3.2 D IALPLAN
En este caso se han definido una serie de contextos que permitirán realizar una serie
de acciones dependiendo del tipo de usuario o del punto de acceso. A continuación se
listan los contextos utilizados y se resumen sus funciones:
* [usuarios]: este contexto contiene las extensiones que permiten: acceder a la
macro de llamadas para todos los usuarios (trabajadores y residentes) y acceder
a la sala de conferencias 101 (que se explicará más adelante).
* [macro−U naExten]: las macros son contextos especiales que se pueden reutilizar
en otros contextos. Este contexto sólo contiene la extensión s, que es modificada
48
3.4. C ONFIGURACIONES
49
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
3.4.3.5 F OLLOW M E
50
3.4. C ONFIGURACIONES
Las salas de conferencia permiten crear conversaciones entre múltiples usuarios como
si estuvieran todos en una misma localización física. Algunas de las principales
características de este servicio incluyen: la creación de varias salas distintas con
acceso protegido por contraseña, la posibilidad de regular el número de participantes
(fijando un número máximo, echando usuarios o bloqueando la sala), la capacidad de
enmudecer a uno o varios participantes, etc.
En este caso se crean dos salas de conferencias con diferentes contraseñas. La sala
número 600 sólo es accesible por los trabajadores de la residencia. La sala número
101 permite el acceso a usuarios tanto internos como externos. El acceso exterior se
encuentra en una extensión del menú privado de la centralita. El acceso interior se
encuentra en el contexto [usuarios] disponible tanto para los residentes como para los
trabajadores.
3.4.3.7 C OLAS
51
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
prioridad. En este caso, los miembros serán las gerocultoras (usuarios 503, 504 y
505, en este orden). También se pueden fijar varias opciones, como por ejemplo: tipo
de anuncios que se hacen al llamante mientras está en cola, música que se escucha
mientras se espera a ser atendido, número de reintentos, tiempo máximo de espera en
cola, etc.
Las llamadas entrantes exteriores son tratadas por el contexto [f rom − pstn]. En
él se encuentra la puerta de entrada a la centralita. Si la llamada se recibe den-
tro del horario de recepción, se pasa la llamada al contexto [centralita_ASR] dando
acceso al menú de la PBX. Si no, se envía la llamada al buzón de voz de recepción (501).
52
3.4. C ONFIGURACIONES
53
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
De todas formas, aunque se entrara por error, el acceso está protegido por una
contraseña.
* Extensión #: Colgado. Después de pasar por cualquier extensión, todas las lla-
madas son dirigidas a ésta. Aquí se despide al llamante mediante una locución
de voz y se cuelga la llamada.
54
3.4. C ONFIGURACIONES
55
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
# ! / bin / sh
cat $ { dir }/ numbers . txt | agrep -f $ { dir }/ out . txt | head -c 1 >
$ { dir }/ num . txt
3.4.5 E JECUCIÓN
Una vez instalados y configurados todos los componentes necesarios se debe poner en
marcha todo el sistema. Para ello hay que iniciar los servicios DAHDI y Asterisk (en ese
orden) mediante las siguientes instrucciones:
> service dahdi start
> service asterisk start
56
3.4. C ONFIGURACIONES
57
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
58
3.4. C ONFIGURACIONES
59
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
60
3.4. C ONFIGURACIONES
61
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
62
3.4. C ONFIGURACIONES
63
CAPÍTULO 3. I MPLEMENTACIÓN DE LA C ENTRALITA
64
4
Implementación de los Softphones
4.1 O BJETIVO
* Una base de datos en el servidor, para lo que se instala LAMP, y una serie de
scripts PHP que servirán para acceder, consultar y modificar esta base de datos
desde las aplicaciones Android.
65
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
* Unas extensiones especiales en Asterisk que servirán para comunicar las situa-
ciones de emergencia entre los residentes y la recepción. Estas extensiones están
definidas en el dialplan de Asterisk bajo el contexto [android_V A].
Para poder implementar cualquier aplicación Android hay que instalar el entorno
de programación y simulación adecuado. Todas las herramientas necesarias para
desarrollar aplicaciones Android son gratuitas (libres) y están disponibles para todas
las plataformas (Linux, Mac, Windows). En este caso se utilizarán las herramientas
recomendadas en Android Developers: Eclipse + Android SDK + ADT.
Eclipse
El primer paso para desarrollar cualquier aplicación es obtener un entorno de de-
sarrollo integrado (IDE). Un IDE es un programa compuesto por un conjunto de
herramientas de programación y normalmente consiste en: un editor de código,
herramientas de compilación y un depurador. En el caso de aplicaciones Android,
el IDE recomendado es Eclipse, un entorno de programación multi-lenguaje con un
extensible sistema de plug-in. La última versión disponible al iniciar este proyecto, y
por tanto la versión instalada, es la Helios.
Android SDK
El SDK1 es un conjunto de herramientas de desarrollo que permite a un programador
crear aplicaciones para un sistema concreto, por ejemplo ciertos paquetes de software,
frameworks, plataformas de hardware, videoconsolas, sistemas operativos, etc. Es
algo tan sencillo como una interfaz de programación de aplicaciones (API) creada
para permitir el uso de cierto lenguaje de programación, o puede, también, incluir
hardware sofisticado para comunicarse con un determinado sistema embedido.
ADT
El plug-in ADT2 para Eclipse es una extensión del entorno de desarrollo que permite la
creación y depuración de aplicaciones Android. Gracias a este plugin se puede hacer
1
Kit de Desarrollo de Software
2
Android Development Tools
66
4.2. I NSTALACIÓN Y CONFIGURACIÓN DEL ENTORNO DE TRABAJO
Una vez instalado esto hay que crear una ADV 3 para poder testear las aplicaciones
que se van a programar. Esta máquina virtual emula el comportamiento de un
smartphone con las características que se le especifiquen. Sin embargo, debido a
la naturaleza de este proyecto, la mayoría de las pruebas se han realizado directa-
mente sobre dispositivos físicos (smartphones con sistema operativo Android 2.3,
Gingerbread).
Se instala una base de datos en el servidor que se utilizará para los sistemas de alerta
de los residentes: de posicionamiento y batería baja. Para crear la base de datos se
instala el paquete LAMP4 en el servidor. Con la idea de facilitar la tarea de creación
y gestión de la base de datos, se instala también el programa MySQL Navigator, que
permite manejar la base de datos mediante una interfaz gráfica.
El acceso desde las aplicaciones Android a esta base de datos se hace de la siguiente
manera: las aplicaciones hacen peticiones HTTP contra Apache, que ejecuta los
script PHP correspondientes, accediendo a la base de datos MySQL y devolviendo los
resultados obtenidos en formato JSON a las aplicaciones.
Como puede verse en la figura 4.1, la base de datos está formada por dos tablas:
MyAlerts y MyCoordinates.
* MyAlerts: Esta tabla se utiliza para controlar el estado de los residentes. Al dar
3
Android Virtual Machine
4
LAMP: Acrónimo referido a la primera letra de Linux (sistema operativo), Apache HTTP (servi-
dor), MySQL (software de base de datos) y PHP (software de scripting), componentes principales para
construir un web server.
67
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
El acceso a la base de datos MySQL se hace mediante scripts PHP. Estos scripts permiten
realizar consultas y/o modificar los atributos de la base de datos desde las aplicaciones
Android.
Softphone A: residentes
68
4.2. I NSTALACIÓN Y CONFIGURACIÓN DEL ENTORNO DE TRABAJO
update_alert_flag.php
Se utiliza desde el servicio de alertas de localización de la aplicación y afecta
únicamente a la tabla de alertas MyAlerts. Actualiza el valor del flag de alerta de
posicionamiento del usuario que lo ejecuta.
update_battery_flag.php
Se utiliza desde el broadcast receiver de alerta de batería de la aplicación y afecta
únicamente a la tabla de alertas MyAlerts. Actualiza el valor del flag de alerta por
batería baja del usuario que lo ejecuta.
insert_coordinates.php
Se utiliza desde el servicio de alertas de localización de la aplicación y afecta única-
mente a la tabla de coordenadas MyCoordinates. Inserta una coordenada GPS (latitud,
longitud) en la base de datos, indicando el número del usuario al que pertenece.
get_alert_coordinates.php
Se utiliza desde el mapa de localización de la aplicación y afecta a ambas tablas. Ob-
tiene un listado con todos los residentes que se encuentran en estado de alerta (fuera
de la zona permitida, con alert_flag=1) y la última coordenada GPS introducida por
cada uno de ellos.
get_user_coordinates.php
Se utiliza desde el mapa de localización de la aplicación y afecta a ambas tablas. Ob-
tiene la última coordenada introducida en la base de datos por el usuario especificado.
check_battery_alert.php
Se utiliza desde un servicio de la aplicación y afecta a la tabla de alertas MyAlerts.
Comprueba si hay alguna alerta de batería baja activada (battery_flag=1).
get_battery_alerts.php
Se utiliza desde el listado de alertas de batería de la aplicación y afecta a la tabla de
alertas MyAlerts. Obtiene un listado con todos los residentes que se encuentran en
estado de alerta por batería baja (número y nombre de usuario) ordenados por nombre.
69
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
Las aplicaciones de los residentes y la recepción se comunican entre ellas (de forma
interna) mediante llamadas perdidas a estas extensiones especiales, de forma invisible
a los usuarios. Para ello se lanzan o reciben llamadas procedentes de estas extensiones,
marcadas como de emergencia, que se deben procesar de forma diferente al resto, ya
que se utilizarán como disparador para que las aplicaciones ejecuten ciertas acciones.
La utilidad de éstas se explicará con más detalle para cada aplicación en los siguientes
apartados.
70
4.3. D ESARROLLO DE LAS APLICACIONES
mismo.
* Softphone A: destinado para el uso de los residentes del centro. Añade dos fun-
cionalidades: sistema de alerta en caso de batería baja y sistema de alerta en
caso de que el residente salga de una zona permitida (se aleje demasiado de la
residencia) utilizando el sensor GPS del dispositivo físico.
71
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
72
4.3. D ESARROLLO DE LAS APLICACIONES
FIGURA 4.3: a) Menú principal de la aplicación para los residentes. b) Diálogo que
aparece al cerrar las aplicaciones.
(entrante, saliente, perdida), fecha, hora y duración de la llamada, como se puede ver
en la figura 4.2(c). Al pulsar sobre una llamada del registro, se ofrece la posibilidad de
rellamar o devolver una llamada a ese número de forma directa (sin tener que marcar).
La lista de cuentas aparece en la figura 4.4(a) y muestra los datos de las cuentas
SIP (número y nombre) que el usuario puede utilizar para registrarse en el servidor
de VoIP. Los datos que se guardan para cada cuenta son: número y nombre de
usuario, dirección del servidor de VoIP y contraseña requerida por el servidor para
logarse. Desde esta pantalla pueden crearse cuentas nuevas, así como modificar o
73
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
FIGURA 4.4: a) Listado de cuentas con menú abierto. b) Menú context de una cuenta
(opciones de la cuenta).
eliminar los datos de las ya existentes. La aplicación está programada para logarse
automáticamente en el servidor con la última cuenta que se utilizó, por lo que si el
usuario desea cambiar de cliente SIP (cambiar la cuenta activa), debe hacerlo desde
esta pantalla, mediante el menú context de la figura 4.4(b).
74
4.3. D ESARROLLO DE LAS APLICACIONES
75
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
Para integrar esta API en las aplicaciones desarrolladas se crean tres clases que se
encargarán de lo siguiente:
* ServiceSIP: servicio que se encarga de casi todo lo relacionado con la API SIP.
* CallReceiverSIP: broadcast receiver que maneja las llamadas SIP entrantes.
* ServiceBinder: clase de ayuda que actúa como puente entre el servicio ServiceSIP
y el resto de clases de la aplicación.
76
4.3. D ESARROLLO DE LAS APLICACIONES
Al iniciar el servicio por primera vez, se crea un objeto de tipo SipManager, propio
de la API SIP de Android y se registra la cuenta de usuario (cliente SIP) que se va a
utilizar para logarse en el servidor SIP. A través de este objeto se podrán realizar las
siguientes acciones: iniciar sesiones SIP, realizar y recibir llamadas, registrar/desregis-
trar cuentas SIP en el servidor y verificar la conectividad de la sesión.
Al utilizar la API SIP, cada cuenta SIP está representada por un objeto de tipo
SipProfile. Por tanto, para registrar una cuenta, primero se crea el objeto SipProfile
con los datos de las variables de entrada.
SipProfile . Builder builder = new SipProfile . Builder ( username , domain ) ;
builder . setPassword ( password ) ;
me = builder . build () ;
77
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
FIGURA 4.6: a) Notificación que aparece cuando no hay ninguna cuenta activa. b)
Notificación permanente que aparece cuando hay una cuenta logada en el servidor SIP.
mediante el pending intent (pi), el broadcast receiver que se encargará de recibir las
llamadas entrantes.
manager . open ( me , pi , null ) ;
78
4.3. D ESARROLLO DE LAS APLICACIONES
Si ya no se desea utilizar más el perfil actual (se quiere cambiar de cuenta activa
79
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
80
4.3. D ESARROLLO DE LAS APLICACIONES
Para ejecutar este método se necesitan tres cosas: un SipProfile local registrado
(cuenta activa del softphone logada correctamente al servidor SIP), una dirección SIP
válida para recibir la llamada y un objeto de tipo SipManager.
81
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
82
4.3. D ESARROLLO DE LAS APLICACIONES
83
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
La aplicación está programada de manera que sólo se puede llevar a cabo una
conversación a la vez. Si se recibe una nueva llamada entrante cuando ya hay una en
curso, la nueva llamada se cuelga automáticamente (desviando al llamante al buzón
de voz correspondiente) y no se refleja en el registro de llamadas.
Con este fin se crea la clase de ayuda ServiceBinder, que actúa como clase
intermedia y se encarga de crear el enlace (bind) entre el servicio y la clase que lo
necesite. Por otra parte, algunas clases necesitan realizar ciertas acciones una vez
establecida la conexión con el servicio (por ejemplo, realizar una llamada). Estas
acciones se definen también en esta clase, evitando así que se intente acceder al
servicio antes de que se haya realizado el enlace.
* Por motivos de seguridad, se quiere evitar que los residentes se alejen demasiado
del centro. Para ello se crea un sistema de alertas que utiliza el sensor GPS del
terminal físico para determinar la ubicación del usuario y alertar a la residencia
si éste sale de una zona concreta.
* También se quiere evitar que los residentes se queden sin batería en el terminal,
dejando totalmente inutilizado el sistema de alertas anterior. Por ese motivo se
crea también un mecanismo para que los trabajadores de la residencia puedan
84
4.3. D ESARROLLO DE LAS APLICACIONES
Cada residente tiene una entrada en la tabla de alertas (MyAlerts) que se crea, de
forma automática, al asignarle una cuenta SIP en el listado de cuentas de la aplicación.
A partir de ese momento, se puede monitorizar al usuario del terminal. Cada cambio
que se realice sobre el listado de cuentas (añadir, editar o borrar una cuenta) queda
reflejado también en la base de datos remota. Por ese motivo, el acceso al listado
de cuentas de esta aplicación está protegido por contraseña, de forma que sólo los
trabajadores del centro pueden acceder a ella, como se puede ver en la figura 4.8. Así
se evita que los residentes puedan realizar cualquier modificación sobre las cuentas
SIP (como cambiar la cuenta con la que están logados o eliminarla). De esta forma, se
evita también que puedan modificar los datos relativos a la cuenta (nombre y número)
que constan en la base de datos remota y que sirven a los trabajadores del centro para
identificarlos.
85
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
El sistema Android genera dos eventos relacionados con el nivel de batería del
terminal: cuando la batería está baja (por debajo del 15%) y cuando la batería se
encuentra en proceso de carga (cargando y por encima del 20% de su capacidad). En
esta aplicación se capturan estos eventos y se actúa acorde a la situación, evitando así
que la aplicación tenga que monitorizar el nivel de batería del dispositivo de forma
continua, lo que resulta ineficiente.
Esta aplicación está diseñada para utilizar el sensor GPS del terminal físico donde está
instalada para controlar la ubicación de su usuario (en este caso, el residente) y evitar
así que éste salga de una zona marcada como segura o permitida. También se añade
la opción de monitorizar la ubicación de un residente en el interior de esta zona de
manera temporal, referido en este documento como seguimiento. Los pasos seguidos
para lograr esto se detallan a continuación.
86
4.3. D ESARROLLO DE LAS APLICACIONES
87
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
Este servicio se lanza al producirse una de estas dos situaciones: al generarse una
alerta de proximidad (entrada/salida del terminal del residente de la zona permitida);
al recibirse una llamada desde una de las extensiones de seguimiento de Asterisk
(034, inicio de seguimiento). Al iniciarse el servicio, se comprueba desde dónde se ha
ejecutado la llamada (cuál de estas situaciones ha ocurrido) y se actúa en consecuencia.
88
4.3. D ESARROLLO DE LAS APLICACIONES
El siguiente paso es definir la forma de actuar del sistema en función del tipo de
alerta (entrada/salida o seguimiento) y del estado anterior del servicio. Esto último
se tiene en cuenta a fin de corregir los errores derivados de la utilización de las
coordenadas GPS obtenidas del dispositivo, que pueden generar varias alertas del
mismo tipo seguidas, debiendo actuar sólo la primera vez e ignorando las siguientes.
89
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
isAlreadyOn = true ;
}
}
90
4.3. D ESARROLLO DE LAS APLICACIONES
SIP. Mientras tanto, se activa el flag de alerta de la base de datos remota y se envía
la primera coordenada. De esta forma, se asegura que siempre habrá una coordenada
introducida en la base de datos para ese residente, evitando problemas al obtener las
coordenadas desde el softphone de recepción (si se intentan obtener coordenadas antes
de que el listener haya podido insertarlas).
protected void iniciarProtocolo () {
/* * obtiene el numero de usuario que ha generado la alerta */
user = sb . getBinder () . whoAmI () ;
/* * realiza la llamada perdida a la extension de emergencia */
sb . getBinder () . initiateLostCall ( ConstA . sipEmergencyAddress ) ;
/* * si se ha producido una salida de la zona permitida , se activa
el flag de alerta del usuario en la DB remota y se envia la
ultima posicion conocida del usuario a la DB remota */
if (! isEntering ) {
dbR . updateFlag ( " alert " , user , true ) ;
sendFirstCoordinate () ;
}
/* * si se ha producido una entrada en la zona permitida , se
desactiva el flag de alerta del usuario en la DB remota y se
detiene el servicio */
else {
dbR . updateFlag ( " alert " , user , false ) ;
stopSelf () ;
}
}
91
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
92
4.3. D ESARROLLO DE LAS APLICACIONES
FIGURA 4.9: Menú principal del softphone para la recepción del centro.
Se añaden al menú principal dos opciones que permiten al usuario acceder a las
pantallas que le permitirán comprobar si hay alertas de posicionamiento o batería
activadas. Por tanto, el aspecto del menú de la pantalla principal de esta aplicación es
el mostrado en la figura 4.9.
Los terminales físicos de los residentes no deben quedarse nunca sin batería, ya que
esto inutilizaría el sistema de alertas de posicionamiento detallado en la aplicación
anterior. Para evitarlo, se diseña un mecanismo que permita a los trabajadores del
centro (en este caso, al personal de recepción) comprobar el estado de la batería de
los terminales de los residentes mediante consultas a los flags de alerta battery_flag de
la base de datos remota.
El sistema Android proporciona una herramienta que permite activar una especie
de alarma que se utiliza, en este caso, para comprobar de forma periódica si hay alertas
por batería baja en la base de datos remota. Esta alarma se activa mediante el siguiente
método, que se ejecuta al iniciarse la aplicación:
/* * Activa una alarma cada 30 minutos que comprueba si hay alertas de
bateria baja en la DB remota */
93
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
Como interesa que la recepción del centro sepa en todo momento si los terminales
de los residentes se quedan sin batería, este servicio se ejecuta periódicamente aunque
la aplicación no esté abierta. Por ello, antes de acceder a la base de datos remota, se
comprueba si el terminal está conectado a la red tanto por WiFi como por conexión de
datos.
Al pulsar sobre la notificación que indica que hay alertas de batería se accede a
94
4.3. D ESARROLLO DE LAS APLICACIONES
un listado con los nombres y números de usuario de los residentes cuyos terminales
tienen un nivel de batería por debajo del 15% de su capacidad. Este listado, que se
muestra en la figura 4.10(b), no se actualiza de forma automática, por lo que si se
deja visible esta pantalla por tiempo indefinido, la información mostrada puede ser
falsa. Por ello se incluye, en la parte superior de la pantalla, una línea de texto donde
se indica la fecha y hora de la última actualización. La actualización de los datos se
puede realizar de dos maneras: mediante la opción Actualizar listado disponible en el
menú de esta pantalla o pulsando de nuevo sobre la notificación de alerta de batería
(en caso de estar presente en la barra de estado).
A este listado también se puede acceder mediante la opción Alertas Batería del
menú principal de la aplicación. Si al acceder o actualizar el listado no hay ninguna
alerta activa, se muestra un diálogo informando de ello al usuario.
95
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
de localización). Esta llamada hace que Asterisk ponga en contacto, mediante una
llamada SIP, a estas dos partes: el residente que ha generado la alerta y la recepción
del centro (es decir, el usuario de esta aplicación). Al finalizarse la llamada, se muestra
un plano de la zona (alrededor de la residencia) con la ubicación de los residentes
que se encuentran fuera de la zona permitida. De esta forma, la recepción del centro
puede saber la localización del residente con el que acaba de hablar.
Igual que en la aplicación diseñada para los residentes, se han realizado algunas
modificaciones respecto al softphone básico para adaptarlo a las necesidades de esta
aplicación. En este caso, se destacan los cambios realizados en el broadcast receiver
CallReceiverSIP y en el servicio ServiceSIP.
96
4.3. D ESARROLLO DE LAS APLICACIONES
97
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
Para poder utilizar mapas en una aplicación de Android, se debe obtener una
clave (Google Maps API key) que permita integrar Google Maps en la aplicación. Esta
clave se puede conseguir en la página http://code.google.com/android/add-ons/
google-apis/mapkey.html de forma gratuita. Una vez obtenida, debe añadirse en la
definición del layout de la actividad que utiliza el mapa, concretamente como uno de
los parámetros del objeto MapView:
98
4.3. D ESARROLLO DE LAS APLICACIONES
El acceso a este mapa se puede realizar de dos formas distintas: al colgar una
llamada entrante de emergencia, de forma automática; o a través de la opción Mapa
Alertas del menú principal de la aplicación.
Al lanzar la actividad, antes de poder mostrar el mapa, hay que configurar algunos
aspectos del mismo, así como de los componentes que aparecerán en él (marcadores).
Esta definición se puede ver en el código siguiente:
private void defineMapSettings () {
/* * define el marcador para los usuarios en estado de alerta
( rojos ) */
marker = this . getResources () . getDrawable ( R . drawable . marker ) ;
marker . setBounds (0 , 0 , marker . getIntrinsicWidth () ,
marker . getIntrinsicHeight () ) ;
/* * define el marcador para el usuario en seguimiento ( verde ) */
gmarker = this . getResources () . getDrawable ( R . drawable . marker_green ) ;
gmarker . setBounds (0 , 0 , gmarker . getIntrinsicWidth () ,
gmarker . getIntrinsicHeight () ) ;
/* * crea una referencia al objeto mapa y lo configura en modo
vista de satelite */
mapView = ( MapView ) findViewById ( R . id . mapView ) ;
mapView . setSatellite ( true ) ;
/* * objeto MapController que permite trabajar con el mapa */
mc = mapView . getController () ;
/* * configura el nivel de zoom del mapa */
mc . setZoom (17) ;
/* * elimina todos los posts pendientes que pueda haber en cola */
mHandler . removeCallbacks ( mUpdateTimeTask ) ;
/* * programa el objeto de tipo Runnable ( mUpdateTimeTask ) para que
se ejecute su metodo run () al cabo de 100 ms */
mHandler . postDelayed ( mUpdateTimeTask , 100) ;
}
Primero se definen los marcadores que aparecerán sobre el mapa (rojos y verdes). A
continuación se crea una referencia al mapa mapView y se especifican algunos paráme-
tros de su configuración inicial: aspecto tipo satélite y nivel de zoom (17). Por último,
utilizando un objeto de tipo Handler, se inicia el proceso de marcar sobre el mapa la
posición de los residentes que se encuentren en estado de alerta. Los objetos Handler
99
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
permiten, entre otras cosas, programar la ejecución de un objeto Runnable cada cierto
tiempo. En este caso, se utiliza el objeto mUpdateTimeTask, cuyo código se muestra a
continuación, y que refresca la información mostrada en el mapa cada 30 segundos.
private Runnable mUpdateTimeTask = new Runnable () {
public void run () {
/* * actualiza la posicion de los marcadores y refresca el
mapa */
updateMarkersPosition () ;
long startTime = SystemClock . uptimeMillis () ;
/* * programa este objeto para que ejecute su metodo run () al
cabo de 30 s */
mHandler . postAtTime ( this , startTime + 30000) ;
}
};
100
4.3. D ESARROLLO DE LAS APLICACIONES
101
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
Para poder dibujar elementos encima del mapa (como los marcadores) se debe uti-
lizar un objeto de tipo Overlay. Para esta aplicación, se ha creado una clase propia
(MapOverlay) que extiende a una clase de tipo lista de Overlays, modificando su com-
portamiento. Se crean dos constructores distintos (uno para cada tipo de marcador)
que, a partir de la información obtenida de la base de datos, crearán los objetos de
tipo Overlay que se dibujarán encima del mapa. También se incluyen varios métodos
que permiten, entre otras cosas, dibujar los marcadores (draw) y especificar el compor-
tamiento de éstos al pulsar sobre ellos (onTap).
private class MapOverlay extends ItemizedOverlay < OverlayItem > {
/* * lista donde se guardan todos los objetos OverlayItem
( marcadores ) que se dibujaran sobre el mapa */
private List < OverlayItem > items = new ArrayList < OverlayItem >() ;
private Drawable marker = null ;
102
4.3. D ESARROLLO DE LAS APLICACIONES
103
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
FIGURA 4.13: a) Menú del mapa de alertas. b) Diálogo para iniciar un seguimiento.
104
4.3. D ESARROLLO DE LAS APLICACIONES
Por último, como en el caso anterior, se fuerza una actualización del mapa.
private void stopSeguimiento () {
if ( conSeguimiento ) {
conSeguimiento = false ;
/* * realiza una llamada a la extension de fin de seguimiento */
sb . getBinder () . initiateFollowUpCall ( usuario , " 035 " ) ;
/* * actualiza la posicion de los marcadores en el mapa */
updateMarkersPosition () ;
}
}
105
CAPÍTULO 4. I MPLEMENTACIÓN DE LOS S OFTPHONES
106
5
Conclusiones y líneas de futuro
Hay que recalcar que, aunque este proyecto está enfocado como un caso real
(implementación de una plataforma VoIP en una residencia de ancianos), no está
realmente desarrollado para su utilización inmediata, sería más bien como una prueba
piloto.
Se ha realizado todo el trabajo posible con los recursos disponibles (que a veces
resultaron limitadores) tanto a la hora de desarrollar el proyecto como de realizar las
pruebas correspondientes. A continuación se comentan los principales problemas y
factores que habría que mejorar en revisiones futuras:
* Para este proyecto se buscó una forma de integrar la VoIP en una aplicación
Android, utilizando el protocolo SIP, que es el más extendido entre los usuarios
de VoIP. Al final se decidió utilizar la API SIP nativa que proporciona el propio
Android. De todas formas, esta API está muy limitada y, aunque fue suficiente
para la realización de este proyecto, se ha descubierto que no es la más apro-
piada para ello.
Aunque la API SIP va incluida en todas las versiones de Android a partir de la 2.3,
se ha descubierto que algunas marcas de smartphones tienen capada esta API
para congraciarse con las operadoras de telefonía móvil. En este caso, se tuvieron
que rootear los dos terminales de pruebas para poder desbloquear su utilización.
Además, esta API no soporta la utilización conjunta con servidores STUN, con lo
que no se han podido solucionar los problemas de NAT (inherentes a SIP) que
ya se comentaron en el capítulo 2. También se descubrió que, aunque no se
especificaba de ninguna manera en la documentación de la API, su utilización
107
CAPÍTULO 5. C ONCLUSIONES Y LÍNEAS DE FUTURO
con conexión de datos no es automática: hay que modificar archivos internos del
smartphone a los que, en principio, un usuario normal no debería tener acceso.
Por estos motivos, si se deseara utilizar los softphones desarrollados en un entorno
práctico, habría que buscar otra API SIP externa e integrarla en las aplicaciones.
* El softphone de recepción consulta la base de datos cada cierto tiempo para ver
si hay alertas de batería activadas, método que resulta ineficiente. La decisión de
controlar el nivel de batería de los dispositivos de los residentes se tomó una vez
finalizada la programación de las aplicaciones, por lo que se buscó una solución
rápida que permitiera obtener los resultados requeridos, pero sin tener que estu-
diar opciones fuera del conocimiento que se tenía en aquel momento. Se debería
buscar una alternativa para evitar que la aplicación realice accesos y comproba-
ciones innecesarias a la base de datos, mejorando así la autonomía del dispositivo.
* Añadir securización en Asterisk utilizando el protocolo de seguridad SRTP
(Secure Real-time Transport Protocol). Debido a la evolución que sufrió el
proyecto, esta funcionalidad quedó en un segundo plano y queda entonces para
revisiones futuras.
* Durante el desarrollo de la centralita de telefonía aparecieron dos problemas para
los cuales, a la fecha de entrega, no se ha encontrado solución. El tratamiento de
estas cuestiones queda, por tanto, pendiente para resolver en futuras revisiones.
1. Detección de colgado: Asterisk no es capaz de detectar cuando una llamada
entrante a la PBX cuelga. Si la finalización de la llamada proviene del ex-
terior, Asterisk no lo detecta y sigue haciendo la rutina marcada hasta que
llega a un Hangup() (Asterisk cuelga y libera la línea). Si no se llega a un
Hangup(), la línea queda bloqueada y para desbloquearla hay que reiniciar
el servicio Asterisk. Se proporciona una solución provisional al problema
haciendo que se libere la línea en casos de bloqueo mediante timeouts.
2. Identificador de llamada: Asterisk no obtiene el CallerID de las llamadas que
llegan a la PBX. Esto puede ser debido a varios motivos, entre los que se
destacan: que la red Ibercom no ofrece este servicio; o existe algún elemento
intermedio que elimina el CallerID. Por este motivo, no se ha utilizado esta
funcionalidad en la PBX.
* El entorno de pruebas de este proyecto sería un aspecto a mejorar. Las aplica-
ciones deben estar conectadas a la red en todo momento. Esto supone un pro-
blema ya que el campus universitario no dispone de una red wifi uniforme en
toda su extensión (hay zonas sin cobertura fuera de los edificios). Lo ideal hu-
biera sido disponer de smartphones con conexión de datos para poder realizar
algunas de las pruebas, pero diversos factores (como la elección de la API SIP) no
lo permitieron.
108
5.1. VALORACIÓN PERSONAL
NIVEL PERSONAL , debo decir que he aprendido mucho con este proyecto, ya que
A todas las tecnologías que se han tratado en él (Android, Asterisk, bases de datos
MySQL, etc.) eran totalmente nuevas para mi.
La mayor parte del trabajo que se ve en este proyecto es fruto del auto aprendizaje,
ya sea mediante la consulta y lectura de libros, como la lectura de infinitas páginas
web, foros de grupos y comunidades especializadas en cada una de dichas tecnologías.
Esto es algo que valoro mucho, ya que es una situación habitual en el mundo laboral.
En conclusión, considero que este proyecto ha resultado ser una experiencia muy
positiva (aunque algo dura) de cara a mi futuro laboral y me ha permitido aprender y
aplicar nuevas tecnologías que me pueden resultar muy útiles para esta nueva etapa de
mi vida.
109
CAPÍTULO 5. C ONCLUSIONES Y LÍNEAS DE FUTURO
110
6
Bibliografía
Publicaciones:
* Madsen, Leif; Van Meggelen, Jim; Bryant, Russell. Asterisk: The Definitive Guide
(3rd Edition). O’Reilly, 2011.
Enlaces de interés:
* www.voip-info.org
Guía de referencia para todo lo relacionado con VoIP.
Wiki con documentación sobre Asterisk: consultada para la configuración de los
módulos de Asterisk y las funciones y aplicaciones utilizadas en el dialplan.
* www.asterisk.org
Página oficial de Asterisk. Contiene documentación de Asterisk y Dahdi.
111
CAPÍTULO 6. B IBLIOGRAFÍA
* http://stackoverflow.com
Foro para programadores tanto profesionales como amateurs.
Utilizado para resolver problemas relacionados con la programación de las apli-
caciones Android.
* http://developer.android.com/index.html
Página web oficial para desarrolladores de aplicaciones Android. Contiene
documentación, guías de referencia, ejemplos de código, etc.
112
Instalaciones y configuraciones relacionadas con
A
Asterisk
A.1.1 P RERREQUISITOS
Antes de empezar, hay que verificar que se tienen instaladas en el servidor todas las
dependencias que los paquetes básicos necesitan. Para no tener que hacerlo manual-
mente (uno a uno), el paquete Asterisk contiene un script que se encarga de instalar
todas las dependencias y prerrequisitos necesarios. Para ejecutar el script, escribimos
las siguientes líneas en un terminal:
> cd / usr / src / asterisk -10.0.0/ contrib / scripts /
> ./ install_prereq install
A.1.2 DAHDI
Para poder integrar el cancelador de eco Oslec con DAHDI se deben hacer algunos
cambios en este paquete. Es por eso que, una vez instalado, deberá recompilarse.
113
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
A.1.4 A STERISK
Primero se instala la compatibilidad mp3 para que Asterisk pueda manejar archivos
con este formato. Como en el caso de los prerrequisitos, el paquete Asterisk incluye un
script con este fin. Para ejecutarlo, se escriben las siguientes líneas en un terminal:
> cd / usr / src / asterisk -10.0.0
> ./ contrib / scripts / get_mp3_source . sh
> ./ contrib / scripts / get_mp3_source . sh install
Con el último comando aparece un menú con interfaz gráfica que permite especi-
ficar los módulos de Asterisk que se quieren incluir en la instalación. Los módulos de
la instalación por defecto ya aparecen marcados. Además de estos, se seleccionan unas
aplicaciones del dialplan que estaban incluidas por defecto en versiones anteriores y los
paquetes de sonidos (en inglés y castellano) y de música en espera en varios formatos.
Applications
[*] app_meetme
[*] app_readfile
[*] app_setcallerid
114
A.1. I NSTALACIONES RELACIONADAS CON A STERISK
Por último, se ejecuta el siguiente comando, que comprime los archivos tipo log que
genera Asterisk, ahorrando espacio en disco:
> make install - logrotate
115
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
A continuación, se crean dentro del paquete DAHDI los directorios donde se deberán
ubicar los archivos obtenidos del kernel y se copian los archivos relativos a Oslec en
estos directorios.
> mkdir dahdi - linux - complete -2.5.0.2+2.5.0.2/ linux / drivers / staging
> mkdir
dahdi - linux - complete -2.5.0.2+2.5.0.2/ linux / drivers / staging / echo
> cp linux -2.6.32/ drivers / staging / echo /*
dahdi - linux - complete -2.5.0.2+2.5.0.2/ linux / drivers / staging / echo /
Para utilizar Oslec, hay que descomentar y modificar las dos líneas relativas al can-
celador en el archivo Kbuild del paquete DAHDI.
> vi dahdi - linux - complete -2.5.0.2+2.5.0.2/ linux / drivers / dahdi / Kbuild
Para aplicar los cambios, se vuelve a compilar e instalar el paquete DAHDI como
se especifica en el apartado anterior. Verificamos que se han ejecutado los cambios
mirando el resultado de la compilación. Si aparecen las siguientes líneas, Oslec está
instalado e integrado con DAHDI y sólo hay que configurarlo.
CC [ M ]
/ usr / src / dahdi - linux - complete -2.5.0.2+2.5.0.2/ linux / drivers / dahdi /
dahdi_echocan_oslec . o
CC [ M ]
/ usr / src / dahdi - linux - complete -2.5.0.2+2.5.0.2/ linux / drivers / dahdi /
../ staging / echo / echo . o
Los paquetes necesarios para instalar las librerías Pocketsphinx (librería de re-
conocimiento) y Sphinxbase (librería de soporte) se pueden descargar desde la página
116
A.2. A RCHIVOS DE CONFIGURACIÓN A STERISK
Para asegurar que el sistema es capaz de cargar las librerías correctamente, se con-
figura el path para que sepa dónde buscar las librerías compartidas.
> export LD_LIBRARY_PATH =/ usr / local / lib
> export PKG_CONFIG_PATH =/ usr / local / lib / pkgconfig
117
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
transfer = yes
canpark = yes
callreturn = yes
cancallforward = yes
echocancel = yes
echocancelwhenbridged = yes
echotraining = no
rxgain = 10.0
txgain = 5.0
cid_rxgain = 8.0
hanguponpolarityswitch = yes
tonezone =6
ringtimeout =8000
immediate = yes
busydetect = yes
busycount =6
usedistinctiveringdetection = yes
; FXO Modules
group =1
callgroup =1
pickupgroup =1
signalling = fxs_ks
callerid = asreceived
context = from - pstn
channel = > 1 -8
A.2.2 U SUARIOS
[200]
type = friend
secret =12345
host = dynamic
qualify = yes
canreinvite = no
context = PermisosResidentes
disallow = all
allow = ulaw
allow = alaw
[201](200)
[202](200)
; trabajadores residencia
118
A.2. A RCHIVOS DE CONFIGURACIÓN A STERISK
[501] ; recepcion
type = friend
secret =12345
host = dynamic
qualify = yes
canreinvite = no
context = PermisosTrabajadores
disallow = all
allow = ulaw
allow = alaw
[502](501) ; trabajadora social
[503](501) ; gerocultora 1
[504](501) ; gerocultora 2
[505](501) ; gerocultora 3
[506](501) ; despacho directora
[507](501) ; movil directora
[508](501) ; casa directora
[509](501) ; psicologa
[500](501) ; jefa enfermeras
A.2.3 D IALPLAN
[ PermisosResidentes ]
include = > usuarios
include = > Buzon_de_voz
include = > android_VA
[ PermisosTrabajadores ]
include = > usuarios
include = > Buzon_de_voz
include = > grabadora
include = > android_VA
119
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
; pruebas centralita
exten = > 00 ,1 , Goto ( from - pstn ,s ,1)
[ android_VA ]
120
A.2. A RCHIVOS DE CONFIGURACIÓN A STERISK
[ macro - UnaExten ]
; si no te cogen el telefono salta al buzon de voz
; comprueba primero si el numero esta en la blacklist
; comprueba si hay desvio de llamadas
; con parking de llamadas ( t / T en Dial para poder transferir )
; con grabacion de la llamada si es para 200 ( monitorizacion ) ( pruebas )
exten = > s ,1 , Answer ()
exten = > s ,2 , Set ( exten = $ { DB ( CFIM / $ { MACRO_EXTEN }) })
exten = > s ,3 , GotoIf ( $ [ " $ { exten } " = " " ]?4:5)
exten = > s ,4 , Set ( exten = $ { MACRO_EXTEN })
exten = > s ,5 , GotoIf ( $ { BLACKLIST () }? bl )
exten = > s ,6 , GotoIf ( $ [ $ { exten }=200]?:9)
exten = > s ,7 , Set ( CALLFILENAME = $ { MACRO_EXTEN } a $ { CALLERID ( num ) } -
$ { STRFTIME ( $ { EPOCH } , GMT -2 ,% e % b % R ) })
exten = > s ,8 , Monitor ( wav , $ { CALLFILENAME } , m )
exten = > s ,9 , Dial ( SIP / $ { exten } ,30 , t / T )
exten = > s ,n , NoOp ( $ { DIALSTATUS })
exten = > s ,n , PlayBack ( vm - nobodyavail )
exten = > s ,n , VoiceMail ( $ { exten })
exten = > s ,n , Hangup ()
exten = > s , n ( bl ) , PlayBack ( tt - somethingwrong )
exten = > s ,n , Hangup ()
[ Buzon_de_voz ]
; Consulta el buzon de voz
exten = > 99 ,1 , VoiceMailMain ()
[ grabadora ]
; para grabar las locuciones de voz de la centralita
exten = > 111 ,1 , PlayBack ( beep )
; same = > n , Record ( custom / asr_oficina_cerrada . wav )
; same = > n , Record ( custom / asr_bienvenida . wav )
; same = > n , Record ( custom / asr_extension_voz . wav )
; same = > n , Record ( custom / asr_menu . wav )
; same = > n , Record ( custom / asr_extension . wav )
; same = > n , Record ( custom / asr_max_intentos . wav )
; same = > n , Record ( custom / asr_recepcion . wav )
; same = > n , Record ( custom / asr_trabajador_social . wav )
; same = > n , Record ( custom / asr_enfermeria . wav )
; same = > n , Record ( custom / asr_no_disponible . wav )
; same = > n , Record ( custom / asr_cola . wav )
; same = > n , Record ( custom / asr_max_t_cola . wav )
; same = > n , Record ( custom / asr_directora . wav )
; same = > n , Record ( custom / asr_psicologa . wav )
; same = > n , Record ( custom / asr_desvio . wav )
; same = > n , Record ( custom / asr_exterior . wav )
; same = > n , Record ( custom / asr_despedida . wav )
121
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
[ PC_a_RTC ]
; llama desde PC a un telf exterior
exten = > _00 . ,1 , Dial ( DAHDI / g1 / $ { EXTEN :2} ,10)
exten = > _00 . ,n , Hangup ()
[ from - pstn ]
; ---- ---- ---- --- ---- ---- ---- --- ---- ---- ---- ---- --- ---- ---- ---- --- ----
; CENTRALITA DAHDI ( con ASR en ingles )
; ---- ---- ---- --- ---- ---- ---- --- ---- ---- ---- ---- --- ---- ---- ---- --- ----
122
A.2. A RCHIVOS DE CONFIGURACIÓN A STERISK
[ centralita_ASR ]
exten = > s ,1 , Answer ()
same = > 2 , Background ( custom / asr_bienvenida )
same = > 3 , Set ( k =1)
same = > 4 , While ( $ [ $ { k } <3])
same = > n , Background ( custom / asr_extension_voz )
same = > n , Background ( custom / asr_menu )
same = > n , Record ( custom / recon / voz . wav , ,5)
same = > n , System (/ var / lib / asterisk / sounds / custom / recon / asr2 . sh )
same = >
n , Set ( num = $ { FILE (/ var / lib / asterisk / sounds / custom / recon / num . txt ,0 ,1) })
same = > n , NoOp ( num = $ { num })
same = > n , GotoIf ( $ [ " $ { num } " = " " ]? null )
same = > n , GotoIf ( $ [ $ { num } <0 | $ { num } >6]?: ok )
same = > n , Set ( num = i )
same = > n ( ok ) , Goto ( $ { num } ,1)
same = > n ( null ) , Set ( k = $ [ $ { k }+1])
same = > n , EndWhile
same = > n , Background ( custom / asr_extension & beep )
same = > n , WaitExten (15 , m ( radio ) )
same = > n ( max ) , PlayBack ( custom / asr_max_intentos )
same = > n , Goto (0 ,1)
; extension Recepcion
exten = > 0 ,1 , PlayBack ( custom / asr_recepcion )
same = > n , Dial ( SIP /501 ,15 , m ( radio ) t )
same = > n , Goto ( # ,1)
; extension Enfermeria
exten = > 2 ,1 , PlayBack ( custom / asr_enfermeria )
same = > n , Dial ( SIP /500 ,10 , m ( radio ) )
same = > n , GotoIf ( $ [ $ { DIALSTATUS }= BUSY ]? busy )
same = > n , PlayBack ( custom / asr_no_disponible )
same = > n , Goto ( # ,1)
123
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
; extension Directora
exten = > 3 ,1 , PlayBack ( custom / asr_directora )
same = > 2 , Dial ( SIP /506 ,10 , m ( radio ) )
same = > 3 , GotoIf ( $ [ $ { DIALSTATUS }= NOANSWER ]?:5)
same = > 4 , FollowMe ( directora , san )
same = > 5 , Voicemail (506)
same = > 6 , Goto ( # ,1)
; extension Psicologa
; de momento 509 esta redirigido a 501
exten = > 4 ,1 , PlayBack ( custom / asr_psicologa )
same = > 2 , Set ( num = $ { DB ( CFIM /509) })
same = > 3 , GotoIf ( $ [ " $ { num } " = " " ]?:6)
same = > 4 , Set ( num =509)
same = > 5 , Goto (7)
same = > 6 , PlayBack ( custom / asr_desvio )
same = > 7 , Dial ( SIP / $ { num } ,10 , m ( radio ) )
same = > n , PlayBack ( custom / asr_no_disponible )
same = > n , Goto ( # ,1)
[ menu - privado ]
124
A.2. A RCHIVOS DE CONFIGURACIÓN A STERISK
[ radio ]
mode = custom
application =/ var / lib / asterisk / mohlau2 / music . sh
; You can override the default program to send e - mail if you wish , too
mailcmd =/ usr / sbin / sendmail -t
125
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
[ default ]
; buzones de voz para los residentes
200 = > 123 , residente1 , chiara2026@gmail . com
201 = > 456 , residente2 , chiara2016@gmail . com
202 = > 789 , residente3 , chiara2026@gmail . com
# The place where the mail goes . The actual machine name is required
no
# MX records are consulted . Commonly mailhosts are named
mail . domain . com
mailhub = smtp . gmail . com :587
AuthMethod = LOGIN
UseTLS = YES
UseSTARTTLS = YES
AuthUser = securebiometricvoting@gmail . com
AuthPass = isgsbv2011
126
A.2. A RCHIVOS DE CONFIGURACIÓN A STERISK
A.2.6 F OLLOW M E
A.2.8 C OLAS
[ cola_enfermeria ]
strategy = ringall
timeout = 10
retry = 5
periodic - announce = queue - thankyou
periodic - announce - frequency = 8
musicclass = radio
127
CAPÍTULO A. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON A STERISK
[ general ]
parkext = > 700 ; What extension to dial to park
parkpos = > 701 -720 ; What extensions to park calls on .
( defafult parking lot )
; These needs to be numeric , as
Asterisk starts from the start
position
; and increments with one for the next
parked call .
context = > parkedcalls ; Which context parked calls are in
( default parking lot )
128
Instalaciones y configuraciones relacionadas con
B
las aplicaciones Android
El Android SDK utiliza el kit de desarrollo de Java (Java JDK), por lo tanto, es
lo primero que hay que instalar en el servidor. El paquete JDK1 es necesario para
desarrollar aplicaciones y applets en Java (lenguaje que utiliza Android). También
lleva incluido el JRE2 , que sirve para lanzar aplicaciones y applets en Java. Se
descarga el paquete de la página web oficial: http://www.oracle.com/technetwork/
java/javase/downloads/jdk-6u26-download-400750.html, se ubica en el directorio
/usr/src y se instala escribiendo lo siguiente en un terminal:
Eclipse
129
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
- vm
/ usr / src / jdk1 .6.0 _26 / bin / java
Android SDK
Antes de instalar nada, hay que declarar en el archivo .bashrc los paths de: android,
java y eclipse, para que el sistema los encuentre. Se incluyen las siguientes líneas al final
del archivo:
export PATH = $ { PATH }:/ home / ldd / Desarrollo / android - sdk - linux_x86 / tools
export PATH = $ { PATH }:/ usr / src / jdk1 .6.0 _26 / bin
export PATH = $ { PATH }:/ home / ldd / Desarrollo / eclipse
A continuación se cierran todos los terminales abiertos, para que haga efecto el path
que se acaba de definir, se abre uno nuevo y se escribe la instrucción:
android
130
B.1. I NSTALACIÓN ENTORNO DE DESARROLLO PARA A NDROID
FIGURA B.2: Pantalla del Android Manager con todos los paquetes disponibles para
instalar.
Al hacer esto, se abre una nueva ventana, como se puede ver en la figura B.3,
para aceptar las licencias de los paquetes que se van a instalar. Se seleccionan todas
131
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
ADT
El plugin de Android ADT se instala desde el mismo Eclipse siguiendo los pasos
especificados a continuación. Primero se abre Eclipse, y desde la pestaña Help
del menú, se escoge la opción Install New Software y se pulsa el botón Add. En
la ventana que aparece, hay que especificar el nombre del software que se quiere
instalar (Android Plugin) y la dirección de descarga, como se puede ver en la figura B.4.
132
B.1. I NSTALACIÓN ENTORNO DE DESARROLLO PARA A NDROID
Development, como puede verse en la figura B.5. Se selecciona todo y se pulsa el botón
Next para que se comprueben las dependencias necesarias. En la pantalla siguiente
(figura B.6) se aceptan los términos de la licencia y se pulsa Finish.
.
FIGURA B.5: Pantalla con los paquetes necesarios para instalar el plugin ADT.
133
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
FIGURA B.6: Pantalla para aceptar las licencias de los paquetes del plugin ADT.
El último paso consiste en indicar a Eclipse la ubicación del Android SDK. Para
ello seleccionamos la siguiente opción del menú W indow > P ref erences > Android y
donde pone SDK Location pulsamos el botón Browse y especificamos la carpeta donde
está instalado el SDK de Android, que en este caso es:
Se pulsa el botón Apply para que se cargue el Android SDK Content Loader. Una
vez finalizado este proceso, aparece la pantalla de la figura B.7 en la que se ve un
listado con todo lo que se ha instalado. Con esto se consigue importar el Android SDK
a Eclipse para disponer de las ayudas necesarias al escribir el código.
134
B.2. B ASE DE DATOS REMOTA
FIGURA B.7: Pantalla de Eclipse con las opciones del Android SDK instaladas.
Para instalar el paquete LAMP (Linux, Apache, MySQL, PHP) en el servidor, se escribe
la siguiente línea en un terminal:
> tasksel install lamp - server
Con todos los paquetes necesarios instalados, ya se puede crear la base de datos.
Para ello, se abre el cliente MySQL Navigator que se acaba de instalar. El primer paso
135
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
136
B.2. B ASE DE DATOS REMOTA
Por último, hay que crear las tablas que tendrá la base de datos. Como ya se ha
comentado anteriormente, la base de datos del proyecto tiene dos tablas: MyAlerts y
MyCoordinates. Para crear una tabla, se clica con el botón derecho encima del nombre
de la base de datos (ALCATRAZ) y se escoge la opción Execute Query. Al crear las
tablas, hay que definir su nombre, así como el nombre y tipo de todos sus atributos.
En la figura B.10 se ve la query utilizada para crear la tabla de alertas MyAlerts. De
la misma manera, en la figura B.11 se ve la query utilizada para crear la tabla de
coordenadas MyCoordinates. Al ejecutar estas dos querys, se crean las dos tablas y se
añaden a la base de datos ALCATRAZ tal y como se ve en la figura B.12. Con esto, ya
se tiene la base de datos preparada para su utilización desde las aplicaciones Android.
137
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
138
B.2. B ASE DE DATOS REMOTA
139
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
FIGURA B.12: Base de datos Alcatraz con sus dos tablas: MyAlerts y MyCoordinates.
El último paso necesario es la creación de los scripts PHP que se utilizan para
gestionar la base de datos.
Los scripts PHP que se utilizan para gestionar la base de datos ALCATRAZ deben ubi-
carse en el directorio de Apache, en este caso, /var/www/. Se añaden tantos scripts
como operaciones se quieran realizar, utilizando los siguientes comandos en un termi-
nal:
140
B.2. B ASE DE DATOS REMOTA
A continuación se presenta el código de todos los scripts PHP que se han utilizado
en este proyecto, diferenciando los utilizados por cada una de las aplicaciones. Para
realizar pruebas, estos scripts se pueden ejecutar directamente desde un navegador
escribiendo la instrucción con la siguiente nomenclatura en la barra de direcciones:
http :// localhost / nombre_script . php ? arg1 = value1 & arg2 = value2 & arg3 = value3 ...
• insert_alert_user.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " INSERT INTO MyAlerts ( user , name )
VALUES ( ' " . $_REQUEST [ ' user ' ]. " ',
'" . $_REQUEST [ ' name ' ]. " ') " ) ;
• get_alert_user.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " SELECT id FROM MyAlerts WHERE
name = ' " . $_REQUEST [ ' name ' ]. " ' AND
141
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
• update_alert_user.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " UPDATE MyAlerts SET
user = ' " . $_REQUEST [ ' user ' ]. " ',
name = ' " . $_REQUEST [ ' name ' ]. " ' WHERE
id = " . $_REQUEST [ ' id ' ]. " " ) ;
• delete_alert_user.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
142
B.2. B ASE DE DATOS REMOTA
• update_alert_flag.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " UPDATE MyAlerts SET
alert_flag = " . $_REQUEST [ ' flag ' ]. " WHERE
user = ' " . $_REQUEST [ ' user ' ]. " '" ) ;
• update_battery_flag.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " UPDATE MyAlerts SET
battery_flag = " . $_REQUEST [ ' flag ' ]. " WHERE
user = ' " . $_REQUEST [ ' user ' ]. " '" ) ;
143
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
• insert_coordinates.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " INSERT INTO MyCoordinates ( user ,
latitude , longitude ) VALUES
( ' " . $_REQUEST [ ' user ' ]. " ', " . $_REQUEST [ ' latitude ' ]. " ,
" . $_REQUEST [ ' longitude ' ]. " ) " ) ;
• get_alert_coordinates.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " SELECT
MyCoordinates . user , MyAlerts . name , MyCoordinates . latitude ,
144
B.2. B ASE DE DATOS REMOTA
• get_user_coordinates.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " SELECT
MyAlerts . user , MyAlerts . name , MyCoordinates . latitude ,
MyCoordinates . longitude FROM MyAlerts , MyCoordinates
WHERE MyCoordinates . user = ' " . $_REQUEST [ ' user ' ]. " '
AND MyCoordinates . id =( SELECT MAX ( id ) FROM
MyCoordinates WHERE user = MyAlerts . user ) " ) ;
• check_battery_alert.php
145
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " SELECT COUNT (*) AS num FROM
MyAlerts WHERE battery_flag =1 " ) ;
• get_battery_alerts.php
<? php
mysql_connect ( " localhost " ," root " ," t1lq1si " ) ;
try {
$result = mysql_query ( " SELECT user , name FROM MyAlerts
WHERE battery_flag =1 ORDER BY name " ) ;
mysql_close () ;
}
catch ( Exception $e ) {
print ( json_encode ( $e ) ) ;
mysql_close () ;
}
?>
146
B.3. E XTENSIONES DE EMERGENCIA A STERISK
147
CAPÍTULO B. I NSTALACIONES Y CONFIGURACIONES RELACIONADAS CON LAS
APLICACIONES A NDROID
148