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

时间:2018-01-25 16:27:19

标签: android bluetooth-lowenergy gatt obd-ii 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.

应用程序开始与设备通信但在一段时间后,它在onConnectionStateChange的回调实现中的BluetoothGattCallback中收到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状态代码背后的任何原因。

任何有关此方面的帮助都会有所帮助。

1 个答案:

答案 0 :(得分:2)

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

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

通过无线方式发送的每个链接层请求都包含要更改的“即时”。 “即时”是将来应用更改的“连接事件”。

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

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

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