Android BLE App 只能订阅 1 个 BLE 设备的特性通知

时间:2021-05-06 07:19:11

标签: android bluetooth-lowenergy

我是 Android 新手。我正在尝试从 2 个 BLE 设备订阅特征通知。现在,我的应用程序只能从第一个设备接收 BLE 数据。 我知道 BLE 是串行通信,所以我必须等到 onDescriptorWrite() 回调被调用,然后才能为第二个设备启用通知。我们每次只能有 1 个 GATT 操作。 我的问题是:

  1. 如何修改onDescriptorWrite()Thread.sleep() 延迟方法没有帮助。

  2. 有些人提到使用队列来添加/删除某些东西?

     public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled,int device) {
     if (mBluetoothAdapter == null || mBluetoothGatt == null || mBluetoothGatt1 == null) {
         Log.e(TAG, "BluetoothAdapter not initialized");
         return;
     }
     if(device == 0) {
         mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
         BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
         descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
         mBluetoothGatt.writeDescriptor(descriptor);
         try {
             Thread.sleep(100);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         Log.e(TAG,"Device #0 is done for notification!");
     }
     else if(device == 1){
         mBluetoothGatt1.setCharacteristicNotification(characteristic,enabled);
         BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
         descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
         mBluetoothGatt.writeDescriptor(descriptor);
         try {
             Thread.sleep(100);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         Log.e(TAG,"Device #1 is done for notification!");
     }
    

    }

     private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
     @Override
     public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
         String intentAction;
         if (newState == BluetoothProfile.STATE_CONNECTED) {
             intentAction = ACTION_GATT_CONNECTED;
             mConnectionState = STATE_CONNECTED;
             broadcastUpdate(intentAction);
             Log.e(TAG, "Connected to GATT server #0.");
             // Attempts to discover services after successful connection.
             Log.e(TAG, "Attempting to start service discovery #0:" + mBluetoothGatt.discoverServices());
    
         } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
             intentAction = ACTION_GATT_DISCONNECTED;
             mConnectionState = STATE_DISCONNECTED;
             Log.e(TAG, "Disconnected from GATT server #0.");
             broadcastUpdate(intentAction);
         }
     }
    
     @Override
     public void onServicesDiscovered(BluetoothGatt gatt, int status) {
         if (status == BluetoothGatt.GATT_SUCCESS) {
             broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
         } else {
             Log.e(TAG, "onServicesDiscovered received: " + status);
         }
     }
    
     @Override
     public void onCharacteristicRead(BluetoothGatt gatt,
                                      BluetoothGattCharacteristic characteristic,
                                      int status) {
         if (status == BluetoothGatt.GATT_SUCCESS) {
             broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic,0);
         }
         try {
             Thread.sleep(700);
         }catch(InterruptedException ex) {
             Thread.currentThread().interrupt();
         }
         Log.e(TAG,"onCHAR READ");
     }
    
     @Override
     public void onCharacteristicChanged(BluetoothGatt gatt,
                                         BluetoothGattCharacteristic characteristic) {
         broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic,0);
         try {
             Thread.sleep(700);
         }catch(InterruptedException ex) {
             Thread.currentThread().interrupt();
         }
         Log.e(TAG,"onCharacteristicChanged #0 = ACTION_DATA_AVAILABLE, Done! ");
     }
    
     @Override
     public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
         super.onDescriptorWrite(gatt, descriptor, status);
    
         // Do something here ????????????
    
         // Thread.sleep() delay method doesn't help
         try {
             Thread.sleep(700);
         }catch(InterruptedException ex) {
             Thread.currentThread().interrupt();
         }
         Log.e(TAG,"onDescriptorWrite #0, Done! ");
     }
    

    };

1 个答案:

答案 0 :(得分:0)

 mBluetoothGatt1.setCharacteristicNotification(characteristic,enabled);
 BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
 descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
 mBluetoothGatt.writeDescriptor(descriptor);

我认为应该是:

 mBluetoothGatt1.setCharacteristicNotification(characteristic,enabled);
 BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
 descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
 mBluetoothGatt1.writeDescriptor(descriptor);
相关问题