jueves, 31 de enero de 2008

Cambio de planes

Tras la visita ayer con el tutor del proyecto, me voy obligado a hacer cambios importantes en el diseño y estructura de la aplicación.

Para empezar, el decisor Sms/Ficheros que había implementado en el móvil, se va al carajo. Es cierto que no es muy optimo, enviar sms por BT, teniendo al tipo a menos de 10 metros. La idea es que se envíe a través de la red.

Por lo tanto, hay que implementar una "red" (o por lo menos emularla) de ordenadores conectados a dispositivos BT. Estos nodos deberán estar conectados a una Base de datos que estará constantemente actualizandose, comprobando los dispositivos que hay a su alcance. Desde el nodo A hasta el nodo B hay 100 km, supongamos.

Queremos enviar un sms desde un móvil cercano al nodo A hasta un móvil cercano al nodo B. Eso es lo que tengo que solucionar.

Empezamos!!!

domingo, 27 de enero de 2008

RMS

"Record Management System"

J2ME posee un pequeño sistema de almacenamiento en memoria "secundaria", como una pequeña base de datos acoplada al teléfono. Se reserva un poco de la memoria interna del móvil para este propósito.

Este sistema es el RMS y consiste en el almacenamiento de tuplas "indice,valor" donde "valor" es lo que queramos almacenar como byte[].

La clase RecordStore, nos proporciona todos los métodos necesarios para almacenar, recuperar, actualizar y borrar esos registros.

Voy a usar este sistema de almacenamiento, como una especie de "Caché" de direcciones BT. Cada vez que el dispositivo acceda a la base de datos MySql del portatil y obtenga la información del usuario, se guardará esa información en el RMS para que en un futuro, si el destinatario al que queremos enviar "algo" ya fue usado anteriormente, no tengamos que hacer la conexión con el portátil, directamente la obtenemos del sistema de RecordsStores.

lunes, 21 de enero de 2008

Obex

La asignatura que tenía pendiente desde que comencé el proyecto, ya está superada:

El envío de ficheros por bluetooth mediante OBEX.

La idea es muy simple, pero no se porqué, estaba tan atrancado.

Para el envío, he aquí los elementos más importantes:



          ClientSession cs = (ClientSession) conector;
header = cs.createHeaderSet();
cs.connect(header);
header.setHeader(HeaderSet.NAME, "ABB.jpg");
header.setHeader(HeaderSet.TYPE, "image/jpeg");
header.setHeader(HeaderSet.LENGTH, new Long(archivoEnviar.length));
Operation putOp = cs.put(header);
OutputStream strmEscritura = putOp.openOutputStream();
strmEscritura.write(archivoEnviar);
strmEscritura.flush();
strmEscritura.close();

Lo importante, en OBEX, es añadirle una cabecera a lo que vayamos a enviar. En este caso vamos a enviar una imagen (TYPE, "image/jpeg"), con el nombre de ABB.jpg, y su longitud.

Una vez creada la cabecera, enviamos el cuerpo, en este caso sería la variable archivoEnviar y sería un byte[].


domingo, 20 de enero de 2008

Java Mail

Bueno, mientras consigo encontrar un servidor en condiciones para alojar mis paginillas, sigo trabajando.

Esta vez en el envío de mails.

Uno de los objetivos, es que desde el dispositivo móvil pueda enviar correos electrónicos.

Ahí va, señores, el trozo de código que hace eso, en J2SE (habrá que programar, por envío de bluetooth y la serialización que me inventé, el envío desde el dispositivo móvil)
Jmaile



/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jmailer;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* Clase que al pasarle los parametros del mail, envía un correo a la dirección especificada.
* @author jbeer
*/
public class Jmailer {

public Jmailer(String from, String to, String subject, String texto) {
try {

java.util.Properties props = new java.util.Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "25");

Authenticator auth = new SMTPAuthenticator();

Session session = Session.getDefaultInstance(props, auth);

// Construct the message
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setText(texto);


Transport.send(msg);
} catch (MessagingException ex) {
Logger.getLogger(Jmailer.class.getName()).log(Level.SEVERE, null, ex);
}



}

private class SMTPAuthenticator extends javax.mail.Authenticator {

public PasswordAuthentication getPasswordAuthentication() {
String username = "XXXXXX";
String password = "XXXXXX";
return new PasswordAuthentication(username, password);
}
}
}


En la clase "STMPAutehnticator" como username y password poner vuestro usuario y password de la cuenta google.

miércoles, 9 de enero de 2008

