使用绑定设备时的 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 时的数据绑定

使用选择案例和参数绑定时的laravel分页

使用该控件时的 MVVM UserControl 和绑定

在 Route 声明上使用 withTrashed 方法并在 Model 中使用 resolveRouteBinding 时的自定义模型绑定

使用 Jquery 加载填充 jquery ui 对话框时的敲除绑定

Vuejs 2,VUEX,编辑数据时的数据绑定