Introducción.
Después de la fallida búsqueda de una librería para acceder al protocolo Bluetooth desde Mono vuelvo entonces a Java buscando la opción mas portable posible. Esta vez voy a probar BlueCove que soporta Mac OSX, WIDCOMM, BlueSolei, Windows nativo y Linux con BlueZ.
Instalación.
Descargar las últimas versiones disponibles desde la siguiente ubicación: http://sourceforge.net/project/showfiles.php?group_id=114020
- bluecove-*.jar: módulo principal, incluye el soporte para las pilas de Mac OS X, WIDCOMM, BlueSoleil and Microsoft Bluetooth.
- bluecove-gpl-*.jar: adiciona el soporte para la pila en Linux.
Descargar estos archivos JAR en una ubicación conocida.
Descubriendo dispositivos Bluetooth.
Para esto se parte de un objeto que implementa DiscoveryListener, él define que se debe hacer cuando cuando se encuentra un nuevo dispostivo y cuando se termina la búsqueda.
/**
* The DiscoveryListener interface allows an application to
* receive device discovery and service discovery events.
*/
DiscoveryListener listener = new DiscoveryListener()
{
/**
* Called when a device is found during an inquiry.
*/
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
{
System.out.println("Device " + btDevice.getBluetoothAddress() + " found");
devicesDiscovered.addElement(btDevice);
try
{
System.out.println(" name " + btDevice.getFriendlyName(false));
}
catch (IOException cantGetDeviceName) {}
}
/**
* Called when an inquiry is completed.
*/
public void inquiryCompleted(int discType)
{
System.out.println("Device Inquiry completed!");
synchronized(inquiryCompletedEvent)
{
inquiryCompletedEvent.notifyAll();
}
}
// Not used in this example.
public void serviceSearchCompleted(int transID, int respCode) {}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {}
};En este ejemplo, cuando se identifica a un nuevo dispositivo Bluetooth (ver deviceDiscovered) se obtiene su dirección, de ser posible su nombre y se agrega en la lista de dispositivos encontrados.
public static final Vector<RemoteDevice> devicesDiscovered = new Vector<RemoteDevice>();
Para ejecutar finalmente la búsqueda de dispositivos de acuerdo con el comportamiento definido anteriormente, se crea un objeto sobre el cual se sincronizarán las próximas acciones.
final Object inquiryCompletedEvent = new Object();
synchronized(inquiryCompletedEvent)
{
// The search code ...
}Con él se inicia la búsqueda de dispositivos accediendo al Agente Descubridor del Dispositivo Local.
boolean started = LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, listener);
Finalmente se verifica que la búsqueda haya comenzado exitosamente y se espera para garantizar su ejecución.
if (started)
{
System.out.println("Starting Device Discovery process ...");
/**
* Wait for Discovery Process end
*/
inquiryCompletedEvent.wait();
System.out.println("There was " + devicesDiscovered.size() + " device(s) found");
}Compilación & ejecución.
Para compilar y posteriormente ejecutar el programa de demostración es necesario garantizar que el JAR de bluecove, descargado inicialmente, se encuentre en el CLASSPATH. También es necesario recordar que si la plataforma objetivo es Linux, es necesario incluír además el JAR de bluecove-gpl.
Para compilar se utiliza un comando preparado de la siguiente manera.
javac -cp ../lib/current/bluecove-2.1.0.jar:../lib/current/bluecove-gpl-2.1.0.jar RemoteDeviceDiscovery.java
Debe tenerse en cuenta que para la compilación se está suponiendo que los archivos JAR se encuentran en el directorio ../lib/current y que corresponden con la versión 2.1.0. Además se está realizando en Linux, motivo por el cual el separador de directorios es : en lugar del ; utilizado por Windows. Es necesario que adapte el comando según sus características específicas.
Para interpretar se utiliza un comando similar, preparado de la siguiente manera.
java -cp ../lib/current/bluecove-2.1.0.jar:../lib/current/bluecove-gpl-2.1.0.jar RemoteDeviceDiscovery
La salida de la aplicación.
La aplicación de demostración deberá imprimir por salida estándar la información de los dispositivos Bluetooth que se encuentren cerca durante el tiempo que dure la búsqueda. Algo similar a lo siguiente.
BlueCove version 2.1.0 on bluez
Starting Device Discovery process …
Device 001ADE8BF510 found
name Jimezam Phone
Device 0017AE39DCB0 found
name Nintendo RVL-CNT-01
Device Inquiry completed!
There was 2 device(s) found
BlueCove stack shutdown completed
En la respuesta anterior se puede apreciar que la aplicación detectó exitosamente a mi teléfono celular y a un Wiimote que pasaba por allí.
Enlaces.
- BlueCove.
http://www.bluecove.org/ - API de BlueCove.
http://www.bluecove.org/bluecove/apidocs/ - Código fuente de la aplicación de demostración.
http://demo.jorgeivanmeza.com/Java/BlueCove/RemoteDeviceDiscovery/



