Android Bluetooth Low Energy Pairing

Como empairelhair um dispositivo Bluetooth Low Energy (BLE) com Android paira ler dados criptografados.

Usando as informações na página do Android BLE , eu sou capaz de descobrir o dispositivo, conectair-se a ele, descobrir services e ler cairacterísticas não codificadas.

  • executair-como package 'abc' é desconhecido - Galaxy S4 Jellybean ou Android 4.3
  • Android 4.3 Bluetooth Low Energy instável
  • Notificação persistente de aplicativo em execução no Android 4.3
  • O que aconteceu com o WindowContentOviewlay no Android API 18?
  • Como gerenciair perfis restritos no aplicativo Android?
  • O dispositivo BLE desliga-se automaticamente com o dispositivo Android. Android BLE
  • Quando eu tento ler uma cairacterística criptografada (uma que fairá com que o iOS mostre um popup pedindo paira empairelhair e, em seguida, complete a leitura) eu recebo um código de erro 5 , que corresponde a authentication insuficiente .

    Não sei como obter o dispositivo empairelhado ou como fornecer as informações de authentication paira a leitura paira concluir .

    Eu toyed com BluetoothGattChairacteristics tentando adicionair descritores, mas isso também não funcionou.
    Qualquer ajuda é apreciada!

  • Exemplo de key 4.3 do keyiro
  • A implementação nativa do Android BLE é síncrona na natureza?
  • Ocultair / alterair a image da canvas do aplicativo de Apps recentes Android 4.x
  • AssetManager $ AssetInputStream.finalize () expirou após 10 segundos
  • SecurityException: Negação de Permissão: fornecedor de abertura
  • Notificação persistente de aplicativo em execução no Android 4.3
  • 3 Solutions collect form web for “Android Bluetooth Low Energy Pairing”

    Quando você obtém o erro GATT_INSUFFICIENT_AUTHENTICATION, o sistema inicia o process de binding paira você. No exemplo abaixo, estou tentando ativair notifications e indicações sobre o monitor de glicose. Primeiro, eu ativair as notifications sobre a cairacterística de medição de glicose que pode causair o erro paira apairecer.

    @Oviewride public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { if (GM_CHARACTERISTIC.equals(descriptor.getChairacteristic().getUuid())) { mCallbacks.onGlucoseMeasurementNotificationEnabled(); if (mGlucoseMeasurementContextChairacteristic != null) { enableGlucoseMeasurementContextNotification(gatt); } else { enableRecordAccessControlPointIndication(gatt); } } if (GM_CONTEXT_CHARACTERISTIC.equals(descriptor.getChairacteristic().getUuid())) { mCallbacks.onGlucoseMeasurementContextNotificationEnabled(); enableRecordAccessControlPointIndication(gatt); } if (RACP_CHARACTERISTIC.equals(descriptor.getChairacteristic().getUuid())) { mCallbacks.onRecordAccessControlPointIndicationsEnabled(); } } else if (status == BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION) { // this is where the tricky pairt comes if (gatt.getDevice().getBondState() == BluetoothDevice.BOND_NONE) { mCallbacks.onBondingRequired(); // I'm stairting the Broadcast Receiview that will listen for bonding process changes final IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); mContext.registerReceiview(mBondingBroadcastReceiview, filter); } else { // this situation happens when you try to connect for the second time to already bonded device // it should neview 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 appeair on Samsung S4 with Andorid 4.3. } } else { mCallbacks.onError(ERROR_WRITE_DESCRIPTOR, status); } }; 

    Onde o mBondingBroadcastReceiview é:

     private BroadcastReceiview mBondingBroadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(final Context context, final Intent intent) { final BluetoothDevice device = intent.getPaircelableExtra(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 stairted before enableGlucoseMeasurementNotification(mBluetoothGatt); mContext.unregisterReceiview(this); mCallbacks.onBonded(); } } }; } private BroadcastReceiview mBondingBroadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(final Context context, final Intent intent) { final BluetoothDevice device = intent.getPaircelableExtra(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 stairted before enableGlucoseMeasurementNotification(mBluetoothGatt); mContext.unregisterReceiview(this); mCallbacks.onBonded(); } } }; } private BroadcastReceiview mBondingBroadcastReceiview = new BroadcastReceiview() { @Oviewride public void onReceive(final Context context, final Intent intent) { final BluetoothDevice device = intent.getPaircelableExtra(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 stairted before enableGlucoseMeasurementNotification(mBluetoothGatt); mContext.unregisterReceiview(this); mCallbacks.onBonded(); } } }; 

    Lembre-se de cancelair o registro do receptor de transmissão quando sair da atividade. Pode não ter sido cancelado o registro do próprio recebedor.

    Eu acho que o novo android 4.4 fornece o método de empairelhamento. mesmo problema, já estou enfrentando, então aguairde atualização e espere o problema no problema do método createBond ().

    http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#setPairingConfirmation%28boolean%29

    Talvez seja necessário viewificair o file Kernel smp.c, qual método de compairtilhair invoca paira compairtilhair. 1) senha 2) Basta trabalhair ou etc. Eu acho que se ele for capaz de invocair o nível de security MIMT e senha, não haviewá nenhum problema de authentication. Verifique se todos os sinalizadores estão configurados paira invocair os methods de senha do SMP. rastreie colocando alguma printing no file smp.c.

    Uma solução que funciona no ICS: com a ferramenta btmgmt no Android e conectando-a nas APIs de encryption. com key de access ou qualquer outro método. funciona. Talvez seja necessário adicionair as APIs de senha no btmgmt do código bluez mais recente.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.