Как вы получаете данные с устройства Bluetooth LE

У меня есть сканер штрих-кода Bluetooth, поддерживающий bluetooth LE, и я пытаюсь получить от него информацию о штрих-кодах при сканировании.

Я могу подключиться к нему fine onServicesDiscovered получает вызов в моем BluetoothGattCallback но я не уверен, что делать onServicesDiscovered .

С классическим подключением Bluetooth вы получите InputStream от BluetoothSocket и вы просто дождитесь, когда read() предоставит вам данные, но я не уверен, как это работает с Bluetooth LE. Я пробовал зацикливаться на проверке свойства BluetoothGattCharacteristic и если его свойство read я называю gatt.readCharacteristic(characteristic); Но это просто дает мне бесполезную информацию, и это еще до того, как я попытаюсь что-то сканировать.

Итак, как мне получить данные штрих-кода со сканера?

Это сканер у меня https://www.zebra.com/us/en/support-downloads/scanners/ultra-rugged-scanners/li3608-li3678.html

Данные, предоставленные устройствами BLE, называются характеристиками . Эти пакеты данных представляют собой специально сформированные, плотно упакованные байтовые массивы, которые кодируют конкретные значения для определенных служб . Вы можете проверить Сервисы на официальном сайте Bluetooth. Здесь вы найдете определенные (авторитетные) сервисы GATT и характеристики принадлежности.

Например, у вас есть велосипедный компьютер BLE, который сообщает скорость и каденцию. Вы просматриваете пункт « Велоспорт» и «Каденция» в списке. Эта запись содержит UUID (0x1816) службы и ссылку на лист данных, который содержит характеристики. Теперь, если вы перейдете в таблицу характеристик службы , вы найдете пару записей. Вы хотите скорость и каденцию, поэтому вы откроете CSC Measurement (поле Type of the entry), которое приведет вас к листу данных характеристики. Здесь вы увидите таблицу Value Fields, которая определяет конкретные значения, которые могут быть считаны из характеристики.

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

 BluetoothGattCharacteristic characteristic = ... ; int offset = 0; // we define the offset that is to be used when reading the next field // FORMAT_* values are constants in BluetoothGattCharacteristic // these represent the values you can find in the "Value Fields" table in the "Format" column int flags = characteristic.getIntValue(FORMAT_UINT8, offset); offset += 1; // UINT8 = 8 bits = 1 byte // we have to check the flags' 0th bit to see if C1 field exists if ((flags & 1) != 0) { int cumulativeWheelRevolutions = characteristic.getIntValue(FORMAT_UINT32, offset); offset += 4; // UINT32 = 32 bits = 4 bytes int lastWheelEventTime = characteristic.getIntValue(FORMAT_UINT16, offset); offset += 2; // UINT16 = 16 bits = 2 bytes } // we have to check the flags' 1st bit to see if C2 field exists if ((flags & 2) != 0) { int cumulativeCrankRevolutions = characteristic.getIntValue(FORMAT_UINT16, offset); offset += 2; int lastCrankEventTime = characteristic.getIntValue(FORMAT_UINT16, offset); offset += 2; } 

Поле flags должно быть проверено для определенных битов, потому что возможно, что устройство не сообщает о каждом типе данных, например, оно не учитывает обороты колеса. На листе выбранного атрибута всегда содержится соответствующая информация об этом поле (если существует).

Также стоит отметить, что в документации говорится, что

Характеристика CSC-измерения (CSC относится к скорости циклирования и каденции) представляет собой структуру с переменной длиной, содержащую поле Flags и, основываясь на содержимом поля Flags, может содержать одно или несколько дополнительных полей […]

Вот почему вы не можете предположить, что кумулятивное значение оборотов кривошипа должно быть найдено в 7 байтах (соответственно 8 + 32 + 16 бит, 1 + 4 + 2 байта ) и смещение должно учитываться по мере продвижения вдоль полей.


Это был пример для чтения значений скорости движения и каденции с устройства BLE. Вам нужно будет найти эти доступные поля и значения для каждого устройства (а точнее сервиса), которое вы хотите поддержать в своем приложении. Если устройство является специальным и оно не может быть найдено в этом каталоге GATT, для получения дополнительной информации вам необходимо обратиться к руководству устройства, SDK или поставщику.

Intereting Posts
Android setX () и setY () ведут себя странно Возможно ли установить JDK на устройство Android? Создать vp8 на Android Как я могу показать ProgressBar только после минимальной задержки? Как получить имя оператора, подключенного к Интернету в телефоне с двумя SIM-картами? Проблема с менеджером по местоположению для мороженого sandwhich Android Log.v (), Log.d (), Log.i (), Log.w (), Log.e () – Когда использовать их? Как скрыть панель действий / панель инструментов при прокрутке вниз в веб-представлении Есть ли в Android какая-нибудь DLL или DLL-концепция? JetBrain Idea андроидный xml-элемент не разрешен здесь ExceptionInInitializerError – ZBar Android Как рисовать что-то пальцем в приложении для Android … И сохранить его в Интернете Выпуск подписанного приложения для Android, входа в Google Plus и карты Google не работает Консоль разработчика Google Play Store: невозможно управлять списком тестеров для закрытого бета-тестирования Android-приложение сбой на Motorola defy reason <s3dReadConfigFile: 75>: не удается открыть файл для чтения