Bluetooth LE 监听多种特性通知

Bluetooth LE listen to multiple characteristic notifications

我在 Android phone 上使用 BLE 应用程序与自定义 BLE 传感器板进行通信。板提供了两个特性,加速度和心电图。在 phone 方面,我想从传感器板接收两个特性的通知。我设置通知的代码:

mGatt.setCharacteristicNotification(ecgChar, true);
            BluetoothGattDescriptor descriptor = ecgChar.getDescriptor(
                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mGatt.writeDescriptor(descriptor);
            mGatt.setCharacteristicNotification(accelChar, true);
            descriptor = ecgChar.getDescriptor(
                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mGatt.writeDescriptor(descriptor);

但是,我只能收到第一个特征的通知。当我只为一个特征注册通知时,效果很好。 ECG 和加速度的采样频率均为 100Hz。那么我怎样才能收到来自这两个特征的通知呢?谢谢。

你一次只能有一个未完成的 gatt 操作。在这种情况下,您会执行两次 writeDescriptor 调用,然后等待第一个完成。您必须等待 https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html#onDescriptorWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int) 才能发送下一个。

我同意埃米尔的回答。 当您为第一个特征写入描述符时:

boolen isSucsess = mGatt.writeDescriptor(descriptor);

您应该等待第一个特征的回调:

onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) - BluetoothGattCallback 方法。

只有在那之后你才应该去下一个特征及其描述符处理。

例如,您可以扩展 BluetoothGattDescriptor 和 运行 方法中的下一个特性及其描述符处理

onDescriptorWrite(...) { ... 这里 ...}。

另外请注意,有时您应该为所有特征设置通知,然后再编写其描述符。 我在使用体重秤设备的实践中遇到过这个问题。为了获得重量,我需要为电池、时间、重量设置通知,然后为所有特性编写描述符(等待每个人的回调))。

为了清晰的代码,你最好使用多交易。

最好的, StaSer.