lunes, 3 de agosto de 2009

Cambios

Bueno, después de la decisión de retomar el blog, voy a empezar a realizar algunos cambios de diseño, para darle un nuevo aire. Así mismo pondré más documentación sobre las tecnologías móviles de interés.

De vuelta

Buenas a todos.

Hace mucho que no escribo por aquí y es que he tenido un año muy ajetreado e interesante.

Una vez que acabé el proyecto en J2ME y Bluetooth, empecé a trabajar con Android, el sistema operativo móvil de Google.

Llevo ya un año con este maravilloso sistema y como es habitual, me gusta escribir sobre la experiencia Android. Así pues, os dejo algunos enlaces que he escrito recientemente sobre el tema.

Empezamos con una

Introducción a Android

Seguimos algo más avanzados con

Estructura de una aplicación Android

Por ahora ya está, no quiero saturaros con mucha más información.

Actualizaré más a menudo este blog, escribiendo nuevas entradas, añadiendo nuevos enlaces y respondiendo preguntas. Espero vuestra participación!

viernes, 25 de julio de 2008

Grupo de Desarrolladores

Buenas a todos los lectores.

Acabo de crear un grupo de desarrolladores en el que se puede discutir todas las dudas y problemas que tengais en programación. En este caso J2ME y Bluetooth.

Espero veros allí y os podré resolver todas las dudas.

La dirección es:

http://groups.google.com/group/DevelopersR_D?hl=es

Registraros. Os espero!

martes, 22 de julio de 2008

Final

Buenas a todos.

Comentaros que hace un par de meses, presenté el proyecto frente al tribunal, con un rotundo éxito.

Así que destinaré este blog a resolver dudas y poner ejemplos sobre Java, Bluetooth, J2ME, y Android (esto es nuevo!).

Cualquier duda, posteadla e intentaré resolverla.

sábado, 23 de febrero de 2008

A full

Llevo casi 1 mes sin escribir nada, pero es que estoy tan concentrado con el proyecto, que me queda poco tiempo para otras cosas.

Solo decir que ya lo tengo casi listo.

Quizás para mañana esté finalizado.

Ya os contaré.

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"?

lunes, 31 de diciembre de 2007

"Serialización" en J2ME

Antes de que acabase el año, he querido experimentar el tema de la "Serialización" de objetos en J2ME.

Antes de nada, el proceso de serialización, consiste en convertir, objetos, variables... en una cadena de Bytes.

De esta forma, en el servidor, podría componer un objeto "Usuario" por ejemplo, con toda la información de tal persona (numero de móvil, nombre, dirección bluetooth, dirección Ip...) serializarlo y enviarlo al dispositivo móvil. Una vez recibido en el cliente, lo "des-serializamos" y obtenemos el mismo objeto original. Muy útil para envío de estructuras complejas entre dispositivos.

La serialización, por desgracia, no está implementada para J2ME, así que he tenido que hacer un arreglillo, siguiendo los pasos de este "Consejo".

He realizado las pruebas pertinentes, y he recibido correctamente el objeto. Esto abre nuevas puertas y nuevas ideas...

Un saludo y feliz año.

domingo, 30 de diciembre de 2007

El servidor responde

Como comentaba en el último post.

Una vez consultada la base de datos en el servidor (el portatil), este le responde al móvil la información requerida. En este caso la dirección bluetooth del dispositivo que estamos buscando.

Lo próximo será enviar un objeto completo con toda la información del usuario, usando "Serialización". El problema es que para J2ME no existe esta funcionalidad y habrá que implementar algo por el estilo.

Ya os contaré como va el tema.

domingo, 23 de diciembre de 2007

J2ME+Bluetooth+J2SE+MySql

Todo unido, casi a la perfección.

Sigo retocando un poco el código y mejorando el cliente, lo que tengo ahora mismo es una prueba, todavía no está implementado en el "JSend".

Veamos algunos pedazos de códigos interesantes.

En la parte del cliente (J2ME)

conn = (StreamConnection) Connector.open(connString);

donde "connString" es algo parecido a esto:

