Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Desarrolle una aplicación Android
  3. Uso de Bluetooth Low Energy
Extrait - Desarrolle una aplicación Android Programación en Java con Android Studio
Extractos del libro
Desarrolle una aplicación Android Programación en Java con Android Studio
1 opinión
Volver a la página de compra del libro

Uso de Bluetooth Low Energy

Presentación de Bluetooth Low Energy

Los objetos conectados empiezan a invadir nuestro espacio cotidiano: desde el simple sensor de temperatura hasta el brazalete capaz de medir la actividad física de su usuario, pasando por los altavoces portátiles, la mayoría de estos nuevos dispositivos requieren un smartphone (o una tableta) para poder funcionar. En la gran mayoría de casos, se utiliza Bluetooth Low Energy (BLE, en el resto de este capítulo) para realizar estas comunicaciones de corta distancia. Esta norma, establecida por la compañía Nokia en 2006 a partir de la norma Bluetooth, posee en efecto muchas ventajas: un consumo de energía controlado, una distancia de comunicación relativamente importante (casi 100 m en un espacio abierto) y una implementación (relativamente) sencilla.

Este capítulo abandona temporalmente la aplicación LocDVD para abordar una pequeña aplicación que va a detectar un objeto BLE, conectarse a él e intercambiar información.

Como ocurre a menudo en informática, varios fabricantes han decidido implementar protocolos específicos para la conexión con objetos BLE: ya sea el formato iBeacons de Apple o EddyStone de Google, estos protocolos se basan en la norma Bluetooth Low Energy.

En vez de decidirse por uno de estos formatos (EddyStone es el formato preferido para la plataforma Android), este capítulo presenta...

Detectar un dispositivo BLE

Para intercambiar información con un objeto BLE, se requieren varias etapas:

  • Que el terminal Android descubra el objeto.

  • El establecimiento de la conexión entre el objeto BLE y el terminal.

  • Por último, la lectura y la escritura de información; estas etapas están compuestas, por su parte, de varias subetapas que detallaremos más adelante.

Esta sección presenta la primera etapa, que va a lanzar un análisis Bluetooth para detectar un objeto BLE.

1. Preparación del proyecto

Lo primero que hay que hacer es crear una nueva aplicación con Android Studio; esta aplicación, muy simple, contendrá una única pantalla y estará destinada a terminales equipados con Android 4.3 o superior: la norma BLE no es compatible con las versiones anteriores de Android.

 Cree un nuevo proyecto Android Studio, llamado BLE, y con el dominio ejemplo.com.

 Este proyecto debe ser compatible con smartphones y tabletas a partir de la versión Android 4.3 (Jelly bean, API 18).

 La plantilla seleccionada es «Empty Activity» que utiliza, como LocDVD, la biblioteca de soporte V7: la actividad principal, MainActivity, hereda de AppCompatActivity.

Una vez terminado el asistente de creación del proyecto, Android Studio presenta una clase MainActivity y su archivo de layout asociado, activity_main.xml.

La interfaz de la aplicación es muy simple: en primer lugar, una zona de texto presenta el nombre y la dirección del objeto BLE detectado. Esta zona de texto debe permitir mostrar varias líneas.

El layout correspondiente es, por ejemplo, el siguiente:


<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:layout_margin="8dp">  
    <TextView  
        android:id="@+id/main_text"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"/>  
</LinearLayout>...

Conectar un objeto

Para poder interactuar con un objeto BLE, el terminal Android y el objeto deben estar emparejados. Un objeto BLE solo puede emparejarse a un único terminal a la vez: esta fase es, hablando con propiedad, la fase de conexión.

En el contexto de la aplicación, la conexión se lanza automáticamente cuando se detecta un objeto BLE.

La conexión se realiza mediante la instancia de BluetoothDevice obtenida en la sección anterior tras la fase de descubrimiento. Para ello, BluetoothDevice expone el método connectGatt, que recibe los siguientes parámetros:

  • Context context: el contexto de ejecución. Típicamente, la actividad en curso.

  • boolean autoConnect: indicador que permite especificar si la conexión debe hacerse inmediatamente (falso) o automáticamente cuando se ha detectado el objeto.

  • BluetoothGattCallback bluetoothGattCallback: este objeto se utiliza durante el intercambio de información entre el terminal y el objeto BLE. Expone varios métodos, cada uno correspondiente a una fase (o un estado) del proceso de comunicación.

