Подтвердить что ты не робот

Android: BLE, как читать несколько характеристик?

Методы API Android BLE для чтения некоторых характеристик носят асинхронный характер и когда вы запрашиваете какое-то значение, вызывается метод обратного вызова GATT.

Если вы запрашиваете несколько значений характеристик чтения, он просто просто отбрасывает других, пока не будет рассмотрен первый запрос.

Я не понял, если так, почему они сделали методы Async. Если кто-то знает, какой шаблон дизайна мы должны адаптировать для решения этой проблемы, пожалуйста, поделитесь.

Если вы хотите прочитать некоторые характеристики, вы должны запросить его.

// new value available will be notified in Callback Object
        mBluetoothGatt.readCharacteristic(ch);

Обратный вызов GATT

public void onCharacteristicRead(BluetoothGatt gatt, android.bluetooth.BluetoothGattCharacteristic characteristic, int status)

Возможное решение №1

https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained

Любой может объяснить, как это использовать. Я думаю, что это поможет в этом случае, но я все еще смотрю, как его использовать.

Возможное решение №2

https://code.google.com/p/mobility-rpc/source/browse/mobility-rpc/trunk/src/main/java/com/googlecode/mobilityrpc/session/impl/MobilitySessionImpl.java#395

Возможное решение № 3

http://tutorials.jenkov.com/java-util-concurrent/synchronousqueue.html

Возможное решение №4

http://examples.javacodegeeks.com/core-java/util/concurrent/synchronous-queue-example-to-execute-commands/

Возможное решение №5

qaru.site/info/250165/...

Обновление

Мне удалось заставить его работать с предпочтительной очередью SynchronousQueue, но я поделюсь своим окончательным решением после тестирования. Укажите тайм-аут, иначе он застрянет или запросит некоторое чтение характеристик, которые не поддерживают операцию чтения.

Вы можете видеть, какие характеристики доступны для чтения, уведомляемые см. в этом сообщении

4b9b3361

Ответ 1

Псевдокод:

1) Использование очереди FIFO или очереди приоритетов зависит от вашей бизнес-логики

2) введите все характеристики, которые вы хотите прочитать

3) вызовите метод requestCharacteristics, чтобы он мог начать использовать вашу очередь

4) из вашего вызова onCharacteristicsRead посмотрите, больше ли размер очереди больше, чем запрос Zero.. убедитесь, что peek() здесь

5) теперь по вашему методу requestKhacteristics выполните poll() и запросите BLE GATT для характеристики.

Ответ 2

Возможно, вы уже его уже обнаружили, но это может быть полезно для других.

Я не понял, так ли это, почему они создали методы Async.

Они, вероятно, сделали это, потому что отправка запроса на чтение другому устройству при синхронном выполнении означала бы, что вы не сможете ничего сделать с вашим приложением до получения ответа. Сделав это Async, вы можете делать другие вещи, но никаких других запросов bluetooth не требуется.