2016-07-06 46 views
1

我正在開發一個應用程序,該應用程序應訂閱多個BLE特徵。如何使用Android訂閱多個BluetoothLE特徵

但無論我做什麼,我只收到來自一個特徵的更新值。

下面是代碼:

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); 
} 
相關問題