Java Bluetooth

  • Upload
    cmop

  • View
    24

  • Download
    0

Embed Size (px)

Citation preview

JSR-82: Bluetooth desde Java

Alberto Gimeno Brieba

JSR-82: Bluetooth desde Javapor Alberto Gimeno Brieba Copyright 2004 Alberto Gimeno Brieba El presente tutorial trata sobre la programacin de aplicaciones Java que hagan uso de Bluetooth. Ms concretamente trata sobre las APIs definidas en el JSR-82.This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA..

Tabla de contenidos1. Introduccin .................................................................................................... 1 Sobre la tecnologa Bluetooth ...................................................................... 1 Sobre el API JSR-82 ................................................................................... 1 Sobre este tutorial ....................................................................................... 1 2. El paquete javax.bluetooth ............................................................................... 2 Algunas clases bsicas ............................................................................... 2 Clase LocalDevice .............................................................................. 2 Excepcin BluetoothStateException ..................................................... 4 Clase DeviceClass .............................................................................. 4 Clase UUID ........................................................................................ 4 Bsqueda de dispositivos y servicios ........................................................... 5 Clase DiscoveryAgent ......................................................................... 5 La interfaz DiscoveryListener ............................................................... 6 La clase DataElement ....................................................................... 11 Comunicacin .......................................................................................... 15 Comunicacin cliente ........................................................................ 15 Comunicacin del lado del servidor .................................................... 19 3. El paquete javax.obex ................................................................................... 25 Clases bsicas ......................................................................................... 25 La clase HeaderSet .......................................................................... 25 La clase Operation ............................................................................ 26 Conexin cliente ....................................................................................... 27 Conexin servidor ..................................................................................... 28 4. Implementaciones de APIs Bluetooth para Java .............................................. 29 Implementaciones del JSR-82 ................................................................... 29 APIs no-JSR-82 ........................................................................................ 29 5. Documentacin de inters ............................................................................. 31

iv

Lista de tablas2.1. Tipos de datos DataElemnet ....................................................................... 11 3.1. Cabeceras y tipos de datos relacionados ..................................................... 25 3.2. Rangos y tipos de datos asociados para identificadores creados por el usuario ......................................................................................................................... 26

v

Captulo 1. IntroduccinSobre la tecnologa BluetoothBluetooth es una tecnologa de comunicacin inalmbrica omnidireccional. Se ide pensando en dispositivos de bajo consumo y comunicaciones a corta distancia (10 metros). Se trata de una tecnologa barata con un ancho de banda reducido: hasta 11 Mbit/s. Es ideal para perifricos de ordenador (ratn, teclado, manos libres,...) y dispositivos mviles (telfonos mviles, PDAs, Pocket PCs,...). Mediante Bluetooth es posible formar pequeas redes de dispositivos conectados denominadas piconets. Se pueden conectar varias piconets formando lo que se denomina una scatternet. Las principales aplicaciones de Bluetooth son: transferencia de archivos, sincronizacin de dispositivos y conectividad de perifricos.

Sobre el API JSR-82Este API est dividida en dos partes: el paquete javax.bluetooth y el paquete javax.obex. Los dos paquetes son totalmente independientes. El primero de ellos define clases e interfaces bsicas para el descubrimiento de dispositivos, descubrimiento de servicios, conexin y comunicacin. La comunicacin a travs de javax.bluetooth es a bajo nivel: mediante flujos de datos o mediante la transmisin de arrays de bytes. Por el contrario el paquete javax.obex permite manejar el protocolo de alto nivel OBEX (OBject EXchange). Este protocolo es muy similar a HTTP y es utilizado sobre todo para el intercambio de archivos. El protocolo OBEX es un estndar desarrollado por IrDA y es utilizado tambin sobre otras tecnologas inalmbricas distintas de Bluetooth. La plataforma principal de desarrollo del API JSR-82 es J2ME. El API ha sido diseada para depender de la configuracin CLDC. Sin embargo existen implementaciones para poder hacer uso de este API en J2SE. Al final del tutorial se listan la mayora de las implementaciones del JSR-82 existentes.

