in

Uso de las API de Java para Bluetooth, parte 2

149093

Bluetooth es una tecnología inalámbrica de bajo costo y corto alcance que se ha vuelto popular entre quienes desean crear redes de área personal (PAN). Cada PAN es una red creada dinámicamente construida alrededor de un individuo, que permite que dispositivos como teléfonos celulares y asistentes digitales personales (PDA) se conecten automáticamente y compartan datos de inmediato. Para apoyar el desarrollo de software habilitado para Bluetooth en la plataforma Java, el Proceso de la comunidad de Java (JCP) ha definido JSR 82, el API de Java para tecnología inalámbrica Bluetooth (JABWT).

La parte 1 de este artículo presentó una descripción general de la tecnología Bluetooth y JABWT, junto con casos de uso, actividades y elementos de una aplicación Bluetooth típica. También introdujo las API principales de JABWT definidas en el javax.bluetooth paquete. Esta segunda parte del artículo se centrará en los aspectos prácticos de JABWT. Los ejemplos de código le mostrarán cómo utilizar las API principales de Bluetooth para inicializar una aplicación Bluetooth, gestionar las conexiones, configurar un servicio, descubrir dispositivos y servicios cercanos, conectarse a un servicio y hacer una conexión segura.

Introducción

Comencemos por revisar brevemente los casos de uso típicos y las actividades de una aplicación habilitada para Bluetooth. Una aplicación Bluetooth puede ser un servidor o un cliente, un productor de servicios o un consumidor, o puede comportarse como un verdadero punto final de igual a igual al exponer el comportamiento del servidor y del cliente. Las aplicaciones típicas de Bluetooth tienen tres categorías de casos de uso:

149093
Click para agrandar

Figura 1: Casos de uso de Bluetooth

  • Inicialización – Cualquier aplicación, servidor o cliente habilitado para Bluetooth, primero debe inicializar la pila de Bluetooth.
  • Cliente – Un cliente consume servicios remotos. Primero descubre cualquier dispositivo cercano, luego, para cada dispositivo descubierto, busca servicios de interés.
  • Servidor – Un servidor pone los servicios a disposición de los clientes. Los registra en la base de datos de descubrimiento de servicios (SDDB), publicándolos de hecho. Luego espera las conexiones entrantes, las acepta a medida que ingresan y atiende a los clientes que las hacen. Finalmente, cuando el servicio ya no es necesario, la aplicación lo elimina de la SDDB.

La Figura 2 muestra un diagrama de las actividades típicas de las aplicaciones de cliente y servidor Bluetooth:

148435
Click para agrandar

Figura 2: Actividades del servidor y del cliente

Puede ver en esta figura que tanto el cliente como el servidor realizan la inicialización, que la aplicación del servidor prepara un servicio y espera las conexiones, y que el cliente descubre dispositivos y servicios, luego se conecta a un dispositivo específico para consumir un servicio en particular.

Ahora, profundicemos en un código de muestra que muestra cómo implementar estas actividades utilizando las API de Java para Bluetooth.

Inicialización de la aplicación Bluetooth

Como puede ver en la Figura 3, la inicialización es una actividad muy simple:

145481

Figura 3: Inicialización de la aplicación Bluetooth

Primero, la aplicación recupera una referencia al Administrador de Bluetooth del LocalDevice. Las aplicaciones cliente recuperan una referencia al DiscoveryAgent, que proporciona todos los servicios relacionados con el descubrimiento. Las aplicaciones del servidor hacen que el dispositivo sea detectable. En el siguiente fragmento de código, el método de inicialización btInit() realiza la inicialización del cliente y del servidor:

...
private LocalDevice localDevice; // local Bluetooth Manager
private DiscoveryAgent discoveryAgent; // discovery agent
...
/**
 * Initialize
 */
