Получать уведомления для нескольких характеристик в Android - PullRequest
1 голос
/ 27 февраля 2020

У меня есть несколько характеристик (все под одной услугой), о которых я хотел бы получить уведомление в моем приложении Android. Когда я устанавливаю дескриптор уведомления для одного из них, он работает хорошо. Я понимаю, что для получения уведомлений для нескольких пользователей необходимо использовать какую-то очередь или задержку, но я не понимаю, как реализовать это в своем коде. Я также не могу найти на этом сайте примеров Android документации или иного, объясняющих, как это реализовать.

Вот код, который я пытался создать для установки уведомления о сервисе:

@Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                for (BluetoothGattCharacteristic characteristic: gatt.getService(UUID.fromString("00001826-0000-1000-8000-00805f9b34fb")).getCharacteristics()) {
                    gatt.setCharacteristicNotification(characteristic, true);
                    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
                    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                    gatt.writeDescriptor(descriptor);
                }

            }
        }

Вот функция, которую я имею для настройки текста в моем приложении, чтобы он соответствовал значению характеристики c, который только что изменился:

 @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicChanged(gatt, characteristic);
            TextView instructionText = getView().findViewById(R.id.instructionText);
            if(showMeasurements) {
                instructionText.setText(characteristic.getStringValue(0));
            }
        }

Еще один метод, который я рассмотрел, пытался создать список List<BluetoothGattCharacteristic> chars = new ArrayList<>(); и добавить каждую характеристику c, которую я нахожу в этом списке. Тогда я мог бы попытаться написать дескриптор уведомления один за другим, но я не могу реализовать это тоже.

Я студент колледжа, который не знаком с Android развитием и такими функциями. Будем весьма благодарны за любую помощь в go решении этой проблемы. Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2020

Благодаря этому сообщению я смог асинхронно применить свой дескриптор уведомления к каждой из моих характеристик.

Хотя большая часть кода одинакова, требуются некоторые небольшие изменения. Именно по этой причине я хочу дать более глубокое объяснение того, что происходит в этом коде, чтобы будущие новые разработчики 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. Если бы я не был уверен в этом, то этот код мог бы быть использован.

Я надеюсь, что это (длинное) объяснение будет полезно для любых будущих разработчиков!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...