4

我正在尝试从健康档案中读取温度值。健康温度计服务。根据官方 google ble devlopment page当我尝试通知健康温度计特征以读取温度时,我尝试使用 writeDescriptor 写入描述符值(客户端特征配置),writeDescriptor 的回调方法根据谷歌返回状态 5,它是 GATT_INSUFFICIENT_AUTHENTICATION。所以我注释了 writedescriptor 的代码并尝试调用方法 mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); 但从未调用过 onCharacteristicChanged 方法。当我与我的 ios 开发人员团队交谈时。他们说他们从不写描述符值,他们只是将通知设置为 true,然后从同一芯片获取温度值。android 开发者需要写一个描述符值才能得到通知???所以最后我尝试从蓝牙运行官方蓝牙应用程序。com 站点出于测试目的,他们只是禁用所有三个按钮通知读取和写入???谢谢你,对不起我的英语

[更新]
找出一些可能导致一些绑定问题的日志,如果您有任何解决方案,请帮助我。

  • 生成的短期密钥仍然记录为错误
    11-08 11:26:44.392: E/bt-smp(1014): STK Generated

  • 在绑定状态发生巨大变化之后,这可能会导致身份验证不足
    11-08 11:26:49.437: I/BluetoothBondStateMachine(1014): bondStateChangeCallback: Status: 0 Address: 00:16:A4:C0:FF:EE newState: 2
    11- 08 11:26:49.437: D/BtGatt.btif(1014): btif_gattc_upstreams_evt: 事件 9
    11-08 11:26:49.437: E/BluetoothBondStateMachine(1014): 处于稳定状态,收到无效的 newState: 12

[更新]
在 nexus 7 上升级 kitkat 4.4 后。添加两种方法 对我有用,现在我可以读取加密特征。但仍然不稳定。但我取得了一些成功。
device.createBond();
device.setPairingConfirmation(true);

4

2 回答 2

4

是的,在 Android 中启用 BLE 通知,您必须调用 mBluetoothGatt.setCharacteristicNotification(characteristic, enabled) 并将合适的值写入该特征的描述符 0x2902。

我不确定你为什么会得到 GATT_INSUFFICIENT_AUTHENTICATION,这可能是由温度计的实现引起的。

编辑:根据评论中的新信息以及提供的屏幕截图,您可能需要检查一些事项:

  1. 该特征是指示特征,但不是通知特征。您写入描述符的值应该是 BluetoothGattDescriptor.ENABLE_INDICATION_VALUE,而不是 BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE。请注意,您仍然需要通过 setCharacteristicNotification() 打开指示。(这里的术语令人困惑,但根据文档是必要的)

  2. 对于Android上不稳定的蓝牙栈,尝试重启蓝牙,关闭WiFi。这将增加稳定性。(虽然不是100%解决问题)

于 2013-10-28T01:55:41.983 回答
0

就我而言,问题是 BluetoothGatt 对象只能接受一个待处理的操作。解决方案是依次进行读/写操作,等待第一个完成回调,然后再请求第二个读/写操作。

于 2016-01-17T21:12:02.367 回答