安卓蓝牙低能耗配对



如何将蓝牙低能耗(BLE)设备与Android配对以读取加密数据。

使用Android BLE页面中的信息,我可以发现设备,连接到它,发现服务并读取未加密的特征。

当我尝试读取加密特征(这将导致iOS显示一个弹出窗口,要求配对,然后完成读取)时,我收到一个错误代码5,对应于身份验证不足。

我不确定如何使设备配对,或如何提供身份验证信息以完成读取

我通过尝试添加描述符来玩弄BluetoothGattCharacterics,但这也不起作用
感谢您的帮助!

当您得到GATT_INSUFICIENT_AUTHENTICATION错误时,系统会为您启动绑定过程。在下面的例子中,我试图在葡萄糖监测仪上启用通知和指示。首先,我启用了葡萄糖测量特性的通知,这可能会导致出现错误。

@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);
        }
    };

mBondingBroadcastReceiver所在位置:

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();
        }
    }
};

请记住,在退出活动时注销广播接收器。它可能没有被收款人自己注销。

您可能需要检查Kernel smp.c文件,它调用哪种配对方法进行配对。1) passkey 2)只是工作等。我想如果它能够调用MIMT和密钥级别的安全性,就不会有任何身份验证问题。确保所有标志都设置为调用SMP密钥方法。通过在smp.c文件中放入一些打印来跟踪。

一个在ICS中工作的解决方案:在android中使用btmgmt工具,并将其挂接在加密API中。使用密钥或任何其他方法。它是有效的。您可能需要从最新的bluez代码中添加btmgmt中的密钥API。

我认为新的android 4.4提供了配对方法。我已经面临同样的问题,所以等待更新并希望问题解决createBond()方法。

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

相关内容

  • 没有找到相关文章