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.
我在 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.