我正在尝试从健康档案中读取温度值。health thermometer service。根据{{3}},当我尝试通知健康温度计特征读取温度时,我尝试使用writeDescriptor写一个描述符值(客户端特征配置),根据谷歌的GATT_INSUFFICIENT_AUTHENTICATION,写一个writeDescriptor返回状态5的回调方法。 所以我评论writedescriptor的代码并尝试调用方法mBluetoothGatt.setCharacteristicNotification(特性,启用);但onCharacteristicChanged方法从未调用过。当我和我的ios devloper团队交谈时。他们说他们从不写一个描述符值,他们只是将通知设置为true,他们从同一芯片获得温度值。 写一个描述符值是android开发者获取通知所必需的??? 所以最后我尝试从bluetooth.com网站运行官方蓝牙应用程序进行测试,他们只是禁用所有三个按钮通知读写??? 谢谢你,对不起我的英文
[UPDATE]
找出一些可能导致粘接问题的日志,请帮助我,如果你有任何解决方案。
短期密钥生成仍记录为错误
11-08 11:26:44.392:E / bt-smp(1014):STK生成
之后,债券状态发生巨大变化可能导致认证不足
11-08 11:26:49.437:I / BluetoothBondStateMachine(1014):bondStateChangeCallback:状态:0地址: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
[UPDATE]
在nexus 7上升级kitkat 4.4之后。添加两种方法
device.createBond();
device.setPairingConfirmation(true);
现在我可以阅读加密的特性。但仍然不稳定。但我得到了一些成功。
答案 0 :(得分:4)
是的,在Android中启用BLE通知,您必须同时调用mBluetoothGatt.setCharacteristicNotification(特性,已启用)并将适当的值写入该特征的描述符0x2902。
我不确定你为什么会得到GATT_INSUFFICIENT_AUTHENTICATION,这可能是温度计的实施造成的。
编辑: 根据评论中的新信息以及所提供的屏幕,您可能需要检查以下几项内容:
特征是指示特征,但不是通知特征。您写入描述符的值应为BluetoothGattDescriptor.ENABLE_INDICATION_VALUE,但不应为BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE。请注意,您仍需要通过setCharacteristicNotification()打开指示。 (这里令人困惑的术语,但根据文档是必要的)
对于Android上的不稳定蓝牙堆栈,请尝试重新启动蓝牙,然后关闭WiFi。这将增加稳定性。 (虽然不是100%解决问题)
答案 1 :(得分:0)
在我的情况下,问题是BluetoothGatt对象只能接受一个待处理操作。解决方案是按顺序执行读/写操作,在请求第二次读/写操作之前等待第一次完成回调。