读取 Gatt 特性后会发生什么情况?

What happens with the Gatt Characteristic after it has been read?

我正在使用带有 Android 5.1(蓝牙 4.0)的 android 设备和带有蓝牙 4.2 的 MCU 板。

在我的 MCU 端,我正在循环更新我的 Gatt 特性,以确保我知道我在里面写入的数据是否一致。在我将其写入 gatt 数据库之前,我正在使用 crc 检查。

在我的 android 这边,我只有一个线程从 gatt 数据库中读取特征,紧接着我有相同的 crc,但似乎 50% 的值已损坏(这并没有从我这边说得通)。 我知道我在 gatt 数据库中写入的数据是正确的,所以我猜问题出在线程中多次读取特性。

我已经尝试通过 android 端的通知读取特征,但蓝牙服务从未跳入 OnCharacteristicChanged 回调。

我的特征更新是这样的

tmpGatt.readCharacteristic(characteristic);

并且特征被之前的uuid过滤

for(int i = 0; i<Services.size(); i++){
                Characteristics = Services.get(i).getCharacteristics();
                for(int c=0;c < Characteristics.size();c++){
                    UUID myUUID = Characteristics.get(c).getUuid();
                    if(myUUID.toString().equals("354a1b8e-7597-11e6-8b77-86f30ca893d3")){
                        characteristic = Characteristics.get(c);
                        //refExternalData.getRefBluetoothGatt().readCharacteristic(characteristic);
                        descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
                        Log.i("BLE", "Characteristic " + myUUID.toString() + " found");
                    }
                }
            }

所以我需要做任何特别的事情来重新读取 gatt 特性吗?

您是否按照 https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#notification 中的步骤启用通知?

当您发布 readCharacteristic 时,在您获得 onCharacteristicRead 之前,您不能发布新的 readCharacteristic。或者实际上,在上一个请求完成之前,您不得发送任何新请求(readCharacteristicwriteCharacteristicreadDescriptorwriteDescriptor)。这是因为一次可能只有一个未完成的 GATT 请求,并且没有内部队列。