我正在尝试从健康配置文件.健康温度计服务中读取温度值。 根据官方谷歌 Ble 开发页面,当我尝试通知健康温度计特征读取温度时,我尝试使用 writeScriptor 写入描述符的回调方法(客户端特征配置) 根据谷歌的说法,写入描述符返回状态 5 它是GATT_INSUFFICIENT_AUTHENTICATION。所以我注释了writedescriptor的代码,并尝试调用方法mBluetoothGatt.setCharacteristicNotification(特征,启用);但 onCharacteristicChanged 方法从未调用。当我与我的 iOS 开发团队交谈时。他们说他们从不写描述符值,他们只是将通知设置为 true,然后从同一芯片获得温度值。编写描述符值是Android开发人员获取通知???所必需的所以最后我尝试从 bluetooth.com 站点运行官方蓝牙应用程序以进行测试,他们只是禁用所有三个按钮通知读写???谢谢你,对不起我的英语
[更新]
找出一些可能导致一些粘合问题的日志,如果您有任何解决方案,请帮助我。
-
生成的短期密钥仍记录为错误
11-08 11:26:44.392: E/bt-smp(1014): 生成 STK -
在该绑定状态发生巨大变化之后,这可能会导致身份验证
不足11-08 11:26:49.437: I/蓝牙绑定状态机(1014): 绑定状态更改回调: 状态: 0 地址: 00:16:A4:C0:FF:EE 新状态: 2
11-08 11:26:49.437: D/BtGatt.btif(1014): btif_gattc_upstreams_evt: 事件 9
11-08 11:26:49.437:E/蓝牙绑定状态机 (1014):处于稳定状态,收到无效的 newState: 12
[更新]
在Nexus 7上升级Kitkat 4.4之后。添加两个方法device.createBond();
现在对我有用,我可以读取加密特征。但仍然不稳定。但我取得了一些成功。
device.setPairingConfirmation(true);
是的,在Android中启用BLE通知,您必须调用mBluetoothGatt.setCharacteristicNotification(characteristic,enabled)并将合适的值写入该特征的描述符0x2902。
我不确定你为什么会GATT_INSUFFICIENT_AUTHENTICATION,这可能是由温度计的实施引起的。
编辑:从评论中的新信息以及提供的屏幕截图中,您可能需要检查一些事项:
-
该特征是指示特征,但不是通知特征。写入描述符的值应BluetoothGattDescriptor.ENABLE_INDICATION_VALUE,但不应BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE。请注意,您仍然需要通过 setCharacteristicNotification() 打开指示。(这里有令人困惑的术语,但根据文档是必要的)
-
对于Android上不稳定的蓝牙堆栈,请尝试重新启动蓝牙,然后打开WiFi。这将增加稳定性。(虽然不是100%解决问题)
就我而言,问题是蓝牙 Gatt 对象只能接受一个挂起的操作。解决方案是按顺序执行读/写操作,等待第一个完成回调,然后再请求第二个读/写操作。