我在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个特征。请帮忙!

最佳答案

我最近在Kotlin制作了一个简单的BLE客户端Android应用。您可以找到其代码here。也许会对您有帮助。

订阅gatt.setCharacteristicNotification后,每次特性更改时都会收到通知,因此我认为您做对了。您确定BLE设备上的特性发生了变化吗?

另外,如果您遇到在订阅该特性之前先阅读该特性的情况,则可以使用onCharacteristicRead方法。读取特征时将调用它,因此您可以获取描述符并将其写入。

关于android - 未通知多个 BluetoothGattCharacteristic,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52011859/

10-11 18:41