BLE HCI_EVT 是否占用连接间隔上的数据包时隙?

Do BLE HCI_EVT occupy a packet slot on the connection interval?

我一直在几个 Android 设备上分析蓝牙监听文件,其中 Android 设备是 Central(客户端),对等设备是 Peripheral(服务器)。

当执行写命令(WC)(从Android发送数据到外设)时,除了WC发送的数据包,wireshark识别一个标记为Number of Completed Packets的HCI事件。

由于 HCI 消息在同一设备的主机和控制器之间交换,这些事件是否占用连接间隔 (CI) 上的数据包时隙?因为虽然我能够使用通知发送 3 packets/CI,但使用写入命令时仅发送 1 packets/CI。

您可以在单个连接事件中发送多个 Write Without Response 数据包(在 ATT 层称为 Write Command)。蓝牙控制器有一个缓冲区,它将传出数据包(称为 ACL 数据包)排入队列。您可以通过查找 LE Read Buffer Size 在 snoop 日志中查看此队列的大小。当蓝牙启动时,主机读取此值将跟踪某些计数器变量中当前可用的 space。当它向设备发送数据包时(例如写入命令),计数器减一。当主机接收到“已完成数据包数”事件(这意味着数据包已通过无线方式发送出去)时,它会增加计数器。只要此计数器在您发出 Write Without Response 后保持正值,您的 GATT onCharacteristicWrite 回调就会被调用,这样您就可以立即将另一个 Write Without Response 数据包加入队列。当下一个连接事件发生时,它发送多个入队的数据包。

如果您仍然无法实现高于每个连接事件一个数据包的吞吐量,请确保您已设置特性以使用 WRITE_TYPE_NO_RESPONSE。