低功耗蓝牙监听多个特征通知

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。

【讨论】:

我遵循了相同的策略,但我并没有从这两个特征中获得价值。从该描述符获取值后,我正在编写第一个描述符,然后编写第二个描述符。你能提出任何解决方案吗?

以上是关于低功耗蓝牙监听多个特征通知的主要内容,如果未能解决你的问题,请参考以下文章

低功耗蓝牙通知特性

低功耗蓝牙Ble的详细使用流程

Qt低功耗蓝牙系列四(搭建低功耗服务端代码)

Qt低功耗蓝牙系列四(搭建低功耗服务端代码)

Qt低功耗蓝牙系列四(搭建低功耗服务端代码)

使用响应写入多个低功耗蓝牙特性值