蓝牙 LE - 多种特征行为

问题描述 投票:0回答:1

我编写了一个 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")
                }
            }
android bluetooth bluetooth-lowenergy kotlin-coroutines kotlin-sharedflow
1个回答
0
投票

每个 BluetoothGatt 对象一次只能有一个未完成的 GATT 操作。请等待,直到收到 onReadCharacteristic 回调,直到发送下一个请求(readCharacteristic)。

© www.soinside.com 2019 - 2024. All rights reserved.