Android BLE GATT 外设模式通知

Posted

技术标签:

【中文标题】Android BLE GATT 外设模式通知【英文标题】:Android BLE GATT Peripheral Mode Notifications 【发布时间】:2016-01-13 06:53:37 【问题描述】:

我正在尝试使用 android 5.0 (21) api 将应用设置为充当 BLE 外围设备。到目前为止,我已经设置了服务器,让广告和连接正常工作,设置了自定义 GATT 服务和特性,并且可以在外围设备和其他测试设备之间进行读写。现在我正在尝试向一些参数添加通知,但简单地说;他们不工作。

在定义这些特性时,它们包括 notify 属性:

BluetoothGattService battService = new BluetoothGattService(BatteryProfile.UUID_BATTERY_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY);

BluetoothGattCharacteristic batteryLevelCharacteristic =
        new BluetoothGattCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL,
                BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
                BluetoothGattCharacteristic.PERMISSION_READ);
battService.addCharacteristic(batteryLevelCharacteristic);

mGattServer.addService(battService);

在我的BluetoothGattServerCallback 中,我包含了该方法:

@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) 
    Log.d(TAG, "Descriptor write: " + descriptor.toString());
    if (responseNeeded) 
        mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, value);
    
    super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);

我希望在客户端启用通知(或为此写入任何描述符)时记录“描述符写入:”消息;但从未记录过此类消息(调试器也不会进入该函数)。

我稍后尝试使用以下方式发送通知:

BluetoothGattCharacteristic batteryLevelCharacteristic = service.getCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL);
batteryLevelCharacteristic.setValue(new byte[] mBatteryLevel );
mGattServer.notifyCharacteristicChanged(mConnectedDevice, batteryLevelCharacteristic, false);

虽然它更新了值;它不会向连接的客户端发送通知。

我已经在 Nexus 5X 上使用 Android 6.0.1 对此进行了测试(不幸的是,这是我唯一可以用来测试的 Android 设备)。使用外围设备/BluetoothGattServer API 的例子并不多,所以我有点迷茫。是否有一些我忘记调用的方法,或者我需要以某种未记录的顺序执行某些操作才能使通知生效?

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我不知道您是否已经找到了解决方案。但我认为您可以尝试通过为您需要通知的特征定义客户端配置特征描述符。

这可以按照这篇文章中的说明来完成。 Any way to implement BLE notifications in Android-L preview

【讨论】:

我忘了我问过这个,是的,我确实找到了解决方案。我不记得究竟是什么修复了它,但我很确定你是对的 - 我需要使用并写入配置描述符。

以上是关于Android BLE GATT 外设模式通知的主要内容,如果未能解决你的问题,请参考以下文章

samsung ble api 无法从多个 GATT 特征中获取通知

如何在 android 中将特征写入 BLE GATT 服务器?

我在 Android 应用程序(Java)和 ESP32 BLE 服务器之间的 Gatt 连接有问题

Android BLE 库分享

在 Android 中写入 GATT 后的 BLE 回答

BLE GATT 介绍