Чтение bluetooth low energy properties (чтение, уведомления) — как это работает?

Я анализирую пример из android, который объясняет низкое энергопотребление bluetooth на android. Я нашел следующий код, который устанавливает уведомление, но я не могу получить то, что происходит здесь с использованием целого числа свойств и условий внутри ifs. Может кто-нибудь объяснить это немного?

В любом случае, может быть, у вас есть какой — то лучший источник, который может объяснить концепцию ble на android-что и как здесь работает? Официальный Android учебник очень плохо, и официальная страница bluetooth почти ничего не дает…

@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
                            int childPosition, long id) {
    if (mGattCharacteristics != null) {
        final BluetoothGattCharacteristic characteristic =
                mGattCharacteristics.get(groupPosition).get(childPosition);
        final int charaProp = characteristic.getProperties();
        if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
            // If there is an active notification on a characteristic, clear
            // it first so it doesn't update the data field on the user interface.
            if (mNotifyCharacteristic != null) {
                mBluetoothLeService.setCharacteristicNotification(
                        mNotifyCharacteristic, false);
                mNotifyCharacteristic = null;
            }
            mBluetoothLeService.readCharacteristic(characteristic);
        }
        if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
            mNotifyCharacteristic = characteristic;
            mBluetoothLeService.setCharacteristicNotification(
                    characteristic, true);
        }
        return true;
    }
    return false;
}

1 ответ

  1. Вы можете попробовать прочитать спецификацию Bluetooth ( https://www.bluetooth.com/specifications/adopted-specifications , Core Version 5.0), vol 3 part G. просто обратите внимание, что Android абстрагирует дескрипторы атрибутов.

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

    Для получения объектов, представляющих службы, характеристики и дескрипторы, вызовите gatt.discoverServices (). Результат возвращается асинхронно с помощью обратного вызова onServicesDiscovered (). Это следует делать каждый раз, когда устройство подключается (в обратном вызове onConnectionStateChange, когда newState является GATT_CONNECTED).

    Для записи в характеристику сначала задайте значение для объекта BluetoothGattCharacteristic с помощью метода setValue, затем вызовите gatt.writeCharacteristic (характеристика). Когда операция будет завершена, onCharacteristicWrite будет вызван.

    Операция чтения работает аналогичным образом; вызов gatt.readCharacteristic (characteristic) и результат готов при вызове onCharacteristicRead. Используйте getValue () на характерном объекте, чтобы получить значение.

    Для работы уведомлений необходимо сначала написать BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE (0x0001) в дескриптор конфигурации характеристики клиента, чтобы периферийное устройство начало доставлять уведомления. Вы также должны сказать Android Bluetooth stack для пересылки уведомлений в приложение, вызвав setCharacteristicNotification.

    Обратите внимание, что одновременно может выполняться только одна незавершенная операция (чтение/запись), то есть необходимо дождаться обратного вызова, прежде чем отправлять новый запрос.

    Если вы знаете оборудование, с которым имеете дело, вам обычно не нужно проверять характерные свойства (characteristic.getProperties ()). Битовая маска описана в спецификации Bluetooth Core V 5.0, Том 3, Часть G, раздел 3.3.1.1 и описывает, какие функции включены для каждой характеристики (например, чтение, запись, уведомления).

    Как работать с преобразованием между 16-разрядными и 128-разрядными UUID, показано в спецификации Bluetooth Core V 5.0, Том 3, часть B, раздел 2.5.1. Обратите внимание, что клиентские библиотеки Android используют только 128-битные UUID.