BLE — считывание нескольких значений характеристик для сервиса

#delphi #bluetooth-lowenergy #firemonkey

#delphi #bluetooth-низкое энергопотребление #firemonkey

Вопрос:

Я разрабатываю приложение на Delphi, связывающееся со смарт-устройством с помощью Bluetooth LE. Это устройство имеет около 11 служб и иногда до 19 характеристик для одной службы. Я могу обнаружить все службы и характеристики.

Но я застрял при чтении нескольких значений характеристик в цикле. Существует небольшая задержка между:

BluetoothLE.readCharacteristic(подключенное устройство, GattCharacteristic);

и

Событие BluetoothLECharacteristicRead.

Как я могу убедиться, что я правильно получил предыдущее значение, прежде чем запрашивать следующее? Есть ли где-нибудь пример безопасного выполнения этого с помощью Delphi?

Заранее благодарю вас за вашу помощь

Комментарии:

1. Передается BluetoothLECharacteristicRead событие ACharacteristic: TBluetoothGattCharacteristic , которое включает в себя не только значение.

2. Я действительно могу успешно прочитать значение для первой характеристики при запуске события. Когда я пытаюсь прочитать следующую характеристику для той же службы, я получаю сообщение об ошибке, потому что BLE не готов обработать следующий запрос.

Ответ №1:

При запуске OnServicesDiscovered события необходимо сохранить индекс этой службы (индекс в списке доступных служб на текущем устройстве). После этого вы должны получить доступ к списку доступных характеристик для текущей службы (в событии onServicesDiscovered есть список характеристик: AServiceList[CurrentServiceIndex].Characteristics ) и выполнить чтение значений с помощью OnCharacteristicRead события, которое запускается индивидуально по одной характеристике, значение которой вы хотите прочитать. В OnCharacteristicRead случае существует ACharacteristic параметр, который содержит текущую информацию о характеристиках.

Использование Bluetooth с низким энергопотреблением:http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_Bluetooth_Low_Energy

Комментарии:

1. Спасибо, извините, если я неправильно объяснил свою проблему, у меня нет проблем с чтением отдельной характеристики. Моя проблема заключается в чтении одной за другой до 70 характеристик в цикле. Я прошу прочитать следующее, прежде чем запускать событие onCharacteristicRead для предыдущего запроса. До сих пор я решал свою проблему, используя режим ожидания (50) между каждым запросом, чтобы позволить BLE обрабатывать запрос на чтение. Но, конечно, это не элегантно. У меня также возникает та же проблема при подписке примерно на 10 характеристик. Для обработки также требуется время. Я ожидал, что BLE будет быстрее, чем это