我设计了一个带有 ESP32-S3 和 USB-C 的 PCB,我已经实现了它,所以当我将它插入我的电脑时,它作为 RNDIS 设备弹出,它获得 IP:2.2.2.2 和一个MAC 地址。还实现了一个 http-webserver/websocket,我通过 websocket 将数据发送到 ESP。 我发送的包是一个二进制数据数组 [513] 通过 websocket 未屏蔽和屏蔽 [575],数据在 ESP 中处理以供进一步使用。数据数组作为二进制数组发送,并在 ESP 上进行翻译。
实际行为是什么?
当我通过 websocket 发送数据时,大部分数据都被正确接收但有时会打印出来:
W (554132) httpd_ws:httpd_ws_recv_frame:WS 帧未正确屏蔽。
E (554138) ./main/http_service.c: httpd_ws_recv_frame 无法获得 259 的帧 len(尝试 1)
然后打开一个新的连接,运行一段时间后就和上面一样了。 数据数组每 40 毫秒发送一次,如下所示: 在下面我插入了处理程序,我认为这是问题所在。
int max_retries = 3;
int num_retries = 0;
static esp_err_t ws_handler(httpd_req_t *req) {
if (req->method == HTTP_GET)
{
ESP_LOGI(TAG, "Handshake done, the new connection was opened");
return ESP_OK;
}
httpd_ws_frame_t ws_pkt;
uint8_t *buf = NULL;
memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t));
//ws_pkt.type = HTTPD_WS_TYPE_TEXT;
// Declare variables and initialize them
//httpd_ws_frame_t ws_pkt = {0};
esp_err_t ret;
int num_retries = 0;
while (num_retries < max_retries) {
ret = httpd_ws_recv_frame(req, &ws_pkt, 0);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "httpd_ws_recv_frame failed to get frame len with %d (attempt %d)", ret, num_retries+1);
num_retries++;
} else {
break;
}
}
if (num_retries >= max_retries) {
ESP_LOGE(TAG, "Exceeded maximum number of retries");
return ESP_FAIL;
}
if (ws_pkt.len)
{
buf = calloc(1, ws_pkt.len + 1);
if (buf == NULL)
{
ESP_LOGE(TAG, "Failed to calloc memory for buf");
return ESP_ERR_NO_MEM;
}
ws_pkt.payload = buf;
ret = httpd_ws_recv_frame(req, &ws_pkt, ws_pkt.len); // ws_pkt.len
if (ret != ESP_OK)
{
//ESP_LOGE(TAG, "httpd_ws_recv_frame failed with %d", ret);
free(buf);
return ret;
}
//ESP_LOGI(TAG, "Got packet with message: %s", ws_pkt.payload);
}
//ESP_LOGI(TAG, "frame len is %d", ws_pkt.len);
if (ws_pkt.type == HTTPD_WS_TYPE_BINARY) {
if (memcmp(ws_pkt.payload, "\x0a", 1) == 0) {
dmx_packet_t dPack;
dPack.MsgSource = (void *)1;
uint8_t *dmx_data = dPack.DMX;
uint8_t *payload_data = ws_pkt.payload + 1; // skip the "0a" prefix
int payload_len = ws_pkt.len - 1;
if (payload_len > 513) {
// Payload is too long, ignore it
ESP_LOGI(TAG,"Ignoring payload to big");
}
memcpy(dmx_data, payload_data, payload_len);
if (xQueue_dmx) {
xQueueSend(xQueue_dmx, &dPack, 0);
}
}else{
free(buf);
return ESP_FAIL;
}
}
if (buf) {
free(buf);
}
//websock_instance *dev = NULL, *delDev = NULL;
//SendJsonToAll(buffer);
return ESP_OK;
}
我希望这是足够的信息,亲切的问候