如何使用 Android 订阅多个 BluetoothLE 特性
How to subscribe to multiple BluetoothLE Characteristics with Android
我正在开发一个 Android 应用程序,它应该订阅多个 BLE 特性。
但是无论我做什么,我只收到一个特征的更新值。
代码如下:
BluetoothGattCharacteristic characteristicVel = gatt.getService(BleDefinedUUIDs.Service.KOMMMODUL_SERVICE).getCharacteristic(BleDefinedUUIDs.Characteristic.VELOCITY);
gatt.setCharacteristicNotification(characteristicVel, true);
BluetoothGattDescriptor descriptorVel = characteristicVel.getDescriptor(
BleDefinedUUIDs.Descriptor.CHAR_CLIENT_CONFIG);
descriptorVel.setValue(BleDefinedUUIDs.Descriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptorVel);
BluetoothGattCharacteristic characteristicAcc = gatt.getService(BleDefinedUUIDs.Service.KOMMMODUL_SERVICE).getCharacteristic(BleDefinedUUIDs.Characteristic.ACCELERATION);
gatt.setCharacteristicNotification(characteristicAcc, true);
BluetoothGattDescriptor descriptorAcc = characteristicAcc.getDescriptor(
BleDefinedUUIDs.Descriptor.CHAR_CLIENT_CONFIG);
descriptorAcc.setValue(BleDefinedUUIDs.Descriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptorAcc);
无论我做什么,我都只能得到速度数据。如果我改变这两个块的顺序,我只会得到加速度,而不会得到更多的速度数据。
一次订阅多个特征需要做什么?
提前致谢
雷托
要让描述符一个接一个地写入,请在开始下一个之前等待描述符写入的回调。
对于所有未来的读者,这里是如何做的:
List<BluetoothGattCharacteristic> characteristics = GetCharacteristicsWithNotifications(gatt);
subscribeToCharacteristics(gatt);
private void subscribeToCharacteristics(BluetoothGatt gatt) {
if(characteristics.size() == 0) return;
BluetoothGattCharacteristic characteristic = notifyCharacteristics.get(0);
gatt.setCharacteristicNotification(characteristic, true);
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
UUID uuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(uuid);
if(descriptor != null) {
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
}
}
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
super.onDescriptorWrite(gatt, descriptor, status);
characteristics.remove(0);
subscribeToCharacteristics(gatt);
}
我正在开发一个 Android 应用程序,它应该订阅多个 BLE 特性。
但是无论我做什么,我只收到一个特征的更新值。
代码如下:
BluetoothGattCharacteristic characteristicVel = gatt.getService(BleDefinedUUIDs.Service.KOMMMODUL_SERVICE).getCharacteristic(BleDefinedUUIDs.Characteristic.VELOCITY);
gatt.setCharacteristicNotification(characteristicVel, true);
BluetoothGattDescriptor descriptorVel = characteristicVel.getDescriptor(
BleDefinedUUIDs.Descriptor.CHAR_CLIENT_CONFIG);
descriptorVel.setValue(BleDefinedUUIDs.Descriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptorVel);
BluetoothGattCharacteristic characteristicAcc = gatt.getService(BleDefinedUUIDs.Service.KOMMMODUL_SERVICE).getCharacteristic(BleDefinedUUIDs.Characteristic.ACCELERATION);
gatt.setCharacteristicNotification(characteristicAcc, true);
BluetoothGattDescriptor descriptorAcc = characteristicAcc.getDescriptor(
BleDefinedUUIDs.Descriptor.CHAR_CLIENT_CONFIG);
descriptorAcc.setValue(BleDefinedUUIDs.Descriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptorAcc);
无论我做什么,我都只能得到速度数据。如果我改变这两个块的顺序,我只会得到加速度,而不会得到更多的速度数据。
一次订阅多个特征需要做什么?
提前致谢
雷托
要让描述符一个接一个地写入,请在开始下一个之前等待描述符写入的回调。
对于所有未来的读者,这里是如何做的:
List<BluetoothGattCharacteristic> characteristics = GetCharacteristicsWithNotifications(gatt);
subscribeToCharacteristics(gatt);
private void subscribeToCharacteristics(BluetoothGatt gatt) {
if(characteristics.size() == 0) return;
BluetoothGattCharacteristic characteristic = notifyCharacteristics.get(0);
gatt.setCharacteristicNotification(characteristic, true);
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
UUID uuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(uuid);
if(descriptor != null) {
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
}
}
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
super.onDescriptorWrite(gatt, descriptor, status);
characteristics.remove(0);
subscribeToCharacteristics(gatt);
}