低功耗蓝牙监听多个特征通知
Posted
技术标签:
【中文标题】低功耗蓝牙监听多个特征通知【英文标题】:Bluetooth LE listen to multiple characteristic notifications 【发布时间】:2017-02-09 00:13:05 【问题描述】:我在与自定义 BLE 传感器板通信的 android 手机上使用 BLE 应用程序。该板提供了两个特性,加速度和心电图。在电话方面,我想从传感器板接收两个特性的通知。我设置通知的代码:
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。那么如何接收来自这两个特征的通知呢?谢谢。
【问题讨论】:
【参考方案1】:您一次只能有一个未完成的 gatt 操作。在这种情况下,您在等待第一个完成之前执行两次 writeDescriptor 调用。您必须等待https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html#onDescriptorWrite(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattDescriptor, int) 才能发送下一个。
【讨论】:
其实我知道gatt操作是序列化的,所以我曾尝试在两次写入之间添加延迟但没有奏效。现在我使用回调来处理序列化,这是正确的方法,而且效果很好!谢谢! 谢谢你救了我的命。没有这方面的信息。【参考方案2】:我同意 Emil 的回答。 当你有第一个特征的写描述符时:
boolen isSucsess = mGatt.writeDescriptor(descriptor);
您应该等待来自以下第一个特征的回调:
onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor 描述符, int status) - BluetoothGattCallback 的方法。
只有在这之后,你才应该进入下一个特征及其描述符处理。
作为示例,您可以扩展 BluetoothGattDescriptor 并在方法中运行下一个特征及其描述符处理
onDescriptorWrite(...) ... 这里 ...。
请注意,有时您应该为所有特征设置通知,然后编写其描述符。 我在使用体重秤设备的练习中遇到了这个问题。为了获得重量,我需要设置电池通知、时间通知、重量通知,然后为所有特性编写描述符(等待每个人的回调)。
要获得清晰的代码,最好使用多重交易。
最好, StaSer。
【讨论】:
我遵循了相同的策略,但我并没有从这两个特征中获得价值。从该描述符获取值后,我正在编写第一个描述符,然后编写第二个描述符。你能提出任何解决方案吗?以上是关于低功耗蓝牙监听多个特征通知的主要内容,如果未能解决你的问题,请参考以下文章