乐鑫技术交流
直播中

戚歆敦

8年用户 1070经验值
私信 关注
[问答]

ESP32 BLE使用nimble协议栈怎样才能发送超过20个字节的数据?

我在使用蓝牙传送传感器数据,目前只能发送20个字节大小的数据包,请问大家是如何实现发送大于20字节的数据包的。我想尝试将数据包分包发送,但是不知道怎样调用相关的API,请问大家有什么好的办法实现,不影响接收端判断和模块效率的?
                                                                                                                                                            

回帖(1)

张虎豹

2024-6-17 17:45:40
要在使用NimBLE协议栈的ESP32上发送超过20个字节的数据,您可以采用分包发送的方法。以下是实现分包发送的步骤:

1. 定义数据包的最大长度:由于BLE的限制,每个数据包的最大长度为20字节。您可以根据需要调整这个值,但不要超过20字节。

2. 将数据分为多个包:在发送数据之前,将数据分为多个小于或等于20字节的数据包。

3. 添加包头信息:为了在接收端正确地组装数据包,您可以在每个数据包的开头添加一些包头信息,例如包的序号、总包数和当前包的数据长度。

例如,您可以使用以下格式的包头:

- 1字节:包序号(从0开始)
- 1字节:总包数(减1)
- 2字节:当前包的数据长度(大端序)

这样,每个数据包的包头将占用4个字节,剩余的空间可以用于存储实际的数据。

4. 发送数据包:使用NimBLE协议栈提供的API发送数据包。例如,您可以使用`ble_gap_conn_send_data`函数发送数据。

5. 在接收端组装数据:接收到数据包后,根据包头信息解析数据,并按照包序号顺序组装数据。

以下是一个简化的示例代码:

```c
#include "nimble/nimble/include/nimble/ble.h"
#include "nimble/nimble/include/nimble/ble_hci_trans.h"

#define MAX_DATA_LENGTH 100
#define MAX_PACKET_SIZE 20

// 假设data是要发送的数据,data_length是数据的长度
uint8_t data[MAX_DATA_LENGTH];
size_t data_length = ...;

// 分包发送数据
for (size_t i = 0; i < data_length; i += MAX_PACKET_SIZE) {
    size_t remaining_length = data_length - i;
    size_t current_packet_length = (remaining_length > MAX_PACKET_SIZE) ? MAX_PACKET_SIZE : remaining_length;

    // 准备数据包
    uint8_t packet[MAX_PACKET_SIZE + 4]; // 4字节包头
    packet[0] = (i / MAX_PACKET_SIZE) % 256; // 包序号
    packet[1] = ((data_length - 1) / MAX_PACKET_SIZE) % 256; // 总包数减1
    memcpy(&packet[2], ¤t_packet_length, 2); // 当前包的数据长度(大端序)

    // 复制数据到数据包
    memcpy(&packet[4], &data[i], current_packet_length);

    // 发送数据包
    ble_gap_conn_send_data(conn_handle, packet, current_packet_length + 4);
}
```

请注意,这只是一个简化的示例,您可能需要根据您的具体需求进行调整。在接收端,您需要解析包头信息并按照包序号顺序组装数据。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分