public void btInit() throws BluetoothStateException {
    localDevice = null;
    discoveryAgent = null;
    // Retrieve the local device to get to the Bluetooth Manager
    localDevice =  
                                         LocalDevice.getLocalDevice();                   
    // Servers set the discoverable mode to GIAC
     
                                         localDevice.setDiscoverable(DiscoveryAgent.GIAC);                   
    // Clients retrieve the discovery agent
    discoveryAgent =  
                                         localDevice.getDiscoveryAgent();                   
}
..
                

No todas las aplicaciones sirven como servidor y como cliente al mismo tiempo; los roles que desempeñan dependen de los requisitos de su aplicación. Las aplicaciones de servidor se configuran para ser detectables, mientras que las aplicaciones de cliente obtienen una referencia al agente de descubrimiento para el descubrimiento de servicios. Cuando configura el modo detectable del dispositivo llamando LocalDevice.setDiscoverable() debe especificar el código de acceso a consultas (IAC). JABWT admite dos modos de acceso:

  • DiscoveryAgent.LIAC especifica Código de acceso de consulta limitada. El dispositivo será detectable solo por un período de tiempo limitado, generalmente un minuto. Después del período limitado, el dispositivo vuelve automáticamente al modo no detectable.
  • DiscoveryAgent.GIAC especifica Código de acceso de consulta general. No se establece ningún límite sobre el tiempo que el dispositivo permanece en el modo detectable.

Para forzar un dispositivo a volver al modo no detectable, simplemente llame LocalDevice.setDiscoverable() con DiscoveryAgent.NOT_DISCOVERABLE como argumento.

Nota: Detrás de escena, el Centro de control de Bluetooth (BCC) sirve como la autoridad central para todas las configuraciones de Bluetooth locales. El BCC permite al usuario definir y anular modos detectables y otras configuraciones. El BCC también existe para evitar que cualquier aplicación afecte negativamente a otros. Para obtener más información, consulte la especificación.

Siempre que un dispositivo es detectable, es visible para otros dispositivos Bluetooth y, por lo tanto, está abierto a ataques. Aunque GIAC es el código de acceso a consultas más utilizado, para reducir el riesgo, debe considerar hacer que el dispositivo sea detectable solo cuando sea necesario, y quizás solo por períodos cortos de tiempo, utilizando LIAC. El BCC le permite deshabilitar el modo de descubrimiento.

Lidiar con las conexiones

En En la parte 1 de este artículo, aprendió que las conexiones JABWT se basan en el protocolo de capa de adaptación y control de enlace lógico (L2CAP), un protocolo de paquetes de datos de bajo nivel, y que el perfil de puerto serie admite un protocolo de emulación en serie sobre L2CAP ( SPP) RFCOMM. Las conexiones JABWT se basan en el marco de conexión genérico (GCF) y están representadas por el L2CAPConnection y StreamConnection tipos respectivamente. La parte 1 también señaló que, si bien L2CAPConnection se introdujo con JSR 82, StreamConnection se definió como parte del original javax.microedition.io GCF, en la configuración de dispositivo limitado conectado (CLDC).

Al igual que con todos los tipos de conexión GCF, crea una conexión Bluetooth utilizando la fábrica de conexiones GCF javax.microedition.io.Connector, pasando a su open() método un argumento de URL de conexión que describe el punto final de conexión que se va a crear. El esquema de URL de conexión determina el tipo de conexión a crear:

  • El formato de URL para un L2CAPConnection:
    btl2cap: // nombre de host: [ PSM | UUID ]; parámetros
  • El formato de URL para un RFCOMM StreamConnection:
    btspp: // nombre de host: [ CN | UUID ]; parámetros

Dónde:

  • btl2cap es el esquema de URL para un L2CAPConnection.
  • btspp es el esquema de URL para un RFCOMM StreamConnection.
  • nombre de host es cualquiera localhost para configurar una conexión de servidor, o la dirección de Bluetooth para crear una conexión de cliente.
  • PSM es el valor del multiplexor de protocolo / servicio, utilizado por un cliente que se conecta a un servidor. Esto es similar en concepto a un puerto TCP / IP.
  • CN es el valor del Número de canal, utilizado por un cliente que se conecta a un servidor, también similar en concepto a un puerto TCP / IP.
  • UUID es el Identificador único universal que se utiliza al configurar un servicio en un servidor. Se garantiza que cada UUID es único en todo el tiempo y el espacio.
  • parámetros incluir name para describir el nombre del servicio y los parámetros de seguridad authenticate, authorize, y encrypt.

