Android BLE:成功将 ENABLE_NOTIFICATION_VALUE 值写入 BluetoothGattDescriptor 但 onCharacteristicChanged 从未触发
Android BLE: Successfully write ENABLE_NOTIFICATION_VALUE value to BluetoothGattDescriptor but onCharacteristicChanged never fires
我有一个 BLE 外围设备,可以在 iOS 和 Android 7.0 上与给定的服务/特征 UUID 一起正常工作。在 Android 6.0 Marshmallow 上,尽管在描述符上设置了 ENABLE_NOTIFICATION_VALUE,但 onCharacteristicChanged 方法不会触发。请帮我弄清楚如何让 Android 设备 运行 Android OS 6.0 Marshmallow 触发 onCharacteristicChanged。这是我用来尝试让通知正常工作的代码:
boolean success = mBluetoothGatt.setCharacteristicNotification(characteristic, true);
Log.e(TAG, "set char notification = " + (success ? "It worked :)" : "It did not work :("));
if (UUID_DATA_PACKET.equals(characteristic.getUuid())) {
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString(EkoCoreGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
success = mBluetoothGatt.writeDescriptor(descriptor);
Log.e(TAG, "set descriptor = " + descriptor.getCharacteristic().getWriteType() + ", success = " + (success ? "It worked :)" : "It did not work :("));
}
在上面的代码中,setCharacteristicNotification 和 writeDescriptor 都调用 return 成功(1 / true / 等)。此外,onDescriptorWrite 回调 returns GATT_SUCCESS。然而,当我们稍后在代码中读取描述符时,发现通知值仍设置为禁用。我们已经尝试了许多解决方案,例如在 setCharacteristicNotification 和 writeDescriptor 调用之间设置延迟,但尚未找到解决此问题的方法。与有问题的外围设备配对没有问题,但似乎不可能收到通知。如有任何提示,我们将不胜感激。
在编写描述符之前添加以下内容解决了我的问题:
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
显然 Android 6 中存在一些错误。我希望这个答案对其他人有所帮助。找起来很头疼。
我有一个 BLE 外围设备,可以在 iOS 和 Android 7.0 上与给定的服务/特征 UUID 一起正常工作。在 Android 6.0 Marshmallow 上,尽管在描述符上设置了 ENABLE_NOTIFICATION_VALUE,但 onCharacteristicChanged 方法不会触发。请帮我弄清楚如何让 Android 设备 运行 Android OS 6.0 Marshmallow 触发 onCharacteristicChanged。这是我用来尝试让通知正常工作的代码:
boolean success = mBluetoothGatt.setCharacteristicNotification(characteristic, true);
Log.e(TAG, "set char notification = " + (success ? "It worked :)" : "It did not work :("));
if (UUID_DATA_PACKET.equals(characteristic.getUuid())) {
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString(EkoCoreGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
success = mBluetoothGatt.writeDescriptor(descriptor);
Log.e(TAG, "set descriptor = " + descriptor.getCharacteristic().getWriteType() + ", success = " + (success ? "It worked :)" : "It did not work :("));
}
在上面的代码中,setCharacteristicNotification 和 writeDescriptor 都调用 return 成功(1 / true / 等)。此外,onDescriptorWrite 回调 returns GATT_SUCCESS。然而,当我们稍后在代码中读取描述符时,发现通知值仍设置为禁用。我们已经尝试了许多解决方案,例如在 setCharacteristicNotification 和 writeDescriptor 调用之间设置延迟,但尚未找到解决此问题的方法。与有问题的外围设备配对没有问题,但似乎不可能收到通知。如有任何提示,我们将不胜感激。
在编写描述符之前添加以下内容解决了我的问题:
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
显然 Android 6 中存在一些错误。我希望这个答案对其他人有所帮助。找起来很头疼。