From e458311c6245f60a542150fafaeda41ed4255f26 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Tue, 12 Aug 2025 21:39:28 +0800 Subject: [PATCH] =?utf8?q?=E8=AF=AD=E8=A8=80=E6=92=AD=E6=94=BE=E8=A7=A3?= =?utf8?q?=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../slip/cat1Service/bk_websocket.h | 2 +- .../peripheral/slip/cat1Service/cat1_ws.cpp | 178 ++++++++++-------- 2 files changed, 100 insertions(+), 80 deletions(-) diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/bk_websocket.h b/code/sdk/drivers/peripheral/slip/cat1Service/bk_websocket.h index 0b761bd9f..33156f03c 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/bk_websocket.h +++ b/code/sdk/drivers/peripheral/slip/cat1Service/bk_websocket.h @@ -21,7 +21,7 @@ typedef void (*on_ws_packet_callback)(uint8_t* data, size_t datalen, WebSocketMe /* WebSocket消息队列系统 */ #define WS_QUEUE_SIZE 4 -#define WS_MESSAGE_MAX_SIZE 512 +#define WS_MESSAGE_MAX_SIZE 1024 typedef struct { uint8_t data[WS_MESSAGE_MAX_SIZE]; diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp index 5272d1257..aafc19ba5 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp @@ -708,100 +708,120 @@ int ws_process_received_data(WebSocketClient *client, const uint8_t *data, size_ } ws_parser_t* parser = client->parser; - int processed = 0; + int total_processed = 0; + const uint8_t* current_data = data; + size_t remaining_len = len; printf("ws_process_received_data: processing %zu bytes for client %s:%s\n", len, client->host, client->path); - // 在解析前打印当前解析器状态 - printf("ws_process_received_data: parser state before parsing:\n"); - // ws_parser_debug_state(parser); - - // 使用新的解析器处理数据 - int result = ws_parse_stream(parser, data, len); - - // 在解析后打印解析器状态 - printf("ws_process_received_data: parser state after parsing:\n"); - // ws_parser_debug_state(parser); - - if (result > 0) { - // 解析完成一个完整的WebSocket帧 - const ws_header_t* header = ws_get_header(parser); - const uint8_t* payload = ws_get_payload(parser); // 使用新函数获取纯载荷数据 - size_t payload_len = ws_get_payload_length(parser); // 获取载荷长度 + // 循环处理数据,支持连续帧 + while (remaining_len > 0) { + printf("ws_process_received_data: processing remaining %zu bytes, current offset: %zu\n", + remaining_len, current_data - data); + + // 在解析前打印当前解析器状态 + printf("ws_process_received_data: parser state before parsing:\n"); + // ws_parser_debug_state(parser); - printf("ws_process_received_data: frame complete, total bytes: %d, payload bytes: %zu\n", - result, payload_len); + // 使用新的解析器处理当前数据段 + int result = ws_parse_stream(parser, current_data, remaining_len); - if (header && payload && payload_len > 0) { - printf("WebSocket frame received: opcode=0x%02X, fin=%d, payload_len=%llu\n", - header->opcode, header->fin, header->payload_len); + // 在解析后打印解析器状态 + printf("ws_process_received_data: parser state after parsing:\n"); + // ws_parser_debug_state(parser); + + if (result > 0) { + // 解析完成一个完整的WebSocket帧 + const ws_header_t* header = ws_get_header(parser); + const uint8_t* payload = ws_get_payload(parser); + size_t payload_len = ws_get_payload_length(parser); - // 打印载荷数据的前几个字节(用于调试) - printf("Payload data (first 32 bytes): "); - for (size_t i = 0; i < payload_len && i < 32; i++) { - printf("%02X ", payload[i]); - } - if (payload_len > 32) printf("..."); - printf("\n"); + printf("ws_process_received_data: frame complete, total bytes: %d, payload bytes: %zu\n", + result, payload_len); - // 根据操作码处理不同类型的消息 - switch (header->opcode) { - case WS_PING: - printf("Received WebSocket PING\n"); - // TODO: 自动回复PONG - break; - - case WS_PONG: - printf("Received WebSocket PONG\n"); - break; - - case WS_CLOSE: - printf("Received WebSocket CLOSE\n"); - // 调用回调函数处理关闭帧 - if (client->packet_callback) { - client->packet_callback((uint8_t*)payload, payload_len, (WebSocketMessageType)WS_CLOSE); - } - break; - - case WS_TEXT: - case WS_BINARY: - case WS_CONTINUATION: - // 调用回调函数处理数据包 - if (client->packet_callback) { - WebSocketMessageType ws_type = (header->opcode == WS_TEXT) ? (WebSocketMessageType)WS_TEXT : - (header->opcode == WS_BINARY) ? (WebSocketMessageType)WS_BINARY : (WebSocketMessageType)WS_CONT; - client->packet_callback((uint8_t*)payload, payload_len, ws_type); + if (header && payload) { + printf("WebSocket frame received: opcode=0x%02X, fin=%d, payload_len=%llu\n", + header->opcode, header->fin, header->payload_len); + + // 打印载荷数据的前几个字节(用于调试) + if (payload_len > 0) { + printf("Payload data (first 32 bytes): "); + for (size_t i = 0; i < payload_len && i < 32; i++) { + printf("%02X ", payload[i]); } - break; - - default: - printf("Unknown WebSocket opcode: 0x%02X\n", header->opcode); - break; + if (payload_len > 32) printf("..."); + printf("\n"); + } + + // 根据操作码处理不同类型的消息 + switch (header->opcode) { + case WS_PING: + printf("Received WebSocket PING\n"); + // TODO: 自动回复PONG + break; + + case WS_PONG: + printf("Received WebSocket PONG\n"); + break; + + case WS_CLOSE: + printf("Received WebSocket CLOSE\n"); + // 调用回调函数处理关闭帧 + if (client->packet_callback) { + client->packet_callback((uint8_t*)payload, payload_len, (WebSocketMessageType)WS_CLOSE); + } + break; + + case WS_TEXT: + case WS_BINARY: + case WS_CONTINUATION: + // 调用回调函数处理数据包 + if (client->packet_callback) { + WebSocketMessageType ws_type = (header->opcode == WS_TEXT) ? (WebSocketMessageType)WS_TEXT : + (header->opcode == WS_BINARY) ? (WebSocketMessageType)WS_BINARY : (WebSocketMessageType)WS_CONT; + client->packet_callback((uint8_t*)payload, payload_len, ws_type); + } + break; + + default: + printf("Unknown WebSocket opcode: 0x%02X\n", header->opcode); + break; + } + + // 重要:在数据处理完成后再重置解析器状态 + // 这样可以确保数据被正确处理后再清理状态 + printf("ws_process_received_data: data processing complete, resetting parser\n"); + ws_parser_reset(parser); + + // 更新处理进度 + total_processed += result; + current_data += result; + remaining_len -= result; + + printf("ws_process_received_data: frame processed, moving to next frame. Remaining: %zu bytes\n", remaining_len); + + } else { + printf("ws_process_received_data: invalid payload data - header=%p, payload=%p, payload_len=%zu\n", + header, payload, payload_len); + return -1; } - // 重要:在数据处理完成后再重置解析器状态 - // 这样可以确保数据被正确处理后再清理状态 - printf("ws_process_received_data: data processing complete, resetting parser\n"); - ws_parser_reset(parser); + } else if (result == 0) { + // 数据不完整,继续等待更多数据 + printf("ws_process_received_data: frame incomplete, waiting for more data\n"); + total_processed = len; // 所有数据都被消耗 + break; + } else { - printf("ws_process_received_data: invalid payload data - header=%p, payload=%p, payload_len=%zu\n", - header, payload, payload_len); - processed = -1; + // 解析错误 + printf("ws_process_received_data: parsing error, result=%d\n", result); + return -1; } - - processed = result; - } else if (result == 0) { - // 数据不完整,继续等待 - printf("ws_process_received_data: frame incomplete, waiting for more data\n"); - processed = len; - } else { - // 解析错误 - printf("ws_process_received_data: parsing error, result=%d\n", result); - processed = -1; } - return processed; + printf("ws_process_received_data: total processed: %d bytes\n", total_processed); + return total_processed; } // 多余的函数已移除,现在只使用一个统一的解析器 -- 2.17.1