Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cada vez que un dispositivo es encontrado se llama al Las bsquedas de dispositivos tambin se realizan
mtodo deviceDiscovered() pasando un argumento de mediante el objeto DiscoveryAgent. Concretamente
tipo RemoteDevice. usaremos el mtodo searchServices() al que le
tendremos que pasar un objeto DiscoveryListener que
Una vez que la bsqueda de dispositivos ha concluido se
recibir los eventos de la bsqueda, el dispositivo en el
llama al mtodo inquiryCompleted() pasando como
que realizar la bsqueda (un objeto RemoteDevice que
argumento un entero que indica el motivo de la
normalmente obtendremos en la bsqueda de
finalizacin. Este entero puede valer:
dispositivos), los servicios en los que estamos
interesados, y los atributos que queremos conocer sobre
dichos servicios (tipo de papel, tipo de tinta, etc). Por open() y le pasaremos una URL que contendr los datos
ejemplo un cliente que est interesado en un servicio de necesarios para realizar la conexin.
impresin, para imprimir un texto probablemente slo le
No necesitaremos construir la URL a mano ya que el
interese conocer el tipo de papel, sin embargo si
objeto ServiceRecord posee un mtodo que nos ahorra
queremos imprimir una imagen estaremos tambin
esta tarea: getConnectionURL().
interesados en si soporta o no tinta de color.
Llegados a este punto debemos saber que tenemos dos
Si se encuentra algn servicio se nos notificar a travs
formas diferentes de comunicacin: a travs de flujos de
del objeto DiscoveryListener mediante el mtodo
datos utilizando el protocolo SPP (Serial Port Profile) , o
servicesDiscovered(). Se nos pasar un array de objetos
bien a travs de L2CAP enviando y recibiendo arrays de
ServiceRecord que encapsulan los atributos de servicio
bytes. La forma ms sencilla es mediante SPP.
que solicitamos al invocar la bsqueda. Los valores de
estos atributos de servicio son objetos DataElement. Si el servidor utiliza SPP el mtodo Connector.open() nos
devolver un objeto de tipo
Un objeto DataElement encapsula los tipos de datos en
javax.microedition.io.StreamConnection. A travs de
los que puede ser representado un atributo de servicio.
este objeto podemos obtener un (Data)InputStream y un
Estos pueden ser: nmeros enteros de diferente longitud
(Data)OutputStream. Por lo tanto ya tenemos un flujo
con o sin signo, cadenas de texto, URLs, booleanos, o
de lectura y un flujo de escritura por lo que estamso en
colecciones de DataElements.
condiciones de leer y escribir datos.
Un ServiceRecord es, pues, como una tabla que
En caso de que el servidor utilice L2CAP el mtodo
relaciona los identificadores de los atributos con sus
Connector.open() nos devolver un objeto del tipo
valores (objetos DataElement).
javax.bluetooth.L2CAPConnection. Con este objeto
Cuando finalice la bsqueda de servicios se nos leeremos bytes con receive() y escribiremos bytes con
notificar mediante una llamada al mtodo send().
serviceSearchCompleted() de la interfaz
DiscoveryListener. Se nos pasar un argumento de tipo
3.2 Servidores Bluetooth
entero indicando el motivo de la finalizacin. Este
entero puede valer: La creacin de un servidor Bluetooth es ms sencilla que
la programacin de un cliente ya que no necesitamos
SERVICE_SEARCH_COMPLETED: la bsqueda ha realizar ningn tipo de bsqueda. Concretamente los
finalizado con normalidad. pasos que debe realizar un servidor Bluetooth son los
SERVICE_SEARCH_TERMINATED: la bsqueda siguientes:
ha sido cancelada manualmente. Crear una conexin servidora
SERVICE_SEARCH_NO_RECORDS: no existe la Especificar los atributos de servicio
informacin solicitada.
Abrir las conexiones cliente
SERVICE_SEARCH_ERROR: finaliz por un error.
Crear la conexin servidora es relativamente simple.
SERVICE_SEARCH_DEVICE_NOT_REACHABLE: el Sencillamente debemos llamar al mtodo
dispositivo no est a nuestro alcance. Connector.open() pasndole una URL con una sintaxis
Estas constantes son miembros de la interfaz determinada. En caso de querer comunicarnos mediante
DiscoveryListener. SPP la URL comenzar por btspp:// y en caso de querer
comunicarnos mediante L2CAP la URL comenzar por
Si hemos encontrado algn servicio que nos interesa btl2cap://. A continuacin deberemos indicar
pasaremos al siguiente paso: abrir la conexin. localhost/ como host. Esto determina que no
Abrir una conexin Bluetooth se lleva a cabo de la queremos conectarnos a nadie, sino que queremos ser
misma forma que se abre cualquier otro tipo de servidores. Seguidamente slo nos queda concatenar a
conexin en CLDC: a travs de la clase la URL el identificador del servicio (UUID) que vamos a
javax.microedition.Connector. Usaremos su mtodo ofrecer.
A continuacin llamaremos al mtodo Connector.open() DISCONNECT. Usado para finalizar la sesin.
pasando la URL como argumento. Si la URL comienza
Las cabeceras de un mensaje OBEX son encapsuladas por
por btspp:// nos devolver un objeto del tipo
un objeto HeaderSet. Existen cabeceras de uso comn
javax.microedition.StreamConnectionNotifier y en caso
como COUNT, NAME, LENGTH, Sin embargo podremos
de que la URL comience por btl2cap:// nos devolver
crear cabeceras personalizadas.
un objeto javax.bluetooth.L2CAPConnectionNotifier.
La clase Operation provee la funcionalidad para leer y
El siguiente paso es especificar los atributos de servicio.
enviar mensajes que no slo tienen cabeceras sino que
Por ejemplo si vamos a ofrecer un hipottico servicio de
tambin tienen un cuerpo de mensaje. Esta clase permite
impresin podramos indicar qu tipo de papel y de tinta
obtener un (Data)InputStream y un (Data)OutputStream
ofrecemos. Los atributos de servicio se almacenan en un
para leer o escribir el cuerpo del mensaje.
objeto ServiceRecord. Cada conexin servidora tiene un
ServiceRecord asociado que se obtiene a travs del Ahora que conocemos las clases bsicas pasemos a ver
LocalDevice. cmo programar un cliente OBEX.
6 Documentacin
La documentacin sobre las APIs definidas en el JSR-82
es muy escasa y mucho ms escasa es en espaol. Sin
embargo en javaHispano se public un tutorial[2] al
respecto en el que se puede encontrar mas informacin y
enlaces a otros documentos.
Agradecimientos
Agradezco su apoyo a la Escuela Universitaira Politcnica
de La Almunia, a ngel Blesa y a todos mis compaeros