studio scanner para libreria how ejemplo dispositivos detectar app android bluetooth bluetooth-lowenergy android-4.3-jelly-bean gatt

scanner - libreria bluetooth android



Android Bluetooth emparejamiento de baja energĂ­a (3)

Cómo emparejar un dispositivo Bluetooth Low Energy (BLE) con Android para leer datos encriptados.

Usando la información en la página de Android BLE , puedo descubrir el dispositivo, conectarme a él, descubrir servicios y leer características no encriptadas.

Cuando trato de leer una característica encriptada (una que hará que iOS muestre una ventana emergente pidiendo que se vincule y luego complete la lectura) obtengo un código de error 5 , que corresponde a la Autenticación insuficiente .

No estoy seguro de cómo emparejar el dispositivo o cómo proporcionar la información de autenticación para que se complete la lectura .

Jugué con BluetoothGattCharacteristics intentando agregar descriptores, pero tampoco funcionó.
¡Cualquier ayuda es apreciada!



Cuando obtiene el error GATT_INSUFFICIENT_AUTHENTICATION, el sistema inicia el proceso de vinculación por usted. En el siguiente ejemplo, intento habilitar notificaciones e indicaciones en el monitor de glucosa. Primero estoy habilitando las notificaciones sobre la característica de medición de glucosa que pueden hacer que aparezca el error.

@Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { if (GM_CHARACTERISTIC.equals(descriptor.getCharacteristic().getUuid())) { mCallbacks.onGlucoseMeasurementNotificationEnabled(); if (mGlucoseMeasurementContextCharacteristic != null) { enableGlucoseMeasurementContextNotification(gatt); } else { enableRecordAccessControlPointIndication(gatt); } } if (GM_CONTEXT_CHARACTERISTIC.equals(descriptor.getCharacteristic().getUuid())) { mCallbacks.onGlucoseMeasurementContextNotificationEnabled(); enableRecordAccessControlPointIndication(gatt); } if (RACP_CHARACTERISTIC.equals(descriptor.getCharacteristic().getUuid())) { mCallbacks.onRecordAccessControlPointIndicationsEnabled(); } } else if (status == BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION) { // this is where the tricky part comes if (gatt.getDevice().getBondState() == BluetoothDevice.BOND_NONE) { mCallbacks.onBondingRequired(); // I''m starting the Broadcast Receiver that will listen for bonding process changes final IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); mContext.registerReceiver(mBondingBroadcastReceiver, filter); } else { // this situation happens when you try to connect for the second time to already bonded device // it should never happen, in my opinion Logger.e(TAG, "The phone is trying to read from paired device without encryption. Android Bug?"); // I don''t know what to do here // This error was found on Nexus 7 with KRT16S build of Andorid 4.4. It does not appear on Samsung S4 with Andorid 4.3. } } else { mCallbacks.onError(ERROR_WRITE_DESCRIPTOR, status); } };

Donde el mBondingBroadcastReceiver es:

private BroadcastReceiver mBondingBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); final int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1); final int previousBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1); Logger.d(TAG, "Bond state changed for: " + device.getAddress() + " new state: " + bondState + " previous: " + previousBondState); // skip other devices if (!device.getAddress().equals(mBluetoothGatt.getDevice().getAddress())) return; if (bondState == BluetoothDevice.BOND_BONDED) { // Continue to do what you''ve started before enableGlucoseMeasurementNotification(mBluetoothGatt); mContext.unregisterReceiver(this); mCallbacks.onBonded(); } } };

Recuerde anular el registro del receptor de difusión al salir de la actividad. Puede que no haya sido desregistrado por el receptor mismo.


Es posible que deba comprobar el archivo Kernel smp.c, qué método de análisis invoca para realizar el análisis. 1) contraseña 2) Solo trabajo o etc. Supongo que si puede invocar MIMT y el nivel de seguridad paso a paso, no habrá ningún problema de autenticación. Asegúrese de que todos los indicadores estén configurados para invocar los métodos de clave de acceso de SMP. rastrear poniendo algo de impresión en el archivo smp.c.

Una solución que funciona en ICS: con la herramienta btmgmt en Android y enganchándola en las API de cifrado. con clave de acceso o cualquier otro método. funciona. Es posible que deba agregar las API de la clave de acceso en btmgmt desde el último código de bluez.