Благодаря этому сообщению я смог асинхронно применить свой дескриптор уведомления к каждой из моих характеристик.
Хотя большая часть кода одинакова, требуются некоторые небольшие изменения. Именно по этой причине я хочу дать более глубокое объяснение того, что происходит в этом коде, чтобы будущие новые разработчики ie, такие как я, могли воспользоваться этим.
В моем gatCallback
я создаю список, аналогичный тому, который я упомянул в своем вопросе. Я также определяю некоторые UUID, которые я буду использовать позже в своем коде:
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
List<BluetoothGattCharacteristic> chars = new ArrayList<>();
UUID pitchUUID = UUID.fromString("78c5307a-6715-4040-bd50-d64db33e2e9e");
UUID rollUUID = UUID.fromString("78c5307b-6715-4040-bd50-d64db33e2e9e");
Как только я обнаружу сервисы, я перебираю нужные мне характеристики из моего специфицированного c сервиса и добавляю их в мой список. Затем я перехожу к созданной мной функции с именем subscribeToCharacteristics
, передающей мой объект BluetoothGatt:
for (BluetoothGattCharacteristic characteristic: gatt.getService(UUID.fromString("00001826-0000-1000-8000-00805f9b34fb")).getCharacteristics()) {
chars.add(characteristic);
}
subscribeToCharacteristics(gatt);
Именно в этой функции я устанавливаю уведомление о характеристиках c. Я делаю это только в том случае, если в списке есть элементы; если элементы присутствуют, это означает, что все еще есть дескрипторы, которые необходимо записать!
private void subscribeToCharacteristics(BluetoothGatt gatt) {
if(chars.size() == 0) return;
BluetoothGattCharacteristic characteristic = chars.get(0);
gatt.setCharacteristicNotification(characteristic, true);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
if(descriptor != null) {
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
}
}
Когда я переопределяю функцию onDescriptorWrite
, я просто удаляю первый элемент в моем списке, а затем вызываю мой subscribeToCharacteristics
функция снова.
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
Log.i("DESCRIPTOR", "WROTE DESCRIPTOR FOR CHARACTERISTIC");
super.onDescriptorWrite(gatt, descriptor, status);
chars.remove(0);
subscribeToCharacteristics(gatt);
}
Обратите внимание, что я не использовал GetCharacteristicsWithNotifications(gatt);
, так как это не стандартная функция и не было хорошо объяснено в другом посте.
Я также не использовал notifyCharacteristics.get(0);
, так как это не было ранее объяснено или включено в код сообщения.
Наконец, я не использовал characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
, потому что у меня уже есть мои услуги и характеристики, определенные с соответствующими свойствами в коде моего Arduino. Если бы я не был уверен в этом, то этот код мог бы быть использован.
Я надеюсь, что это (длинное) объяснение будет полезно для любых будущих разработчиков!