• No se han encontrado resultados

Tecnología y arquitectura de la aplicación

Para el desarrollo de la aplicación se utilizaron un conjunto de tecnologías y se eligió una arquitectura 3-Tier. A continuación se explicará cómo han sido utilizadas cada una de las tecnologías en la instanciación de la arquitectura.

Arquitectura

La arquitectura elegida para la aplicación es 3-Tier, la cual divide a la aplicación en tres capas, cada una con una funcionalidad bien definida. Esta arquitectura fue elegida porque se adapta perfectamente con las características de la aplicación desarrollada. En primer lugar, la naturaleza distribuida de la aplicación hace que sea fundamental elegir un tipo de arquitectura en la cual existan varios clientes independientes que interactúan con un servidor de aplicaciones, y en segundo lugar la necesidad de persistir los datos en un modelo de datos apropiado, dado que el objetivo fundamental de la aplicación es la recolección de datos proveniente de la interacción de usuarios.

La primer capa es la de presentación y corre en cada uno de los dispositivos Android utilizado por cada usuario. La capa intermedia se utiliza para proveer servicios correspondientes a la lógica de negocios. La última capa es la de persistencia, la cual se encarga de gestionar y almacenar los datos que son obtenidos en la aplicación.

En la figura 4.1 se puede observar las diferentes capas y cómo se comunican entre sí.

Figura 4.1 Arquitectura de la aplicación.

4.1.1 Capa de presentación

La capa de presentación en Geotandil consta de una aplicación Android, desarrollada íntegramente en el lenguaje Java utilizando la SDK de Android con la versión 10 de la API. Esta capa implementa las diferentes vistas de las cuales consta GeoTandil y utiliza la capa de servicios para obtener los datos necesarios.

Dado que la aplicación se basa fundamentalmente en interacciones con el mapa y en el posicionamiento sobre el mismo, se necesita un soporte que provea estas características, para esto se utilizó Open Street Map.

La capa de presentación también es la encargada de recibir y enviar las distintas notificaciones que se generan en base a la utilización de la aplicación, es decir, cuando se crean noticias nuevas o se agregan usuarios. Para esto se utiliza la API Google Cloud Messaging (GCM).

Open Street Map (OSM)

OpenStreetMap (también conocido como OSM) es un proyecto colaborativo para crear mapas libres y editables. Los usuarios registrados pueden subir sus trazas desde el GPS y crear y corregir datos vectoriales mediante herramientas de edición creadas por la comunidad OpenStreetMap.

Los mapas se crean utilizando información geográfica capturada con dispositivos GPS móviles, ortofotografías y otras fuentes libres. Esta cartografía, tanto las imágenes creadas como los datos vectoriales almacenados en su base de datos, se distribuye bajo licencia abierta Licencia Abierta de Bases de Datos.

GeoTandil utiliza el proyecto OSM, haciendo uso de los mapas creados por la comunidad. En particular, se utiliza el subproyecto OSMDROID, el cual brinda una serie de servicios y utilidades como base de la aplicación, ya sea tanto para dibujar las diferentes entidades (usuarios, lugares y noticias) sobre el mapa de la ciudad de Tandil, como para calcular la distancia entre dos puntos dados.

Al momento de seleccionar el soporte de mapas se plantearon como alternativas OSM y Google Maps, que es la plataforma de mapas provista por la empresa Google. Entre estas dos alternativas se optó por OSM, la cual en la ciudad de Tandil poseía una mayor calidad en cuanto al detalle de los mapas. Por otro lado, Google Maps limitaba la cantidad de peticiones durante cierta cantidad de horas, quedando la posibilidad de recibir errores dentro de la aplicación.

Google Cloud Messaging (GCM)

GCM es un servicio gratuito en la nube implementado por Google que permite enviar mensajes instantáneos desde un servidor hacia un dispositivo móvil y desde un dispositivo móvil hacia un servidor. Este servicio nos permite crear aplicaciones que requieran enviar alertas en tiempo real y mensajería instantánea.

GCM permite en GeoTandil, el envío de mensajes entre usuarios. Esto se realiza al producirse ciertos eventos como lo son los de creación de noticias, el envío de solicitudes de amistad, y el agregado de nuevos usuarios por parte de un usuario particular.

GCM se incorpora tanto del lado servidor como del lado cliente, esto se debe a que en el primero se tiene que proveer de un mecanismo que ante la llegada de un nuevo evento pueda enviar mensajes a los dispositivos/usuarios conectados y almacenar como pendientes aquellos que están desconectados. Del lado de los dispositivos se crea un servicio que corre y detecta la llegada de un nuevo mensaje y se realiza una acción determinada dependiendo del tipo de mensaje recibido.

