Cómo obtener datos de un dispositivo Bluetooth LE

Tengo un escáner de código de barras bluetooth que soporta bluetooth LE y estoy tratando de obtener la información de código de barras de ella cuando se escanea.

Puedo conectar con él bien onServicesDiscovered se llama en mi BluetoothGattCallback pero no estoy seguro de qué hacer desde allí.

Con una conexión bluetooth clásica obtendrías un InputStream de un BluetoothSocket y solo esperarías a que read() te diera datos pero no estoy seguro de cómo funciona con Bluetooth LE. Intenté hacer un bucle a través del BluetoothGattCharacteristic está comprobando la característica y si es una propiedad leída llamo gatt.readCharacteristic(characteristic); Pero eso sólo me da información inútil y eso es incluso antes de intentar escanear algo.

Entonces, ¿cómo puedo obtener los datos del código de barras del escáner?

Este es el escáner que tengo https://www.zebra.com/us/es/support-downloads/scanners/ultra-rugged-scanners/li3608-li3678.html

Los datos proporcionados por los dispositivos BLE se llaman Características . Estos paquetes de datos son conjuntos de bytes especialmente formados y firmemente empaquetados que codifican valores específicos para servicios específicos. Puede consultar los Servicios en el sitio web oficial de Bluetooth. Aquí encontrará los servicios definidos (con autoridad) del GATT y las características de pertenencia.

Por ejemplo, usted tiene una computadora BLE ciclista que informa de velocidad y cadencia. Busca el ítem de velocidad y cadencia de ciclismo en la lista. Esta entrada contiene el UUID (0x1816) del servicio y un enlace a la hoja de datos que contiene las características. Ahora, si va a la tabla de características del servicio , encontrará un par de entradas. Desea la velocidad y la cadencia, por lo que abrirá CSC Measurement (el campo Tipo de la entrada) que le llevará a la hoja de datos de la característica. Aquí verá la tabla Campos de valores que define los valores específicos que se pueden leer de la característica.

Esta era la parte Bluetooth LE en general, ahora de nuevo a Android. Tenga en cuenta que tendrá que buscar estos campos para obtener los valores de las características. Sólo voy a suponer que ya tiene la característica de la que desea obtener los datos. Aquí hay una muestra rápida que recupera las revoluciones de la rueda y la manivela (si está disponible).

 BluetoothGattCharacteristic characteristic = ... ; int offset = 0; // we define the offset that is to be used when reading the next field // FORMAT_* values are constants in BluetoothGattCharacteristic // these represent the values you can find in the "Value Fields" table in the "Format" column int flags = characteristic.getIntValue(FORMAT_UINT8, offset); offset += 1; // UINT8 = 8 bits = 1 byte // we have to check the flags' 0th bit to see if C1 field exists if ((flags & 1) != 0) { int cumulativeWheelRevolutions = characteristic.getIntValue(FORMAT_UINT32, offset); offset += 4; // UINT32 = 32 bits = 4 bytes int lastWheelEventTime = characteristic.getIntValue(FORMAT_UINT16, offset); offset += 2; // UINT16 = 16 bits = 2 bytes } // we have to check the flags' 1st bit to see if C2 field exists if ((flags & 2) != 0) { int cumulativeCrankRevolutions = characteristic.getIntValue(FORMAT_UINT16, offset); offset += 2; int lastCrankEventTime = characteristic.getIntValue(FORMAT_UINT16, offset); offset += 2; } 

El campo flags debe ser revisado para detectar bits específicos, ya que es posible que el dispositivo no informe todos los tipos de datos, por ejemplo, no cuenta las revoluciones de la rueda. La hoja de la característica seleccionada siempre contiene la información relevante sobre este campo (si existe).

También vale la pena señalar que la documentación dice que

La característica CSC Measurement (CSC se refiere a la velocidad y la cadencia del ciclismo) es una estructura de longitud variable que contiene un campo Flags y, en función del contenido del campo Flags, puede contener uno o más campos adicionales […]

Esta es la razón por la cual no se puede suponer que el valor acumulado de las revoluciones de la manivela se encuentre en el offset de 7 bytes ( 8 + 32 + 16 bits, 1 + 4 + 2 bytes, respectivamente ) y el desplazamiento debe ser contado a medida que avanza a lo largo de los campos.


Este fue un ejemplo para leer los valores de Velocidad de ciclo y Cadencia de un dispositivo BLE. Tendrá que buscar estos campos y valores disponibles para cada dispositivo (o mejor dicho, el servicio) que desee admitir en su aplicación. Si el dispositivo es especial y no se puede encontrar en este directorio del GATT, necesitará consultar el manual del dispositivo, el SDK o el proveedor para obtener más información.

  • La ubicación debe estar habilitada para Bluetooth Low Energy Scanning en Android 6.0
  • Si se crea un vínculo con un dispositivo Bluetooth LE
  • Combine iBeacon bluetooth de baja energía con Android 4.3
  • Conexiones Bluetooth y Bluetooth LE simultáneas, ¿es posible?
  • ¿Cómo obtener RSSI sin conexión al dispositivo BLE?
  • Cómo forzar Bluetooth LE "Just Works" Emparejamiento en Android
  • Conexión automática a un dispositivo BLE conocido
  • Android Bluetooth status 133 en onCharacteristicwrite
  • ¿Cómo usar LeDeviceListAdapter al intentar encontrar dispositivos BLE?
  • BluetoothGatt que muestra 10.000 características idénticas para el servicio
  • ¿Por qué la aplicación no se vuelve a conectar al dispositivo BLE cuando se configura autoConnect como true en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.