简体   繁体   中英

Android BLE App can ONLY subscribe characteristic notification for 1 BLE device

I'm new to Android. I'm trying to subscribe characteristic notifications from 2 BLE devices. Now, my App can only receive the BLE data from the 1st device. I understand that BLE is serial communication, so I must wait until the onDescriptorWrite() callback is called before I enable the notification for the 2nd device. We can ONLY have 1 GATT operation each time. My questions are:

  1. How to modify the onDescriptorWrite() ? Thread.sleep() delay method doesn't help.

  2. Some people mentioned to use queue to add/remove something?

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

    };

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

I think that should be:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM