Несколько BluetoothGattCharacteristic не уведомляется - PullRequest
0 голосов
/ 25 августа 2018

Я работаю на BLE-устройстве и не могу получить onCharacteristicChanged, чтобы ему когда-либо звонили. У меня есть 8 BluetoothGattCharacteristic, на который мне нужно подписаться.

После нахождения устройства onServicesDiscovered Я запускаю процесс подписки на каждую характеристику.

private fun requestCharacteristics(gatt: BluetoothGatt, char: BluetoothGattCharacteristic){
        subscribeToCharacteristic(gatt, char, true)
        (charList).getOrNull(0)?.let {
            charList.removeAt(0)
        }
    }

Затем в subscribeToCharacteristic я делаю все проверки для дескриптора.

private val CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")

private fun subscribeToCharacteristic(gatt: BluetoothGatt, char: BluetoothGattCharacteristic, enable: Boolean) {
        if (gatt.setCharacteristicNotification(char, enable)){
            val descriptor = char.getDescriptor(CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID)
            if (descriptor != null){
                if (BluetoothGattCharacteristic.PROPERTY_NOTIFY != 0 && char.properties != 0) {
                    descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
                } else if (BluetoothGattCharacteristic.PROPERTY_INDICATE != 0 && char.properties != 0) {
                    descriptor.value = BluetoothGattDescriptor.ENABLE_INDICATION_VALUE
                } else {
                    println("The characteristic does not have NOTIFY or INDICATE property set")

                }
                if (gatt.writeDescriptor(descriptor)){
                    println("this worked")
                } else {
                    println("This did not work")
                }
            } else {
                println("Failed to set client characteristic notification")
            }
        } else {
            println("Failed to register notification")
        }

    }

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

override fun onDescriptorWrite(gatt: BluetoothGatt, descriptor: BluetoothGattDescriptor?, status: Int) {
        super.onDescriptorWrite(gatt, descriptor, status)
        if (signalsChars.isNotEmpty()) {
            requestCharacteristics(gatt, signalsChars.first())
        } 
    }

Все это работает, но я никогда не получаю никаких звонков от onCharacteristicChanged. Кроме того, если я позвоню gatt.readCharacteristic(char) перед подпиской, onDescriptorWrite не будет вызван. Опять же у меня есть 8 характеристик, на которые я должен подписаться Пожалуйста, помогите!

1 Ответ

0 голосов
/ 02 сентября 2018

Недавно я создал простое приложение BLE Client для Android в Котлине. Вы можете найти его код здесь . Может быть, это поможет вам.

После того, как я подписался на gatt.setCharacteristicNotification, я получал уведомления каждый раз, когда характеристика изменялась, поэтому я думаю, что вы поняли это правильно. Вы уверены, что характеристика устройства BLE изменяется?

Также, если у вас есть ситуация, когда вы читаете характеристику, прежде чем подписываться на нее, вы можете использовать метод onCharacteristicRead. Он вызывается при чтении характеристики, поэтому вы можете получить дескриптор и записать туда его.

...