"btspp://0009DD506CE7:1" (Dirección del dispositivo bluetooth al que queremos conectarnos, y su canal (1).

una vez abierta la conexion creamos el objeto de salida:

output = conn.openOutputStream();

y enviamos los datos por el flujo de salida

byte[] datos = this.mensaje.getBytes();
output.write(datos);

En el servidor (J2SE):

Activamos el dispositivo bluetooth:

local = LocalDevice.getLocalDevice();
local.setDiscoverable(DiscoveryAgent.GIAC);

Creamos la dirección del "servidor" donde UUID_STRING es un número hexadecimal de 32 bits y NOMBRE_SERVICIO un nombre identificativo que queramos.

String url = "btspp://localhost:" + UUID_STRING + ";name="
+ NOMBRE_SERVICIO;

Abrimos la conexión y esperamos las "llamadas" entrantes.

server = (StreamConnectionNotifier) Connector.open(url);

StreamConnection conn = server.acceptAndOpen();

Abrimos el flujo de lectura

InputStream is = conn.openInputStream();

volcamos el buffer de lectura en una variable "buffer" de tipo byte... y a leer!!

int numChars = is.read(buffer);


Utilidad:

Desde el movil, enviamos al servidor el teléfono del amigo al que queramos enviarle el archivo/foto. El servidor lo recibe y busca en la base de datos (como comentaba en post más abajo) toda la información de ese número de teléfono.

Solo me queda la fase de "respuesta del servidor al móvil"...

En el siguiente capítulo más!!!!

jueves, 20 de diciembre de 2007

Conexión exitosa

Como ya os he ido comentando en mis anteriores post, mi intención era conectar Java con MySql.

La idea "ambiciosa" es:

Desde el móvil, consultar datos existentes en la base de datos del PC. A través del bluetooth, envío, por ejemplo el número de teléfono, y el ordenador me devuelve por ejemplo la dirección bluetooth (si existe) de ese móvil.

Ya tengo la parte del servidor, ya obtengo información de la base de datos. Ahora falta comunicar el movil con el PC y obtener respuesta del mismo.

lunes, 17 de diciembre de 2007

MySql Administrator

Después de instalar el MySql Administrator, el administrador de base de datos mysql (Como bien dice el nombre).

Una vez conseguida la conexión al servidor local y haber probado un par de tablas, me encuentro con el siguiente problema a la hora de alterar algunas tablas:

error Nr.1064


Buscando por internet he encontrado la solución. El programilla tiene un pequeño "bug", y es que en el caso que no introduzcamos la longitud del campo (varchar(20), por ejemplo) nos da ese pete...

Solución: Meterle un valor de longitud al campo en particular. Y solucionado!!!

MySql Server.

Bueno, he vuelto, después de varias semanas de desaparición proyectil, vuelvo a la carga.

Esta vez le estoy metiendo mano al servidor que irá alojado en mi portatil. La idea es crear una base de datos pequeña, con información sobre usuarios, sus teléfonos...y desde el móvil acceder a ella.

Por lo pronto estoy instalando en MySql en el cacharro este. (Recordemos que estamos en Linux)

Pasos que estoy siguiendo:

-Instalar los paquetes "myslq-server" y "mysql-client".

-Instalar un entorno "MySql Administrator", para una gestión de las tablas mucho más fácil e intuitiva.

-Configurar el netbeans para que me pille la base de datos y poder hacer pruebas.

Por lo pronto los pasos 1 y 2 ya están completos, voy a empezar a juguetear un poco con esto a ver si me encuentro algún problema...(espero que no).

Actualización:

Acabo de conectar el Netbeans con la base de datos:

El Netbeans 6.0 ya tiene incluido el driver de conexión con la BD, así que solo hay que seleccionar la dirección de la máquina a la que hay que conectarse (localhost:3306) el usuario y la contraseña...

Y ya tengo conexión.

Yeah!!

martes, 20 de noviembre de 2007

Fase 1 Completada-> Fase 2 Inicio

Después de 1 semana de inactividad, por culpa del Master, he vuelto a la carga...con excelentes resultados.

Hace 2 semanas, os contaba que iba a comenzar a usar FileSystem de J2ME, (API JSR75), ayer ya tenía casi completo el sistema de ficheros y hoy ya he puesto la guinda.

La siguiente fase, una vez obtenido el fichero, es el envío por...pongamos Bluetooth, así que la Fase 2, es:

Envío por Obex.

Ya tengo algunas cosas hechas, solo habrá que modificarlas y adaptarlas a mi código.

miércoles, 7 de noviembre de 2007

Sistema de Ficheros

Llevo trabajando unos cuantos días en el sistema de ficheros del programa.

Ya que voy a enviar un fichero desde el móvil, tendré que seleccionar el fichero, así que hay que crearse un sistema de carpetitas, raices y ficheritos para que la localización del documento en cuestión sea fácil.

Bautizado como JExplorer, es un pequeño "Explorador de ficheros" en el programa principal.

Lo próximo será obtener una direccion/teléfono de la agenda de contactos.

El móvil en sí, trae todas estas funcionalidades, pero recordad que quiero: obtener un fichero y acceder a la lista de contactos dentro de un programa. En cuanto tenga el sistema de ficheros os cuento como va la movida...