2016-07-06 6 views
1

Je développe une application Android qui devrait souscrire à plusieurs caractéristiques BLE.Comment s'abonner à plusieurs caractéristiques BluetoothLE avec Android

Mais quoi que je fasse, je ne reçois que les valeurs mises à jour d'une caractéristique.

Voici le code:

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

Tout ce que je fais je reçois que les données de vitesse. Si je change l'ordre des deux blocs, je n'ai que l'accélération mais pas plus de données de vitesse.

Que dois-je faire afin de souscrire à plusieurs caractéristiques à la fois?

Merci à l'avance

Reto

+0

Pourriez-vous essayer d'attendre le rappel onDescriptorWrote du premier bloc avant d'essayer de régler le second? – Zomb

+0

C'est un bon indice, en fait, il a résolu mon problème. Merci en effet! – retokiefer

+0

Je vais l'ajouter comme réponse pour que d'autres personnes puissent le trouver! – Zomb

Répondre

2

Pour obtenir des descripteurs pour écrire un après l'autre, s'il vous plaît attendre le rappel d'une écriture de descripteur avant de commencer la suivante.

+0

Pouvez-vous s'il vous plaît ajouter le code pour cela? Ce serait vraiment utile! Je vous remercie – Nick

0

Pour tous les futurs lecteurs, voici comment faire:

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