我正在使用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个特征。请帮忙!
答案 0 :(得分:0)
我最近在Kotlin制作了一个简单的BLE客户端Android应用。您可以找到其代码here。也许会对您有帮助。
订阅gatt.setCharacteristicNotification
后,每次特性更改时都会收到通知,因此我认为您做对了。您确定BLE设备的特性会发生变化吗?
如果您在订阅特征之前先阅读过特征,则可以使用onCharacteristicRead
方法。读取特征后会调用它,因此您可以获取描述符并将其写入。