c - 如何使用 [BTstack] BLE 发送大(>2KB)数据包

标签 c bluetooth-lowenergy raspberry-pi-pico

我正在使用 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/

相关文章:

c++ - 链接器如何知道外部函数的定义在哪里?

ios - 将两个具有相同 UUID 的 BLE 设备配对(使用 CoreBluetooth)

c - 使用 raspberry pi pico uart 和 c sdk 的奇怪之处

c - yacc 缺少左括号的错误处理

c - 质因数分解 + C 中的质数

c++ - 为什么这个 C++ 代码可以编译?它有什么作用?

google-chrome - 通过网络浏览器扫描 iOS 上的信标

linux - BlueZ:从命令行发送 LE 定向广告

c++ - Arduino RP2040 Pico 唯一 ID