如何使用Android

时间:2016-07-06 17:58:23

标签: android bluetooth-lowenergy characteristics

我正在开发一款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);

无论我做什么,我只得到速度数据。如果我改变两个块的顺序,我只获得加速度,但不再有速度数据。

我要做什么才能同时订阅许多特征?

提前致谢

雷托

2 个答案:

答案 0 :(得分:2)

要让描述符一个接一个地写,请在开始下一个描述符之前等待描述符写回调。

答案 1 :(得分:0)

对于所有未来的读者,以下是如何做到这一点:

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