Sobre este tutorialLa finalidad de este tutorial es la de abordar el API definida en la especificacin JSR-82 en su totalidad a travs de ejemplos. Los ejemplos sern MIDlets que han sido probados usando el Java Wireless Toolkit 2.2Beta para Windows. Es muy recomendable tener la documentacin javadoc del API a mano. Se puede descargar de la pgina del JSR-82 en jcp.org [http://jcp.org/en/jsr/detail?id=82]

1

Captulo 2. El paquete javax.bluetoothEn una comunicacin Bluetooth existe un dispositivo que ofrece un servicio (servidor) y otros dispositivos acceden a l (clientes). Dependiendo de qu parte de la comunicacin debamos programar deberemos realizar una serie de acciones diferentes. Un cliente Bluetooth deber realizar las siguientes: Bsqueda de dispositivos. La aplicacin realizar una bsqueda de los dispositivos Bluetooth a su alcance que estn en modo conectable. Bsqueda de servicios. La aplicacin realizar una bsqueda de servicios por cada dispositivo. Establecimiento de la conexin. Una vez encontrado un dispositivo que ofrece el servicio deseado nos conectaremos a l. Comunicacin. Ya establecida la conexin podremos leer y escribir en ella.

Por otro lado, un servidor Bluetooth deber hacer las siguientes operaciones: Crear una conexin servidora Especificar los atributos de servicio Abrir las conexiones clientes

Algunas clases bsicasClase LocalDeviceUn objeto LocalDevice representa al dispositivo local. Este objeto ser el punto de partida de prcticamente cualquier operacin que vayamos a llevar a cabo en este API. Alguna informacin de inters que podemos obtener a travs de este objeto es, por ejemplo, la direccin Bluetooth de nuestro dispositivo, el apodo o "friendly-name" (tambin llamado "Bluetooth device name" o "user-friendly name"). A travs de este objeto tambin podemos obtener y establecer el modo de conectividad: la forma en que nuestro dispositivo est o no visible para otros dispositivos. Esta clase es un "singleton"; para obtener la nica instancia existente de esta clase llamaremos al mtodo getLocalDevice() de la clase LocalDevice. Veamos un ejemplo:

import javax.microedition.midlet.MIDlet; import javax.microedition.lcdui.*; import javax.bluetooth.*; public class Ejemplo1 extends MIDlet { public void startApp() { LocalDevice localDevice = null; try { localDevice = LocalDevice.getLocalDevice(); } catch(BluetoothStateException e) { System.out.println("Error al iniciar"+ " el sistema Bluetooth"); 2

El paquete javax.bluetooth

return; } String address = localDevice.getBluetoothAddress(); System.out.println("Direccin bluetooth del"+ " dispositivo local: "+address); String friendlyName = localDevice.getFriendlyName(); if(friendlyName == null) System.err.println("El dispositivo "+ "local no soporta un 'friendly-name'"+ " o no ha sido establecido"); else System.out.println("El 'friendly-name'"+ " del dispositivo local es:"+ friendlyName); try { if(!localDevice.setDiscoverable(DiscoveryAgent.GIAC)) System.out.println("El dispositivo no"+ " soporta el modo de "+ "conectividad 'GIAC'"); } catch(BluetoothStateException e) { System.err.println("No se pudo establecer"+ " la propiedad 'discoverable'"+ " a 'GIAC'"); } DeviceClass deviceClass = localDevice.getDeviceClass(); int discoverable = localDevice.getDiscoverable(); String discoverableString = null; switch(discoverable) { case DiscoveryAgent.GIAC: discoverableString = "General / Unlimited Inquiry Access"; break; case DiscoveryAgent.LIAC: discoverableString = "Limited Dedicated Inquiry Access"; break; case DiscoveryAgent.NOT_DISCOVERABLE: discoverableString = "Not discoverable"; break; default: discoverableString = "Desconocido"; } StringBuffer device = new StringBuffer("0x"); device.append(Integer.toHexString( deviceClass.getMajorDeviceClass())); device.append(", 0x"); device.append(Integer.toHexString( deviceClass.getMinorDeviceClass())); device.append(", 0x"); device.append(Integer.toHexString( deviceClass.getServiceClasses())); //interfaz de usuario Form main = new Form("Ejemplo LocalDevice"); main.append(new TextField("Direccin bluetooth", address, 12, TextField.UNEDITABLE)); main.append(new TextField("Nombre del dispositivo", friendlyName, friendlyName.length(), TextField.UNEDITABLE)); main.append(new TextField("Modo de conectividad", discoverableString, discoverableString.length(), TextField.UNEDITABLE)); main.append(new TextField("Tipo de dispositivo", device.toString(), device.length(), TextField.UNEDITABLE)); 3

El paquete javax.bluetooth

Display.getDisplay(this).setCurrent(main); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

Los posibles valores que admite setDiscoverable() estn definidos en la clase DiscoveryAgent como campos estticos. Estos son: DiscoveryAgent.GIAC (General/Unlimited Inquiry Access Code) : Conectividad ilimitada. DiscoveryAgent.LIAC (Limited Dedicated Inquiry Access Code) : Conectividad limitada. DiscoveryAgent.NOT_DISCOVERABLE : El dispositivo no ser visible para el resto de dispositivos.

Excepcin BluetoothStateExceptionAl llamar al mtodo getLocalDevice() se puede producir una excepcin del tipo BluetoothStateException. Esto significa que no se pudo inicializar el sistema Bluetooth. La excepcin BluetoothStateException extiende de java.io.IOException y no aade ningn mtodo adicional. En el paquete javax.bluetooth se definen dos tipos ms de excepciones que veremos ms adelante.

Clase DeviceClassEn el ejemplo hemos usado el mtodo getDeviceClass() que devuelve un objeto de tipo DeviceClass. Este tipo de objeto describe el tipo de dispositivo. A travs de sus mtodos podremos saber, por ejemplo, si se trata de un telfono, de un ordenador,... En la documentacin del API hay una pequea tabla con los posibles valores que devuelven los mtodos de esta clase y su significado.

Clase UUIDLa clase UUID (universally unique identifier) representa indentificadores nicos universales. Se trata de enteros de 128 bits que identifican protocolos y servicios. Como veremos ms adelante un dispositivo puede ofrecer varios servicios. Los UUID servirn para identificarlos. En la documentacin de la clase UUID se puede encontrar una tabla con los protocolos y servicios ms comunes y sus UUIDs asignadas. Del mismo modo que cuando hacemos aplicaciones de ejemplo con sockets usamos nmeros de puertos "inventados", que no estn asociados a ningn protocolo existente, en los ejemplos de este tutorial usaremos una UUID cualquiera. Podremos crear un objeto UUID a partir de un String o de un entero largo. En los ejemplos del tutorial crearemos UUIDs mediante enteros que representaremos en hexadecimal, como se acostumbra a hacer en los documentos relacionados con Bluetooth.

4

El paquete javax.bluetooth

Bsqueda de dispositivos y serviciosLas bsquedas de dispositivos y servicios son tareas que solamente realizarn los dispositivos clientes.

Clase DiscoveryAgentLas bsquedas de dispositivos y servicios Bluetooth las realizaremos a travs del objeto DiscoveryAgent. Este objeto es nico y lo obtendremos a travs del mtodo getDiscoveryAgent() del objeto LocalDevice:

DiscoveryAgent discoveryAgent = LocalDevice.getLocalDevice().getDiscoveryAgent();

A travs de DiscoveryAgent tenemos la posibilidad de obtener un array de dispositivos que el usuario haya especificado como "ya conocidos" (PREKNOWN, quiz una lista de dispositivos "favoritos") o un array de dispositivos descubiertos en bsquedas anteriores (CACHED). Esto lo haremos llamando al mtodo retrieveDevices() pasndole DiscoveryAgent.PREKNOWN o DiscoveryAgent.CACHED respectivamente. Este mtodo no devolver un array vaco si no encuentra dispositivos que coincidan con el criterio especificado, en vez de ello devolver null. El array devuelto por este mtodo es de objetos RemoteDevice, los cuales, representan dispositivos remotos. La clase RemoteDevice permite obtener la direccin Bluetooth del dispositivo que representa a travs del mtodo getBluetoothAddress() en forma de String. Tambin podremos obtener el "friendly-name" del dispositivo a travs del mtodo getFriendlyName(). Este ltimo mtodo requiere un argumento de tipo booleano. Este argumento permite especificar si se debe forzar a que se contacte con el dispositivo para preguntar su "friendly-name" (true) o bien se puede obtener un "friendly-name" que tuvo en una ocasin previa (false). El mtodo getFriendlyName() puede lanzar una java.io.IOException en caso de que no se pueda contactar con el dispositivo o este no provea un "friendly-name".

import javax.microedition.midlet.MIDlet; import javax.bluetooth.*; import java.io.IOException; public class Ejemplo2 extends MIDlet { public void startApp() { LocalDevice localDevice = null; try { localDevice = LocalDevice.getLocalDevice(); } catch(BluetoothStateException e) { System.out.println("Error al iniciar"+ " el sistema Bluetooth"); return; } DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent(); RemoteDevice[] preknown = discoveryAgent.retrieveDevices( DiscoveryAgent.PREKNOWN); if(preknown == null) { System.out.println("No hay"+ " dispositivos conocidos"); } else { System.out.println("Dispositivos conocidos:"); 5

El paquete javax.bluetooth

for(int i=0; i