Detectar si un dispositivo BLE puede conectarse en Android

Estoy trabajando en un proyecto para configurar balizas. Una cierta cantidad de tiempo después de ser encendido, un faro se vuelve inconfigurable hasta que es el ciclo de energía. Con el fin de mostrar una lista de las balizas configurables, estoy buscando ciertas características (nombre del dispositivo Bluetooth, ciertos datos del fabricante en el paquete de publicidad). También necesito saber si es "conectable", es decir si el tipo de PDU en el paquete publicitario de BLE para el dispositivo indica que es conectable. He buscado en las clases de Android Bluetooth alta y baja, tanto en Android 4.X y 5.X y no he podido encontrar nada que me diga esta información.

Me doy cuenta de que una forma de determinar la conectividad de la baliza es conectarse a ella, por ejemplo: device.connectGatt(...) . Sin embargo, he visto que tomar más de dos minutos a veces antes de una devolución de llamada a onConnectionStateChange vuelve con STATE_DISCONNECTED . Además, puede haber muchas de estas balizas en un entorno, y la conexión a cada uno de los que podría ser configurable sería ineficiente.

El equivalente de iOS de este atributo se puede encontrar en el diccionario de advertisementData bajo la clave CBAdvertisementDataIsConnectable en el método de devolución de llamada centralManager:didDiscoverPeripheral:advertisementData:RSSI .

Por lo tanto, la pregunta es: ¿hay alguna manera en Android para determinar si un dispositivo BLE es o no "conectable" de los datos publicitarios o resultados de escaneo o …?

2 Solutions collect form web for “Detectar si un dispositivo BLE puede conectarse en Android”

ACTUALIZACIÓN: A partir de las API finalizadas en el SDK de Android, la clase ScanResult (que se agrega a partir de Android 5.0) ahora tiene el método isConnectable() . La detección de anuncios conectables sólo es posible en Android 8.0+. Vea aquí para más información: https://developer.android.com/reference/android/bluetooth/le/ScanResult.html#isConnectable ()

Antes de Android 8.0, por desgracia, no es posible.

Un anuncio conectable está determinado por el byte 0 del encabezado PDU. Puede ver esto en la estructura de ejemplo a continuación:

 d6 be 89 8e # Access address for advertising data (this is always the same fixed value) 40 # Advertising Channel PDU Header byte 0. Contains: (type = 0), (tx add = 1), (rx add = 0) 24 # Advertising Channel PDU Header byte 1. Contains: (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.) 05 a2 17 6e 3d 71 # Bluetooth Mac 

El problema está en los dispositivos anteriores a Anroid 8.0, las API de análisis de Android no le dan acceso a estos encabezados. Obtiene exactamente tres campos en la devolución de llamada de Android 4.x:

 onLeScan(BluetoothDevice device, rssi, byte[] scan data) 

La matriz de bytes de datos de exploración comienza después de los bytes de encabezado mencionados anteriormente. Y por lo que puedo ver de la definición BluetoothDevice , ninguno de los campos o métodos le dicen si es un anuncio conectable – la clase es sólo un contenedor para la dirección MAC bluetooth con métodos para ejercer funciones en la pila bluetooth. Y no hay métodos en IBluetooth.aidl que es la interfaz privada a la pila bluetooth (y lo que llama BluetoothDevice para obtener su información) que puede obtener esta bandera.

Parece que esta información no se pasa a la capa Java de la pila de BlueDroid antes de Android 8.0.

Debería ser posible, ya que el Panel de Control NRF de Nordic hace esto.

Después de algunas excavaciones creo que sé cómo lo hace. No estoy seguro de que es la manera correcta de hacerlo aunque.

He intentado usar el publicista de LE y fijar el dispositivo como conectable. En la aplicación nórdica, un dispositivo se establece como conectable dependiendo de los bytes encontrados en scanResult.getFlags ().

He encontrado que este código funciona para mis dispositivos:

 int flags = scanResult.getScanRecord().getAdvertiseFlags(); if ((flags & 2) == 2) { //connectable } 
  • Android Bluetooth status 133 en onCharacteristicwrite
  • Estado de Android Bluetooth 133 en gatt.readCharacteristic
  • Navegación en interiores y seguimiento de personas usando BLE
  • Lectura Bluetooth RSSI para perfil de proximidad BLE en Android
  • Parámetros de conexión de baja energía de Bluetooth para Android, iOS y Win8
  • Datos de BLE fuera de banda de Android
  • ¿Es posible conectar iOS y dispositivos Android con Bluetooth?
  • BluetoothAdapter.startScan () vs BluetoothAdapter.startLeScan ()
  • Android 4.0.4 BLE API, BroadCom - Motorola
  • UUID y MACAddress para Bluetooth BLE
  • Cifrado de baja energía de Bluetooth y seguridad de datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.