Por ejemplo:

  • Una URL de RFCOMM del servidor:
    btspp://localhost:2D26618601FB47C28D9F10B8EC891363;authenticate=false; encrypt=false;name=MyBtService
  • Una URL de RFCOMM de cliente:
    btspp://0123456789AF:1;master=false;encrypt=false;authenticate=false

Utilizando localhost como nombre de host indica que desea una conexión al servidor. Para crear una conexión de cliente a un dispositivo y servicio conocidos, utilice la URL de conexión del servicio, que se encuentra en su ServiceRecord.

El manejo de conexiones L2CAP es más complicado que el manejo de conexiones de flujo; los desarrolladores deben lidiar con tamaños máximos de mensajes ( unidad de transmisión máxima, o MTU), y con dividir y reensamblar mensajes largos. Estas complejidades están ocultas a los desarrolladores que usan conexiones de transmisión, lo que las hace preferibles para la conectividad Bluetooth. Los ejemplos de código de este artículo solo cubren las conexiones de transmisión.

El siguiente fragmento de código muestra cómo crear una conexión de servidor RFCOMM:

...
// Bluetooth Service name
private static final String myServiceName = "MyBtService";
// Bluetooth Service UUID of interest
private static final String myServiceUUID = "2d26618601fb47c28d9f10b8ec891363";
private UUID MYSERVICEUUID_UUID = new UUID(myServiceUUID, false);
...
// Define the server connection URL
String connURL = "btspp://
localhost: "+MYSERVICEUUID_UUID.toString()+";"+name="+myServiceName;
...
// Create a server connection (a notifier)
StreamConnectionNotifier scn = (StreamConnectionNotifier)  
  Connector.open(connURL);                   
...
// Accept a new client connection
StreamConnection sc = scn
   .acceptAndOpen();                   
...
                

El siguiente fragmento de código muestra cómo crear una conexión de cliente a un servicio de interés determinado, utilizando su registro de servicio:

...
// Given a service of interest, get its service record
ServiceRecord sr = (ServiceRecord)discoveredServices.elementAt(i);
// Then get the service's connection URL
String connURL = sr
.getConnectionURL  (ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
// Open connection
StreamConnection sc = (StreamConnection)  
  Connector.open   (connURL);
...
                

Si está implementando su aplicación JABWT en teléfonos MIDP 2.0, debe solicitar los permisos apropiados antes de intentar conectarse, de lo contrario Connector.open() lanzará un SecurityException. Te diré cómo solicitar permisos más adelante, en el » Seguridad JABWT y MIDP 2.0″sección de este artículo.

Configurar un servidor Bluetooth

148310

Figura 4: Configuración de un servidor Bluetooth

Configura un servidor Bluetooth para que un servicio esté disponible para el consumo. Hay cuatro pasos principales:

  1. Creando un registro de servicio para el servicio que desea poner a disposición
  2. Agregar el nuevo registro de servicio a la base de datos de descubrimiento de servicios
  3. Registro del servicio
  4. Esperando conexiones de clientes entrantes

Dos operaciones relacionadas son significativas:

  • Modificar el registro de servicio, si es necesario cambiar los atributos del servicio que son visibles para los clientes
  • Cuando termine, elimine el registro de servicio de la SDDB.

Veamos cada una de estas operaciones de cerca.

Crear un registro de servicio

La implementación de Bluetooth crea automáticamente un registro de servicio cuando su aplicación crea un notificador de conexión, ya sea un StreamConnectionNotifier o un L2CAPConnectionNotifier.

Cada servicio y servicio de Bluetooth …

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

16JTC8VgeBr7YUnm9aWg Ow

Aprendizaje automático con R: predicción de abandono

img matplotlib pyplot

Pyplot de Matplotlib