Android BLE 外围设备与状态码 BLE_HCI_INSTANT_PASSED(0x28) 断开连接

Posted

技术标签:

【中文标题】Android BLE 外围设备与状态码 BLE_HCI_INSTANT_PASSED(0x28) 断开连接【英文标题】:Android BLE peripheral disconnects with status code BLE_HCI_INSTANT_PASSED(0x28) 【发布时间】:2018-01-25 16:27:19 【问题描述】:

我的应用程序能够成功连接到 BLE 外围设备(OBDII/J1939 设备)设备。

2018-01-24 14:58:38,413 INFO  LogUtil -     GATT Server Status = (0) : BLE_HCI_STATUS_CODE_SUCCESS(0x00)
2018-01-24 14:58:38,414 INFO  LogUtil -     GATT Server New State = (2) : STATE_CONNECTED
2018-01-24 14:58:38,414 INFO  LogUtil - Connected to GATT server.

应用程序开始与设备通信,但一段时间后,它在BluetoothGattCallback 的回调实现中收到了onConnectionStateChange 中的GATT 服务器断开消息。以下是应用程序的日志:

2018-01-24 15:07:46,396 INFO  LogUtil -     GATT Server Status = (40) : BLE_HCI_INSTANT_PASSED(0x28)
2018-01-24 15:07:46,397 INFO  LogUtil -     GATT Server New State = (0) : STATE_DISCONNECTED
2018-01-24 15:07:46,398 INFO  LogUtil - Disconnected from GATT server.

无法找到BLE_HCI_INSTANT_PASSED 状态码背后的任何原因。

对此的任何帮助都会有所帮助。

【问题讨论】:

这种情况是一直发生还是只发生过一次?如果您阅读蓝牙核心规范中的链路层规范,您可以看到如果连接不稳定,它们可能会在连接参数更新和通道映射更新期间发生。 @Emil 不,这不会一直发生。有时连接不稳定。连接中断并出现 HCI 错误代码,例如 BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT。建立连接后,我们不会更改连接参数。 我认为最好的调试方法是使用空气嗅探器。然后您会看到每个数据包以及失败的原因。 【参考方案1】:

当通过 BLE 传输数据时,数据传输只能在称为“连接事件”的同步时间点开始。在 BLE 链路层,可以提出几个与这些同步点相关的特殊请求。它们是:

LL_CHANNEL_MAP_REQ - 更改正在传输的 BLE 通道的请求。蓝牙芯片会根据环境中的噪声改变信道映射,以尝试限制丢包。 LL_CONNECTION_UPDATE_REQ - 更改“连接事件”频率(称为“连接间隔”)的请求。这样做是为了实现更好的吞吐量/延迟或节省更多电量。

这些链路层请求中的每一个在通过空中发送时都包含一个“即时”要更改。 “即时”是将来应用更改的“连接事件”。

在链路层,BLE可靠。这意味着每个链路层数据包都必须得到对方的确认。在嘈杂的射频环境中,链路层数据包可能需要多次重试才能实际发送。这意味着数据包可能会在最初预期之后到达许多“连接事件”。

如果在“即时”之后收到上述数据包之一,则应该应用更改,根据定义,BLE 芯片必须断开连接,原因为 0x28(即时通过)

有关该主题的更多详细信息,Bluetooth SIG 网站上的Bluetooth Core Specification 是一个很好的参考:

【讨论】:

以上是关于Android BLE 外围设备与状态码 BLE_HCI_INSTANT_PASSED(0x28) 断开连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中获取当前连接的 BLE 外围设备

Android 8.1 连接到调用 connectGatt 的 BLE 外围设备。回调总是说断开连接。从不连接

在 Android 上无需绑定的 BLE 配对

如何创建 Android BLE 外围设备?

Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

BLE在Android上没有绑定的配对