使用 ESP-IDF 的 Http-web 服务器说“没有正确屏蔽”

问题描述 投票:0回答:0

我设计了一个带有 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;
}

我希望这是足够的信息,亲切的问候

http websocket esp32 httpserver esp-idf
© www.soinside.com 2019 - 2024. All rights reserved.