A partir de este servicio entonces, se permite la interacción entre los distintos usuarios que forman parte de GeoTandil, ya que mediante la creación y agregado de distintas entidades se irán notificando y recibiendo mensajes unos con otros, y creando sus propios mapas con las entidades que son de su interés.

La figura 4.2 muestra dos escenarios. En el primero, con líneas en rojo, se muestra el proceso de registración. El usuario 2 se registra ante GCM y este le entrega un Token, luego este Token junto con el identificador del usuario que está logueado en el dispositivo se registran en el servidor propio de GeoTandil, el cual almacena la correspondencia entre usuario y dispositivo. El segundo escenario, con líneas celestes, muestra cuando el usuario 1 genera un mensaje. Este mensaje es procesado por el servidor de GeoTandil el cual determina a quién notificar, y reenvía el mensaje al servidor de GCM quién envía este al dispositivo que corresponde, en este caso al usuario 2.

Figura 4.2 Registración y envío de mensajes con GCM.

Sender Id: Es un valor numérico único que se crea cuando se configura un proyecto en Google Developers Console. El Sender Id es usando en el proceso de registro para identificar a la aplicación servidor que envía mensajes a la aplicación cliente.

API Key: Una clave almacenada en la aplicación servidor, la cual se usa para obtener autorización de acceso a GCM.

Registration Token: Un ID emitido por GCM a la aplicación cliente para que pueda recibir mensajes. Este ID debe almacenarse en la aplicación servidor para identificar el dispositivo al que se enviará un mensaje.

4.1.2 Capa de negocios

La capa de negocios consta de una aplicación web que corre en un servidor de aplicaciones Java. Esta atiende a los distintos dispositivos, respondiendo a cada una de sus peticiones.

Esta capa posee un conjunto de servicios web que están desarrollados utilizando la arquitectura RestFul, los cuales actúan como intermediarios para gestionar los datos que maneja la aplicación. Cada uno de los dispositivos envía y consulta datos, hacia y a través del servidor. El servidor es quien interactúa con la capa de datos manipulándolos para su correcto almacenamiento y consulta.

WS - Restful

Los servicios web en el servidor se desarrollaron utilizando RESTFul. Esta tecnología permite crear servicios usando el protocolo HTTP para la comunicación entre cliente y servidor, y JSON en la representación de las respuestas generadas desde el servidor hacia el cliente.

La representación JSON, en contraposición por ejemplo con XML, cuenta con un formato más simple para su lectura y fácil de procesar, por lo tanto se adapta muy bien en los dispositivos de bajo nivel de procesamiento como los teléfonos móviles. Al ser más compactos en cuanto a su tamaño, la transferencia de los mismos se realiza de manera más eficiente.

La principal razón por la cual se optó por RESTFul por sobre SOAP (Simple Object Access Protocol) para desarrollar los servicios web, es que el segundo utiliza XML como formato de representación de los datos.

A continuación se detallan algunos de los servicios más importantes utilizados por GeoTandil:

● getUserByUsername: devuelve el usuario a partir de un nombre de usuario dado. Este servicio es utilizado al ingresar a la aplicación o cuando se requiere mayor información de un usuario distinto al propio.

● getEntities: devuelve los usuarios y/o lugares a partir de un determinado nombre. Este servicio es utilizado para el buscador.

● saveEntity: agrega un usuario como amigo. Esto se lleva a cabo una vez que un usuario acepta una solicitud de amistad.

● saveNewEntity: agrega un lugar o noticia al usuario. Se realiza al agregar este tipo de entidad por parte del usuario.

● updatePositionEntity: actualiza la posición del usuario en la base de datos según la nueva posición detectada en el mapa. Sólo se invoca cuando el cambio de posición supera una determinada cantidad de metros, definida por el usuario. ● saveUserInvitation: registra una invitación de un usuario a otro, con estado

pendiente. Esto sucede una vez que se encontró el usuario de interés.

● saveUserPlace: se utiliza para guardar un lugar al usuario, ya sea a partir de su creación o búsqueda, o a partir de los lugares de otro usuario. En este último caso también se guarda ese usuario, el cual se lo considera que actúa como intermediario.

● updateEntityFrequencies: utilizado para registrar la cantidad de veces que el usuario se encuentra cerca (según su radio definido) de otras entidades, ya sea usuario, lugar o noticia. Esta acción se realiza de manera transparente al usuario al igual que cuando se actualiza la posición del usuario, sólo cuando se supera un determinado rango de distancia.

GCM Server - Envío de mensajes

