BluetoothGatt.setCharacteristicNotification() 有啥作用?

Posted

技术标签:

【中文标题】BluetoothGatt.setCharacteristicNotification() 有啥作用?【英文标题】:What does BluetoothGatt.setCharacteristicNotification() do?BluetoothGatt.setCharacteristicNotification() 有什么作用? 【发布时间】:2017-01-01 03:33:50 【问题描述】:

阅读documentation,您会认为setCharacteristicNotification 启用了BLE 特性通知:

启用或禁用给定的通知/指示 特点。

但是这个方法好像没有这个?读取 BLE documentation on receiving BLE notifications,原来是一个多步骤的过程,您必须调用此方法,然后将文件写入描述符。

如果是这种情况,那么setCharacteristicNotification 本身会做什么?

【问题讨论】:

【参考方案1】:

为了告诉远程设备发送通知,需要描述符写入。 setCharactersticNotification 只告诉蓝牙堆栈它应该将收到的任何通知转发给应用程序。

【讨论】:

嗯,这绝对不是文档所说的。我想这是一个没有人费心去修复的极其糟糕的文档。【参考方案2】:

在Why does setCharacteristicNotification() not actually enable notifications? 阅读有趣。那里的回答者通过源代码和文档挖掘发现:

“setCharacteristicNotification 只准备本地服务来接收通知。”

我建议设置通知的包装函数,因为除了文档不太清楚之外,启用通知接收本地以及启用通知发送是一个令人困惑的概念在外设上。我会建议像Enabling Bluetooth characteristic Notification in android (Bluetooth Low Energy ) Not Working 的好心回答者使用的东西:

public boolean setCharacteristicNotification(BluetoothGatt bluetoothGatt, BluetoothGattCharacteristic characteristic,boolean enable) 
    Logger.d("setCharacteristicNotification");
    bluetoothGatt.setCharacteristicNotification(characteristic, enable);
    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID);
    descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[]0x00, 0x00);
    return bluetoothGatt.writeDescriptor(descriptor); //descriptor write operation successfully started?


【讨论】:

以上是关于BluetoothGatt.setCharacteristicNotification() 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章