Sun One: Aplicattion Server

Aprovechando que en el master estamos viendo el "Weblogic", y que tanto MCarmen como yo vamos a trabajar sobre el servidor de aplicaciones de Sun, he pasado un ratillo instalándolo en el portátil. Me va a ser muy útil para el proyecto.

Montaré una aplicación encargada de recoger información vía HTTP, (consultaré base de datos y tal) y devolveré la información al móvil. Todo esto se hará en el caso que el servidor no esté disponible a través de bluetooth.

Veamos algunos enlaces interesantes.

Sun Java System Aplicattion Server 9.1:
-Características
-Zona de descarga
-Guía


Ya tenemos todo lo necesario para bajaros e instalar nuestro servidor de aplicaciones.

Durante el proceso de instalación, el sistema te pedirá que introduzcas un login y contraseña de administrador, desde el cual podrás gestionar el servidor.

Una vez finalizada la instalación, nos da la opción de poner en marcha el servidor, en ese caso, solo tendremos que ir a la pantalla de "Login" para acceder a las herramientas del Aplicattion Server.

http://localhost:XxXx/login.jsf

Donde XxXx es el puerto que hayas decidido durante la instalación para que sea "el puerto de administrador".

En el caso que no hayamos arrancado el servidor y queramos hacerlo manualmente.

Para linux:

Agregamos ruta_de_instalacion/bin al PATH y ejecutamos en consola:

asadmin start-domain domain1

donde "domain1" es el dominio que queramos arrancar, en este caso arrancamos el dominio por defecto.

Por lo pronto no he hecho nada más. En los próximos días os contaré como montar las aplicaciones y comprobar que funcionan.

Un saludo y espero que los reyes se hayan portado bien con vosotros.

sábado, 5 de enero de 2008

Algoritmo de decisión.

Me encuentro en una fase bastante avanzada del proyecto.

Actualmente estoy pensando y trabajando en los algoritmos de decisión de la aplicación. Algoritmos que quedarán transparentes al usuario.

Uno de ellos es el siguiente.


Bueno, es un diagrama de flujos algo burdo pero se muestra claramente lo que quiero hacer. (para cada uno de los módulos de la aplicación se hará un algoritmo parecido).

En este caso, pretendo enviar un sms a un compañero. Inserto el número de móvil de la persona cuyo sms quiero enviar. Ahora, el proceso que sigue a continuación será transparente para el usuario.

Mediante bluetooth, me conecto con el servidor (mi portatil). En el caso que el servidor no esté disponible por BT tendré que hacerlo mediante http (Todavía no implementado). De esta forma, accedo a la base de datos y obtengo la información del usuario en cuestión.

Una vez obtenida su dirección BT, la busco en el área. Si encuentro a ese usuario, le envío el sms como un fichero de txto (obex), si no lo encuentro, le envío el sms de forma normal y corriente (con WMA, visto en el post de abajo).

En el tema del http, me surgen dudas...¿hasta que punto es rentable consultar una base de datos en un servidor si hay que hacerlo por http? Tendré que consultarlo.

jueves, 3 de enero de 2008

WMA

Otra de las funcionalidades que debía tener mi aplicación, es el envío de SMS, ya sea por bluetooth (el envío de un archivo de texto) o mediante el método ordinario.

Para implementar el envío ordinario de sms (y mms, pero todavía no me he metido en ese tema) se usa el API WMA.

El código de envío de sms es realmente sencillo:

public void run() {
String direccion = destino + ":" + 50000;

MessageConnection smsconn = null;

try {
/** Open the message connection. */
smsconn = (MessageConnection)Connector.open(direccion);

TextMessage txtmessage =
(TextMessage)smsconn.newMessage(MessageConnection.TEXT_MESSAGE);
txtmessage.setAddress(direccion);
txtmessage.setPayloadText(this.texto);
smsconn.send(txtmessage);
} catch (Throwable t) {
System.out.println("Enviando: ");
t.printStackTrace();
}

if (smsconn != null) {
try {
smsconn.close();
valido = true;
} catch (IOException ioe) {
System.out.println("Cerrando conexión: ");
ioe.printStackTrace();
}
}
}

donde "dirección" es: "sms://numeromovil:puertoenvio" (normalmente el puerto de envío de sms es el 50000)

y "this.texto" bueno, es el texto a enviar en el mensaje.


Lo próximo será juguetear con los MMS, pero antes, tengo una cosa pendiente con un envío de ficheros y serialización.

¿conseguiré enviar una foto "serializada"?