使用绑定设备时的 gatt.writeDescriptor 错误状态回调
Posted
技术标签:
【中文标题】使用绑定设备时的 gatt.writeDescriptor 错误状态回调【英文标题】:gatt.writeDescriptor error status callback when using bonded device 【发布时间】:2015-08-18 11:19:18 【问题描述】:我正在开发一个需要自动连接到 ble 外围设备的应用程序。
我有一个粘性服务,它执行以下操作:
-
在绑定的设备中查找所需的设备
如果设备没有正常工作(第一次),扫描它并使用
device.createBond()
绑定到它,通过收听 ACTION_BOND_STATE_CHANGED 广播等待绑定完成
使用device.connectGatt(ctx,true,callback)
连接到它
等待带有连接状态的onConnectionStateChange
回调
使用gatt.discoverServices()
启动服务发现
等待onServicesDiscoverd
回调
通过使用gatt.writeDescriptor
编写描述符来启用有关特征的通知
等待 onDescriptorWrite 回调成功状态BluetoothGatt.GATT_SUCCESS (0)
处理收到的通知
这一切都是第一次正常工作。当设备断开连接(例如超出范围或关闭)时,粘性服务回调 gatt.disconnect()
和 gatt.close()
,重新启动并再次执行所有操作,这次它使用绑定的设备进行连接。
在第 7 步之前一切正常,这意味着我收到一个状态为 133 的onDescriptorWrite
的回调,有时后跟一个状态为 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_HOST 22 表示 BTA_GATT_CONN_LMP_TIMEOUT
在nordics github上问这个:https://github.com/NordicSemiconductor/Android-nRF-Toolbox/issues/9#issuecomment-132191406
【问题讨论】:
更多细节,如果我只保存 ble 设备地址并使用 bluetoothAdapter.getRemoteDevice(address) 连接,那么我永远不会遇到这个问题。只有在绑定时,也许我的ble设备重新启动后绑定信息不再有效?债券保留了哪些信息? 您找到解决方案了吗?我也认为延迟不是解决它的好方法 请注意,22 不是 BTA_GATT_CONN_LMP_TIMEOUT - 22 和 0x22 之间存在巨大差异。 22 = 0x16。 嗨,我遇到了同样的问题,还没有找到任何解决方案。我的帖子链接在这里被击中 -> ***.com/q/47596419/4111151 【参考方案1】:在nordics github上问了这个: https://github.com/NordicSemiconductor/Android-nRF-Toolbox/issues/9#issuecomment-132191406
按照他们的建议,在调用 connectGatt 后增加了 2 秒的延迟,现在它可以工作了。
【讨论】:
嗨@talarari 我想我们可能有类似的问题,你有没有找到解决方案?谢谢。 @talarari,我也遇到了同样的问题,你解决了这个问题吗?提前谢谢 我在使用 Telit 的 Stollman IO 库时遇到了同样的问题以上是关于使用绑定设备时的 gatt.writeDescriptor 错误状态回调的主要内容,如果未能解决你的问题,请参考以下文章
使用 ng-fullcalendar dayClick 时的数据绑定
在 Route 声明上使用 withTrashed 方法并在 Model 中使用 resolveRouteBinding 时的自定义模型绑定