2016-07-06 2 views
1

Я разрабатываю приложение для Android, которое должно подписаться на несколько характеристик BLE.Как подписаться на несколько характеристик BluetoothLE с Android

Но что бы я ни делал, я получаю только обновленные значения от одного признака.

Вот код:

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

Все, что я могу получить только данные о скорости. Если я изменю порядок двух блоков, я получаю только ускорение, но не больше данных о скорости.

Что мне делать, чтобы сразу подписаться на многие характеристики?

Заранее спасибо

Рето

+0

Не могли бы вы попробовать ждать обратного вызова onDescriptorWrote из первого блока, прежде чем попытаться установить второй? – Zomb

+0

Это хороший намек, на самом деле он решил мою проблему. Спасибо большое! – retokiefer

+0

Я добавлю его в качестве ответа, чтобы другие могли его найти! – Zomb

ответ

2

Чтобы получить дескрипторы, чтобы написать один за другим, пожалуйста, дождитесь обратного вызова из дескриптора записи перед началом следующего.

+0

Можете добавить код для этого? Было бы очень полезно! спасибо – Nick

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); 
} 
Смежные вопросы