Невозможно прочитать характеристику с помощью Bluetooth LE, readCharacteristic возвращает false на Android - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу считывать артериальное давление с устройства Medisana через Bluetooth на моем устройстве Android.

Вот мой код

override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
                        super.onServicesDiscovered(gatt, status)
                        if (status != BluetoothGatt.GATT_SUCCESS) {
                            Log.e(TAG, "onServicesDiscovered failed")
                            return
                        }

                        val characteristic = gatt?.getService(BLOOD_PRESSURE_SERVICE_UUID)?.
                            getCharacteristic(BLOOD_PRESSURE_CHARACTERISTICS_UUID)
                        if (characteristic == null) {
                            Log.e(TAG, "blood pressure measurement characteristics is not supported by the device")
                        } else {
                            gatt.setCharacteristicNotification(characteristic, true)
                            val descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_UUID)
                            descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE;
                            gatt.writeDescriptor(descriptor)
                            if (!gatt.readCharacteristic(characteristic)) {
                                Log.e(TAG, "Unable to read characteristic")
                            }
                        }
                    }

Вот константы, которые я скопировал с официального сайта Bluetooth

private val BLOOD_PRESSURE_SERVICE_UUID = UUIDUtils.convertFromInteger(0x1810)
private val BLOOD_PRESSURE_CHARACTERISTICS_UUID = UUIDUtils.convertFromInteger(0x2A35)

object UUIDUtils {
    fun convertFromInteger(i: Int): UUID {
        val MSB = 0x0000000000001000L
        val LSB = -0x7fffff7fa064cb05L
        val value = (i and -0x1).toLong()
        return UUID(MSB or (value shl 32), LSB)
    }
}

При выполнении кода в журналах отображается сообщение «Невозможно прочитать характеристику».Когда я отлаживаю readCharacteristic, он возвращает в строке

public boolean readCharacteristic(BluetoothGattCharacteristic characteristic) {
        if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_READ) == 0) {
            return false;
        }

Таким образом, характеристика не читается, но как сделать ее читабельной.Я новичок в Bluetooth, и все это сбивает меня с толку.

1 Ответ

0 голосов
/ 06 марта 2019

Попробуйте это Согласно документу, кровяное давление необходимо добавить индикатор включения, чтобы получить данные.Поэтому вам необходимо: во-первых, добавить «ENABLE_INDICATION_VALUE» в дескриптор CLIENT_CHARACTERISTIC_CONFIG.

Этот дескриптор происходит из:

descriptor = characteristic.getDescriptor(
                    UUID.fromString(CLIENT_CHARACTERISTIC_CONFIG)); //CLIENT_CHARACTERISTIC_CONFIG equal to 00002902-0000-1000-8000-00805f9b34fb

Затем:

descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); 

И последний шаг, напишите дескриптор на удаленное устройство (устройство контроля давления) следующим образом

mBluetoothGatt.writeDescriptor(descriptor); 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...