Cómo forzar Bluetooth LE "Just Works" Emparejamiento en Android
Tengo un sistema embebido que funciona un servidor del GATT que estoy intentando conectar con vía Android. La tarea es simple: conectarse al servidor GATT, navegar por características y validar las capacidades de lectura / escritura. El problema es que cuando intento conectarme con una aplicación de Android, intento emparejar con una "contraseña" en lugar de con "Just Works" [ https://developer.bluetooth.org/TechnologyOverview/Pages/LE-Security.aspx] . Esto no es aceptable ya que mi dispositivo incrustado no tiene ningún método para mostrar una clave que el usuario pueda usar para emparejar. Así que el método de conexión debe ser Just Works.
He probado numerosas aplicaciones de Play Store y todas ellas sólo intentan emparejarme con Passkey. Pero este es el actual con el que estoy trabajando: https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner
- Análisis pasivo de Android BLE
- Android 4.3 BLE cómo escribir Característica
- Fuerza de la señal de Bluetooth LE continua en Android
- ¿Cómo obtener RSSI sin conexión al dispositivo BLE?
- Android BLE: recuperar el servicio UUID en la devolución de llamada onLeScan () cuando se anuncia desde iOS Peripheral
Tengo esto trabajando con la aplicación LightBlue (compatible con OS X e iOS). Así que sé que mi periférico (servidor GATT) está funcionando: publicidad, conectable, característica accesible, etc.
¿Cómo obligar a Android a utilizar Just Works en lugar de emparejar Passkey? ¿Hay una configuración periférica que me falta?
Gracias
- Conexión Bluetooth con Android
- Android BLE inesperada y repetidamente se vuelve a conectar a dispositivos periféricos
- Android 4.3: BLE: Comportamiento de filtrado de startLeScan ()
- Conexión automática a un dispositivo BLE conocido
- BluetoothDevice.ConnectGatt () con el parámetro de transporte
- Cómo obtener datos de un dispositivo Bluetooth LE
- Bluetooth LE Error 133 activa la desconexión
- ¿Cuál es la duración de la exploración en api del mensaje cercano de google?
La raíz del problema era el modo en el que se encontraba la interfaz de Linux. Los dispositivos Bluetooth que admiten BR / EDR (Classic) y LE por defecto se encuentran en modo dual. Es decir, pueden funcionar como un dispositivo Classic o LE. No tengo información sobre la API de Android y no he intentado desarrollar una aplicación de Android que pueda detectar un dispositivo de modo dual y elegir conectarse como LE con el uso de Just Working. Pero pude desactivar el BR / EDR en la interfaz y validar que Android lo detectó durante la exploración como una interfaz única (modo único). La aplicación de Android se conectó a la perfección con el uso de Just Working.
He aquí cómo deshabilité BR / EDR en la interfaz:
$ sudo hciconfig hci0 down $ sudo ./btmgmt bredr off hci0 Set BR/EDR complete, settings: connectable bondable le $ sudo hciconfig hci0 up $ sudo hciconfig hci0 leadv
Puede crear la aplicación btmgmt en Linux descargando y construyendo Bluez. La aplicación btmgmt se construye condicionalmente en el parámetro de configuración --enable-experimental
.
ACTUALIZACIÓN: En lugar de modificar las capacidades de la interfaz, se modifica las capacidades de la interfaz difundida. Esto se hace a través de las banderas de anuncio. Modifique los indicadores para emitir que BR / EDR no es compatible. Este es el bit 2 y crearía una emisión de banderas de 0x04. (Ver Bluetooth SIG doc CSS v4: Parte A, Sección 1.3.2)
- Uso de ListView, quitar en adaptador siempre elimina el último elemento
- Icono de lanzador de Android demasiado pequeño