Android BLE 外设断开连接,状态代码为 BLE_HCI_INSTANT_PASSED(0x28)

Rav*_*rma 2 android bluetooth-lowenergy obd-ii gatt bluetooth-gatt

我的应用程序能够成功连接到 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.
Run Code Online (Sandbox Code Playgroud)

应用程序开始与设备通信,但一段时间后它onConnectionStateChangeBluetoothGattCallback. 以下是来自应用程序的日志:

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.
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

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

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

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

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

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