Tanto el envío de solicitudes como la creación de noticias, puede activar las notificaciones entre distintos usuarios. Para esto, del lado del servidor se mantiene una estructura de datos que cuenta con el identificador (ID) de los dispositivos que están conectados a la aplicación en ese momento, el cual está asociado al usuario que lo está utilizando. De esta forma, cada vez que el server es invocado a través de sus servicios web y tiene que notificar a los usuarios sobre alguna actividad, busca dentro de la estructura y en caso de que el usuario esté conectado, se envía al dispositivo correspondiente el mensaje a través de GCM indicando el tipo de evento ocurrido y cualquier otro atributo necesario. En caso contrario, es decir, si el usuario está desconectado, el server almacena la notificación en estado pendiente para que cuando el usuario se conecte reciba las notificaciones correspondientes.

El envío de los mensajes GCM se realizan a través de la librería proporcionada por las herramientas de la SDK de Android, la cual simplemente se descarga y luego se hace uso sus funcionalidades. Así, el server de GeoTandil realiza el envío de mensajes al servidor GCM provisto por Google, quien realiza efectivamente el envío a cada uno de los dispositivos que correspondan.

A partir de la configuración en las distintas capas de la aplicación, más la configuración externa en el servidor GCM, cada una de las partes trabaja en forma colaborativa para el envío y recepción de mensajes entre usuarios de GeoTandil.

4.1.3 Capa de Datos

La capa de datos es la encargada del acceso a la base de datos, y por consiguiente de la manipulación de los mismos. Todos los datos manejados en la aplicación son almacenados en una base de datos relacional. Para realizar esto de forma independiente a la base de datos que se esté usando, se utiliza la herramienta Hibernate. Esta herramienta permite al servidor manejar los datos como objetos y la principal ventaja es que el motor de base de datos puede ser intercambiado, manejando solo configuración, es decir, sin afectar el núcleo de la aplicación.

En el caso de GeoTandil se utiliza un motor de base de datos MySQL. El esquema de la base relacional cuenta con un conjunto de tablas que almacenan información de las distintas entidades, y también otra información que es de gran interés para la aplicación vinculada con datos georreferenciales que se pretenden recolectar, e información de las distintas notificaciones enviadas entre usuarios.

Tablas en GeoTandil

A continuación se da un breve detalle del objetivo de cada tabla en cuanto a la información a guardar.

● entity_frequency: Se utiliza para almacenar cuántas veces un determinado usuario se encuentra (según su propio parámetro de distancia mínima definida) cerca de alguna de las otras entidades, ya sea otro usuario, o una noticia o lugar.

● place: Se almacenan todos los atributos que fueron cargados al momento de la creación de los lugares, y adicionalmente las coordenadas (latitud y longitud) y un valor que representa la imagen del mismo.

● report: Se almacenan todos los atributos que fueron cargados al momento de la creación de las noticias, y adicionalmente las coordenadas (latitud y longitud) y un valor que representa la imagen del mismo. También se guarda la fecha de creación de la noticia.

● report_place: Es utilizada para mantener la relación entre noticias y lugares, es decir qué noticias pertenecen a un determinado lugar.

● report_user: Es utilizada para mantener la relación entre noticias y usuarios, es decir qué noticias pertenecen o fueron creadas por un determinado usuario. ● user: Se almacenan todos los atributos básicos correspondientes al usuario para

la aplicación, entre ellos por ejemplo, la distancia mínima. Adicionalmente, al igual que para los lugares y noticias, se guardan las coordenadas (latitud y longitud) y el valor que representa la imagen. También se guarda la fecha de creación de la noticia.

● user_invitations: Es utilizada para mantener la invitaciones de amistad entre usuarios y el estado en el cual se encuentran, es decir, quién le envió una solicitud a quién, y si fue aceptada, rechazada, etc.

● user_notification: Es utilizada para almacenar la información cuando se agregan nuevas entidades, para notificarle a los usuarios relacionados a ellas. Se almacena quién fue el creador de la nueva entidad, tanto como el identificar y el tipo de la misma, y el estado de la notificación.

● user_place: Es utilizada para mantener la relación entre usuarios y lugares, es decir qué lugares pertenecen o fueron creados por un determinado usuario. ● user_relationship: Es utilizada para mantener la relación entre usuarios, es decir

qué usuarios mantienen un vínculo de amistad con otro.

El siguiente Diagrama de Entidad-Relación (DERE) se corresponde a las tablas previamente mencionadas y al esquema utilizado por GeoTandil:

Figura 4.3 Diagrama de entidades y relaciones de GeoTandil.