A continuación se entregará información del desarrollo y estructura de la aplicación.
La arquitectura del sistema se ilustra en la siguiente imagen:
Como se aprecia en la imagen se presentan dos sub-arquitecturas del tipo cliente-servidor. La primera de ellas se presenta en la comunicación entre el equipo móvil o portal web con el servidor de Bluetooth o Wifi dependiendo del caso. Mientras que la segunda se presenta entre la aplicación desarrollada (con la clase ServeClient) y la aplicación cliente que desee utilizar, en nuestro caso MySQL server.
A continuación se describirán en más detalle los módulos que posee la aplicación y que pueden verse en la imagen anterior de la Arquitectura del Sistema.
La interfaz de usuario tiene por finalidad desplegar las sesiones que se encuentran activas y un log de las sesiones que se han realizado. Las sesiones activas son aquellas que se poseen un icono de Bluetooth (con la información de la MAC del dispositivo) o Wifi (con la IP del dispositivo), según sea al caso. Mientras que el log de sesiones se despliega al lado derecho de la interfaz donde se indica si se trató de un inicio de sesión o fin de esta mostrando la información de la MAC o IP según sea el tipo de conexión.
En la siguiente Imagen se muestra la interfaz que se despliega:
Para la implementación de la interfaz se utilizó la programación conducida por eventos que posee J2SE. Como se ve en la imagen el JFrame principal contiene dos TabbedPane los que a su vez contienen un JPanel que posee una Jlist para las sesiones actuales y un JTextArea para el log de conexiones.
El servidor Bluetooth está compuesto por una clase Java que requiere la librería BlueCove para utilizar conexiones del tipo Bluetooth. La ventaja de esta librería es que nos permite realizar la programación de forma muy similar a lo que se haría en un dispositivo móvil con J2ME.
A continuación se entrega un diagrama que muestra la forma en que se invoca y ejecuta la clase del servidor Bluetooth:
La API JSR 82 es la que utiliza JAVA como API estándar para bluetooth, esta API nos permite:
- Registrar Servicios (Requerido por el servidor).
- Descubrimiento de Dispositivos y servicios.
- Establecimiento de tres tipos de conexiones entre dispositivos:
- Manejar y controlar conexiones de comunicación.
- Ofrecer seguridad a estas actividades.
A continuación se describirán los objetos necesarios para realizar el servidor:
Con todas estas clases descritas es posible crear un servidor bluetooth. Para tener más detalle y ver como se programa ver la clase “bluetoothServer” en el paquete “BluetoothServer” de la aplicación ELO330 descargable del link que se encuentra al final de esta página.
El servidor WiFi está compuesto por el Servlet “requestServlet” que se encuentra en la WebAplication “ELO330Completo”. Para poder comunicar este Servlet con el resto de la aplicación se posee una clase cliente en el Servlet llamada “Client” que se comunica a través de Sockets con la clase “ConectionManager” que actúa como servidor en un socket específico y atiende cada cliente en una hebra diferente. Cada una de estas hebras invoca a la clase “ServeClient” para obtener el servicio implementado.
El Servlet “requestServlet” recibe conexiones del tipo HTTP, esto se logra simplemente extendiendo de “HttpServlet” que requiere solo implementar los métodos “doGet” y “doPost”. Puesto que usaremos POST para enviar los datos, en la implementación de “doPost” se recuperan los parámetros “user” y “password” del mensaje HTTP que fueron enviados desde la página de autenticación en un navegador web, en el caso de la presentación. Luego se genera la Query de consulta para la base de datos y se crea una instancia de la clase “Client” quien a su vez envía el string con la Query al “ConectionManager” de la aplicación.
A continuación se entrega un diagrama que resume lo descrito:
Para ver los códigos fuentes descargar los códigos de la aplicación al final de esta página.
Esta clase es la encargada de recibir la información desde los servidores y actuar como cliente con la aplicación que se desea implementar. Esta es la clase que debe modificarse para cambiar la aplicación con la que se requiera trabajar. En este caso se recibe la información desde los servidores y se realiza una consulta a una base de datos de MySQL.
En esta aplicación existen dos ServeClient, una para el servidor Bluetooth y otro para el servidor WiFi. La finalidad de los dos es generar una instancia de la clase “DBAdm” que realiza la consulta a la base de datos. Luego invoca al método “obtenerUsuario” de ésta última donde se retorna True si el usuario existe en la base de datos o False en el otro caso. Finalmente devuelve a los servidores este resultado.
Las diferencias entre la clase “ServeClient” del servidor Bluetooth y WiFi es:
Cabe destacar que es posible lograr que se utilice una sola clase “ServeClient” pero por el momento ha quedado implementado de este modo.
Para que JAVA pueda conectarse a Base de Datos existe la API JDBC que para funcionar con algún manager de base de datos, como en nuestro caso MySQL, se debe descargar de la página del proveedor el Driver requerido. Hay otra forma de funcionar con un manager de Base de datos pero no será tratada aquí ya que para saber sobre esto y más sobre JDBC se puede acceder a la página del ramo ELO330.
En nuestro caso se utilizó NetBeans para desarrollar la aplicación el cual por defecto trae los drivers requeridos.
Para realizar las consultas a la Base de Datos se creó la clase “DBAdm” la cual abre la conexión a la base de datos usada llamada “memoria”. Posee además el método “obtenerUsuario” el cual recibe como argumento el string query para la consulta. Realiza la consulta con las clases “Statement” y “ResultSet” de la API y retorna un boolean true o false dependiendo el usuario buscada estaba o no en la base de datos.
Se desarrollaron dos métodos para demostrar esta aplicación. Una de ellas es una aplicación J2ME y la otra una página web JSP. Se dará una pequeña descripción de cada método de prueba ya que no forman parte de la aplicación en sí.
- Página JSP: Consta de una página simple hecha en código HTML que permite ingresar un usuario y una contraseña que se envía como parámetros de un mensaje HTTP. Para saber más sobre JSP ver página de SUN.
- Aplicación J2ME: Esta aplicación consta de dos clases. La primera de ellas genera un “LoginScreen” (importar “org.netbeans.microedition.lcdui.LoginScreen”) que nos permite ingresar un usuario y una contraseña. Estos datos los junta del modo “usuario;contraseña” y genera una instancia a la otra clase llamada “conexionBluetooth”. La clase “conexionBluetooth” utiliza la API JSR 82 para realizar la búsqueda del servidor y enviar a él los datos antes mencionados.
Lo importante a mencionar sobre programar un cliente Bluetooth en J2ME es que se debe crear la clase una clase “Listener” que implemente la interfaz “DiscoveryListener”. En ella se deben implementar sus cuatro métodos:
La aplicación desarrollada realiza una búsqueda de dispositivos que va guardando en un vector, luego de terminar la búsqueda revisa si es que encontró entre los dispositivos el servidor por medio del “friendly name”. Si lo encuentra revisa si posee servicio de conexión serial habilitada y envía la información, espera por la respuesta y la muestra por pantalla.
Para ver más detalle de la implementación revisar los códigos fuentes que se entregan en el siguiente apartado.
Aplicación principal (GUI, Servidor Bluetooth, ConectionManager, conexión a base de datos y ServeClient
1.- Levantar servidor Apache Tomcat en la lengueta Services de Netbeans
2.- Correr la aplicación descargada de "Servlet y JSP" se abrirá el navegador con la página de autenticación
3.- Correr la aplicación principal. Se abrirá la interfaz.
Ya pueden ingresarce datos desde la página web o con un equipo móvil que tenga instalada la aplicación J2ME