El método connectGatt devuelve un objeto BluetoothGatt, del que se conserva una referencia en la clase MainActivity.

El acrónimo Gatt aparece en todos los nombres de las clases que permiten la comunicación Bluetooth Low Energy. Significa Generic Attribute Profil;, este término representa el conjunto de normas que rigen la comunicación entre dispositivos BLE.

 La llamada al método connectGatt se hace una vez se ha detectado el objeto BLE: por ejemplo, en el método onDeviceDetected. Previamente, hay que definir un objeto BluetoothGattCallback en la clase MainActivity. Sitúese tras el método onDeviceDetected y defina una instancia de BluetoothGattCallback: Android Studio debe, cuando escribe new...

Leer una característica

Una vez conectado el objeto BLE, ahora es posible intercambiar datos con el terminal Android.

En la norma Bluetooth Low Energy, los datos de un objeto se llaman características (characteristics en inglés). Las características se agrupan por servicio. Las características y los servicios se identifican por un UUID (Universally Unique Identifier), el conjunto lo define el consorcio Bluetooth.

Los UUID de los servicios y de las características se construyen según el siguiente principio:

  • El formato general de los UUID es fijo: 0000xxxx-0000-1000-8000-00805f9b34fb

  • El consorcio Bluetooth define, para cada servicio y cada característica de la norma, un número de cuatro bytes, que reemplaza a las xxxx en el formato general.

Así, por ejemplo, el servicio Battery Level, que contiene la característica del mismo nombre que permite conocer el nivel de carga de la batería del objeto conectado, posee el número 0x180F: su UUID es, por tanto, 0000180f-0000-1000-8000-00805f9b34fb.

El consorcio presenta la lista de servicios y de características de la norma en las siguientes direcciones:

La siguiente tabla es un extracto de la lista de servicios presentados por el consorcio.

images/15EI01N.png

Conviene utilizar solo letras minúsculas para los UUID: si bien las mayúsculas se admiten a veces, la plataforma Android aplica reglas estrictas relativas a los UUID y solo acepta minúsculas.

La aplicación debe, una vez conectada, mostrar el nivel de carga de la batería del objeto. De modo que, según la norma, hay que leer la característica número 0x2A19 (el UUID es, entonces, 00002a19-0000-1000-8000-00805f9b34fb), característica que pertenece al servicio 0x180F.

No es posible leer una característica directamente, ni direccionar un servicio: hay que pasar por un proceso de descubrimiento de servicios y, para el servicio o los servicios correspondientes, recorrer la lista de características expuestas para obtener una referencia a cada característica que se desee leer (o escribir).

El objeto BluetoothGatt, que se obtiene con la llamada al método connectGatt permite lanzar el descubrimiento de los servicios, exponiendo el método...

Escribir una característica

De la misma manera que solo es posible leer las características de un objeto BLE si está conectado, es posible escribir valores en las características únicamente cuando el objeto se encuentra conectado al terminal Android.

El proceso que debe implementarse es exactamente el mismo: en primer lugar, hay que lanzar un descubrimiento de servicios y, a continuación, una vez encontrado el servicio, iterar sobre las características del servicio.

La única diferencia se produce cuando se encuentra la característica deseada: en lugar de invocar el método readCharacteristic del objeto BluetoothGatt, hay que invocar el método writeCharacteristic.

Este método recibe un único parámetro, que es la característica en cuestión (es decir, el objeto BluetoothGattCharacteristic visto anteriormente).

En efecto, hay que asignar el valor correspondiente a la característica. Esto se hace invocando alguna de las variantes del método setValue, variantes que proponen distintos tipos de datos: array de bytes, entero, cadena de caracteres.

Una vez escrito el dato, se utiliza, de nuevo, el objeto BluetoothGattCallback para conocer el resultado de la escritura, mediante el método para sobrecargar onCharacteristicWrite, método cuya firma es idéntica a la del método onCharacteristicRead.

Antes de terminar este capítulo...