我正在开发一个应用程序,需要自动连接到一个布尔外围设备。
我有一个粘性服务,可以执行以下操作:
在绑定设备中查找所需的设备
如果设备(第一次)不正常,则扫描设备并使用device.createBond()将其绑定,然后通过收听更改后的广播操作等待绑定完成。
使用device.connectGatt(ctx,true,callback)连接到它
等待连接状态的回调
使用onConnectionStateChange启动服务发现
等待gatt.discoverServices()回调
通过使用onServicesDiscoverd
等待OnDeScriptorWrite回调,返回成功状态gatt.writeDescriptor
处理它收到的通知
这是第一次一切正常。当设备断开连接(例如超出范围或关闭)时,粘性服务回调BluetoothGatt.GATT_SUCCESS (0)gatt.disconnect(),重新启动并再次执行所有这些操作,这次它使用绑定的设备进行连接。
在步骤7之前,一切工作正常,这意味着我得到状态为133的gatt.close()回调,有时随后是状态为0和状态为22的连接状态更改回调。
我在网上找不到状态133或22的任何信息。
知道为什么会这样吗?
我现在正在处理这个问题,通过移除绑定(反射)来响应坏的onDescriptorWrite回调,然后再对新扫描的设备执行所有操作。
所以基本上我是用键来等待设备连接,然后重新启动整个过程。
这意味着连接到绑定设备的gatt连接对于编写所需的描述符是无用的。
感觉好像我错过了什么,想知道什么。
编辑:
一些相关的logcat输出

08-18 16:06:31.363  12765-12835/? W/bt-att﹕ gatt_rsp_timeout disconnecting...
08-18 16:06:31.363  12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=3     connected=0 conn_id=3 reason=0x0016
08-18 16:06:31.363  12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=4     connected=0 conn_id=4 reason=0x0016
08-18 16:06:31.363  12765-12835/? W/bt-btif﹕ bta_gattc_conn_cback() - cif=5     connected=0 conn_id=5 reason=0x0016
08-18 16:06:31.366  12765-12807/? D/BtGatt.GattService﹕ onDisconnected() -     clientIf=5, connId=5, address=C1:D1:22:BA:F5:13
here im getting onDescriptorWrite with status 133
D/BluetoothGatt﹕ onClientConnectionState() - status=22 clientIf=5     device=C1:D1:22:BA:F5:13

看样子:
https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/idea133/bta/include/bta_gatt_api.h#169
16表示bta_gatt_conn_terminate_local_主机
22表示bta_gatt_conn_lmp_超时
在Nordics Github上问到这个:https://github.com/NordicSemiconductor/Android-nRF-Toolbox/issues/9#issuecomment-132191406

最佳答案

在Nordics Github上问到:
https://github.com/NordicSemiconductor/Android-nRF-Toolbox/issues/9#issuecomment-132191406
根据他们的建议,在调用connectgatt之后增加了2秒的延迟,现在它可以工作了。

07-24 09:49
查看更多