Bluetooth LE прослушивает несколько характерных уведомлений

Я использую приложение BLE на телефоне Android, взаимодействующем с пользовательской сенсорной платой BLE. Плата предоставляет две характеристики: ускорение и ЭКГ. Со стороны телефона я хотел бы получать уведомления о двух характеристиках с сенсорной платы. Мой код для установки уведомлений:

mGatt.setCharacteristicNotification(ecgChar, true);
            BluetoothGattDescriptor descriptor = ecgChar.getDescriptor(
                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mGatt.writeDescriptor(descriptor);
            mGatt.setCharacteristicNotification(accelChar, true);
            descriptor = ecgChar.getDescriptor(
                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mGatt.writeDescriptor(descriptor);

Однако я могу получать уведомления только для первых характеристик. Когда я регистрирую уведомление только для одной характеристики, это работает хорошо. Частота дискретизации составляет 100 Гц как для ЭКГ, так и для ускорения. Итак, как я могу получать уведомления от обеих характеристик? Спасибо.


person Sentimental    schedule 09.02.2017    source источник


Ответы (2)


Одновременно у вас может быть только одна незавершенная операция Гатта. В этом случае вы делаете два вызова writeDescriptor, прежде чем дождаться завершения первого. Вы должны дождаться https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html#onDescriptorWrite(android.bluetooth.BluetoothGatt,%20android.bluetooth.BluetoothGattDescriptor,%20int), пока вы не сможете отправить следующий один.

person Emil    schedule 09.02.2017
comment
На самом деле, я знаю, что операция gatt сериализуется, поэтому я пытался добавить задержку между двумя операциями записи, но это не сработало. Теперь я использую обратные вызовы для обработки сериализации, что является правильным способом, и он работает хорошо! Спасибо! - person Sentimental; 09.02.2017
comment
Спасибо, ты спас мне жизнь. Информации по этому поводу нет. - person Haroun Hajem; 04.12.2018

Я согласен с ответом Эмиля. Когда у вас есть дескриптор записи для первой характеристики:

boolen isSucsess = mGatt.writeDescriptor(descriptor);

Вы должны дождаться обратного вызова для этой первой характеристики от:

onDescriptorWrite(BluetoothGattgatt, дескриптор BluetoothGattDescriptor, int status) - метод BluetoothGattCallback.

Только после этого следует переходить к следующей характеристике и обработке ее дескриптора.

Например, вы можете расширить BluetoothGattDescriptor и запустить следующую характеристику и обработку ее дескриптора в методе

onDescriptorWrite(...) {... здесь...}.

Так же имейте в виду, что иногда нужно установить уведомление для всех характеристик и после этого написать их дескрипторы. Я встречал это в своей практике с весами. Для получения веса мне нужно настроить уведомления по батарее, по времени, по весу, после этого написать дескриптор для всех характеристик (ожидание обратных вызовов для всех)).

Для четкого кода вам лучше работать с мультитрейдингом.

Лучший, СтаСер.

person Serg.Stankov    schedule 10.07.2018
comment
Я следовал той же стратегии, но не получаю ценности для обеих характеристик. Я пишу первый дескриптор после получения значения от этого дескриптора, затем пишу второй дескриптор. Можете ли вы предложить какое-либо решение. - person YBDevi; 12.03.2020