我正在使用 BTstack 库的树莓派 pico W 上编写 C 应用程序。我有一个指向 2 kB 数据缓冲区的特征。当客户端设备发出准备好此数据的信号时,我目前只能将数百个字节发送到客户端。根据我能找到的所有示例,这是我在发生读取时触发的代码:
uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size) {
UNUSED(connection_handle);
if (att_handle == ATT_CHARACTERISTIC_ORG_QT_CHARACTERISTIC_HEARTBEAT_COVERAGE_01_VALUE_HANDLE) {
return att_read_callback_handle_blob((const uint8_t *)&coverage_buffer, sizeof(coverage_buffer), offset, buffer, buffer_size);
}
return 0;
}
我在调用 att_read_callback_handle_blob()
之前添加了一些打印语句,并且我可以看到,当 BTstack 尝试发送整个数据包时,att_read_callback
被调用了多次。然而,我没有发送全部 2000 字节,而是只接收了大约 750 字节。
最佳答案
正如 Martijn van Welie 提到的,每次 BLE 读取只能发送有限数量的字节,并且为了读取整个远程特征值,应该通过多次读取尝试来完成。从您共享的代码中,有一个 offset 参数指定您要读取的数据的开头。根据每次操作读取的数据量(例如,每个读取操作返回 240 字节的数据),您需要执行多次读取才能读取完整的 2kB 数据(即,对于第二次读取尝试,偏移量应为为 241,那么对于第三次读取尝试,偏移量需要为 482,依此类推)。
请注意,您不能/不应该快速连续读取数据。对于所有读取尝试,您必须首先等待上一次读取尝试完成,然后才能进行新的读取尝试。就您而言,这意味着您需要等待处理程序启动 (att_read_callback()),然后再尝试进行新的读取。
关于c - 如何使用 [BTstack] BLE 发送大(>2KB)数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77823041/