BluetoothGattCallback onCharacteristicRead 从未回调

BluetoothGattCallback onCharacteristicRead never called back

我仍在努力从 android(使用 java)读取 BLE 设备(激光计) 基本上我正在尝试获取我感兴趣的字段(也称为度量)

到目前为止我发现了 5 个服务(我找到了用法 here):

我遇到的第一个问题是,根据 documentation,onCharacteristicRead(3) 自 API 13 起已弃用,因为它现在添加了一个字节数组作为参数。但根据 Android studio 的说法,这种过载并不存在。

第二个是 onCharacteristicRead 只调用了一个,尽管在超过 10 个可读特征上调用了他

我现在只是在测试,但这是我所做的:

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);
        for (BluetoothGattService serv: gatt.getServices()) {
            System.out.println("-----------------" + serv.getUuid());
            
            for(BluetoothGattCharacteristic chara: serv.getCharacteristics()) {
                
                if((chara.getProperties() & PROPERTY_READ) != 0) {
                    System.out.println("Can read");
                    gatt.readCharacteristic(chara);
                } 
                else {
                    System.out.println("Can't read");
                }
            }
        }
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic,  int status) {
        super.onCharacteristicRead(gatt, characteristic, status);
        System.out.println("Called");

        if(status == GATT_SUCCESS) {
            System.out.println(new String(characteristic.getValue()));
        } else {
            System.out.println("error during read");
        }
    }

这是输出:

    I/System.out: -----------------00001800-0000-1000-8000-00805f9b34fb
    I/System.out: Can read
    I/chatty: uid=10168(com.example.adici) Binder:27154_2 identical 1 line
    I/System.out: Can read
    I/System.out: -----------------00001801-0000-1000-8000-00805f9b34fb
    I/System.out: Can't read
    I/System.out: -----------------3ab10100-f831-4395-b29d-570977d5bf94
    I/System.out: Can read
    I/System.out: Can read
    I/System.out: Can't read
    I/System.out: Can read
    I/System.out: Can read
    I/System.out: -----------------0000180f-0000-1000-8000-00805f9b34fb
    I/System.out: Can read
    I/System.out: Can read
    I/System.out: -----------------0000180a-0000-1000-8000-00805f9b34fb
    I/System.out: Can read
    I/System.out: Called
    I/System.out: DISTO 80951028

我也试过添加这个 while 循环以等待最后一个回调发生,然后再开始另一个回调

while(waitingForCallback)
{
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
waitingForCallback = true;
gatt.readCharacteristic(chara);

在 onCharacteristicRead 中将 waitingForCallback 设置为 false 但由于未调用该方法而导致无限循环

我真的不明白为什么过载对我的 IDE 来说是个问题,因为 Sdkmin = 27 和 targetSdk = 31

感谢任何帮助!

当操作已经挂起时,您不能启动 gatt 操作(例如读取特性)。您必须等待回调才能启动下一次读取。

您的睡眠循环将无法工作,因为蓝牙堆栈从不调用您的回调,而另一个回调已经 运行ning。在这种情况下,如果您 运行 onServicesDiscovered 中的睡眠循环,onCharacteristicRead 回调将被安排到 运行,但它不会 运行 直到 onServicesDiscovered 返回。这是 Android 中“Binder”机制的一个特性,它可以防止同一对象同时回调到 运行。