我编写了一个 Kotlin Compose Coroutine SharedFlow 应用程序,它将我的手机连接到支持 BLE 的传感器设备。该应用程序表现出奇怪的行为。如果我只是连接到设备,传感器的 voltsValue 就会被正确读取并在我的单个屏幕上通知。但是,我的设备正在通知两个特征,即 ampsValue。 ampsValue 既不会按 logcat 读取,也不会显示在我的屏幕上。发现了安培特征 UUID,但未发现安培特征值。
如果我分别交换伏特和安培的特征 UUID,ampsValue 开始在 logcat 中通知并显示在我的屏幕上。当然,相应的传感器读数显示在错误的文本字段中,但如果我将 UUID 交换回来,那么伏特和安培都会正确显示。当我关闭设备电源并重新启动时,会出现另一个问题。我的应用程序将重新连接,但它会恢复为仅显示 voltsValue。我可以让它读取/通知这两个值的唯一方法是交换特征 UUID。这种行为听起来很熟悉吗?请注意,nRF 正确读取并显示两个通知值。
这是发现 UUID 的 onServicesDiscovered() 回调:
@SuppressLint("MissingPermission")
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
when (status) {
BluetoothGatt.GATT_SUCCESS -> {
// Service discovery successful
val service = gatt?.getService(SERVICE_UUID)
if (service != null) {
// Read volts characteristic
val voltsCharacteristic =
service.getCharacteristic(VOLTS_UUID)
voltsCharacteristic?.let {
gatt.readCharacteristic(it)
Log.d("Frank - read voltsCharacteristic", "Volts Characteristic = $it")
} ?: run {
Log.e("Frank", "Volts characteristic not found")
}
// Read amps characteristic
val ampsCharacteristic = service.getCharacteristic(AMPS_UUID)
ampsCharacteristic?.let {
gatt.readCharacteristic(it)
Log.d("Frank - read ampsCharacteristic", "Amps Characteristic = $it")
} ?: run {
Log.e("Frank", "Amps characteristic not found")
}
} else {
Log.e("Frank", "Service not found")
}
}
else -> {
// Service discovery failed
Log.e("Frank", "Service discovery failed with status: $status")
}
}
每个 BluetoothGatt 对象一次只能有一个未完成的 GATT 操作。请等待,直到收到 onReadCharacteristic 回调,直到发送下一个请求(readCharacteristic)。