From 1cdb5b687bf02063cb19e1625f23bb7a6d29336d Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AD=99=E6=98=A5=E9=98=B3?= Date: Wed, 13 Aug 2025 23:30:57 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96websocket=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../peripheral/slip/cat1Service/cat1_ws.cpp | 103 +++++++++++++++--- .../slip/cat1Service/websocket_parser.cpp | 42 ++++--- 2 files changed, 117 insertions(+), 28 deletions(-) diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp index 0c721241c..d81b4a4ce 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp @@ -714,6 +714,72 @@ int ws_process_received_data(WebSocketClient *client, const uint8_t *data, size_ return -1; } + // ========== 新增:打印收到的所有原始数据 ========== + printf("\n=== WebSocket Raw Data Received ===\n"); + printf("Client: %s:%s\n", client->host, client->path); + printf("Total bytes: %zu\n", len); + printf("Raw data (hex): "); + + // 打印所有数据的十六进制表示 + for (size_t i = 0; i < len; i++) { + printf("%02X ", data[i]); + // 每16字节换行,提高可读性 + if ((i + 1) % 16 == 0) { + printf("\n "); + } + } + printf("\n"); + + // 打印ASCII表示(可打印字符) + printf("Raw data (ASCII): "); + for (size_t i = 0; i < len; i++) { + if (data[i] >= 32 && data[i] <= 126) { + printf("%c", data[i]); + } else if (data[i] == '\r') { + printf("\\r"); + } else if (data[i] == '\n') { + printf("\\n"); + } else if (data[i] == '\t') { + printf("\\t"); + } else { + printf("."); + } + } + printf("\n"); + + // 打印数据统计信息 + // printf("Data analysis:\n"); + // printf(" - Total bytes: %zu\n", len); + // printf(" - First byte: 0x%02X\n", len > 0 ? data[0] : 0); + // printf(" - Last byte: 0x%02X\n", len > 0 ? data[len-1] : 0); + + // 检查是否可能是WebSocket帧头 + // if (len >= 2) { + // uint8_t first_byte = data[0]; + // uint8_t second_byte = data[1]; + // uint8_t fin = (first_byte >> 7) & 0x1; + // uint8_t rsv = (first_byte >> 4) & 0x7; + // uint8_t opcode = first_byte & 0x0F; + // uint8_t mask = (second_byte >> 7) & 0x1; + // uint8_t payload_len = second_byte & 0x7F; + + // printf(" - Potential WebSocket frame:\n"); + // printf(" * FIN: %d\n", fin); + // printf(" * RSV: %d%d%d\n", (rsv >> 2) & 1, (rsv >> 1) & 1, rsv & 1); + // printf(" * Opcode: 0x%02X\n", opcode); + // printf(" * Mask: %d\n", mask); + // printf(" * Payload length: %d\n", payload_len); + + // // 验证opcode是否有效 + // bool valid_opcode = ((opcode <= 0x2) || (opcode >= 0x8 && opcode <= 0xA)); + // printf(" * Valid opcode: %s\n", valid_opcode ? "YES" : "NO"); + + // // 验证RSV位 + // bool valid_rsv = (rsv == 0); + // printf(" * Valid RSV: %s\n", valid_rsv ? "YES" : "NO"); + // } + printf("=====================================\n\n"); + ws_parser_t* parser = client->parser; int total_processed = 0; const uint8_t* current_data = data; @@ -733,12 +799,25 @@ int ws_process_received_data(WebSocketClient *client, const uint8_t *data, size_ // 使用新的解析器处理当前数据段 int result = ws_parse_stream(parser, current_data, remaining_len); - + + if(result == -1) + { + printf("ws_process_received_data: parsing error, reset parser,find next frame. Remaining: %zu bytes\n", remaining_len); + ws_parser_reset(parser); + return -1; + } + + // 更新处理进度 + total_processed += result; + current_data += result; + remaining_len -= result; + // 在解析后打印解析器状态 printf("ws_process_received_data: parser state after parsing:\n"); // ws_parser_debug_state(parser); + ws_parse_state_t ws_stat = ws_parser_get_state(parser); - if (result > 0) { + if (ws_stat == WS_STATE_COMPLETE) { // 解析完成一个完整的WebSocket帧 const ws_header_t* header = ws_get_header(parser); const uint8_t* payload = ws_get_payload(parser); @@ -802,10 +881,7 @@ int ws_process_received_data(WebSocketClient *client, const uint8_t *data, size_ 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); @@ -815,16 +891,15 @@ int ws_process_received_data(WebSocketClient *client, const uint8_t *data, size_ return -1; } - } else if (result == 0) { - // 数据不完整,继续等待更多数据 - printf("ws_process_received_data: frame incomplete, waiting for more data\n"); - total_processed = len; // 所有数据都被消耗 - break; + } else if (ws_stat == WS_STATE_ERROR) { + // 解析错误,重置parser + ws_parser_reset(parser); + + printf("ws_process_received_data: parsing error, find next frame. Remaining: %zu bytes\n", remaining_len); } else { - // 解析错误 - printf("ws_process_received_data: parsing error, result=%d\n", result); - return -1; + // 数据不完整,继续等待更多数据 + printf("ws_process_received_data: frame incomplete, waiting for more data\n"); } } diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/websocket_parser.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/websocket_parser.cpp index 1105df521..3bdaede4a 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/websocket_parser.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/websocket_parser.cpp @@ -199,23 +199,33 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) { parser->header.rsv3 = (byte >> 4) & 0x1; parser->header.opcode = (ws_opcode_t)(byte & 0x0F); - WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Parse header1 - FIN:%d, RSV:%d%d%d, OPCODE:0x%02X", - parser->header.fin, parser->header.rsv1, parser->header.rsv2, parser->header.rsv3, parser->header.opcode); + + + + // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Parse header1 - FIN:%d, RSV:%d%d%d, OPCODE:0x%02X", + // parser->header.fin, parser->header.rsv1, parser->header.rsv2, parser->header.rsv3, parser->header.opcode); + // 检查 opcode 是否有效 if (!((parser->header.opcode >= WS_CONTINUATION && parser->header.opcode <= WS_BINARY) || (parser->header.opcode >= WS_CLOSE && parser->header.opcode <= WS_PONG))) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid opcode: 0x%02X", parser->header.opcode); + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid opcode: 0x%02X", parser->header.opcode); parser->state = WS_STATE_ERROR; return -1; } - + + if(parser->header.fin == 0) + { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid FIN bit: %d", parser->header.fin); + // parser->state = WS_STATE_ERROR; + // return -1; + } // 检查RSV位是否都为0(根据RFC6455规范) if (parser->header.rsv1 || parser->header.rsv2 || parser->header.rsv3) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid RSV bits: %d%d%d", - parser->header.rsv1, parser->header.rsv2, parser->header.rsv3); - parser->state = WS_STATE_ERROR; - return -1; + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Invalid RSV bits: %d%d%d", + // parser->header.rsv1, parser->header.rsv2, parser->header.rsv3); + // parser->state = WS_STATE_ERROR; + // return -1; } // 保存第一个头部字节到缓存 @@ -223,6 +233,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) { parser->buffer[parser->buffer_pos++] = byte; } else { parser->state = WS_STATE_ERROR; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in header1"); return -1; } @@ -243,6 +254,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) { parser->buffer[parser->buffer_pos++] = byte; } else { parser->state = WS_STATE_ERROR; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in header2"); return -1; } @@ -294,6 +306,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) { parser->buffer[parser->buffer_pos++] = byte; } else { parser->state = WS_STATE_ERROR; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in payload length"); return -1; } @@ -429,6 +442,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) { parser->buffer[parser->buffer_pos++] = byte; } else { parser->state = WS_STATE_ERROR; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Buffer overflow in mask"); return -1; } @@ -513,8 +527,8 @@ int ws_parse_stream(ws_parser_t* parser, const uint8_t* data, size_t len) { WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Parser was in COMPLETE state, resetting for new frame"); ws_parser_reset(parser); } - - for (size_t i = 0; i < len; i++) { + size_t i=0; + for (i = 0; i < len; i++) { int result = ws_parse_byte(parser, data[i]); if (result == 1) { @@ -526,19 +540,19 @@ int ws_parse_stream(ws_parser_t* parser, const uint8_t* data, size_t len) { // 重要:不要在这里重置解析器! // 让上层处理完数据后再调用 ws_parser_reset() // 这样可以确保数据被正确处理后再清理状态 - return packet_len; + return i+1; } else if (result == -1) { // 解析错误,重置解析器 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Parse error at byte %zu, resetting parser", i); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WS: Parse error at byte %zu, resetting parser, byte: %02X", i, data[i]); ws_parser_reset(parser); - return -1; + continue; } } // 未完成解析,显示当前状态信息 WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "WS: Frame parsing incomplete, waiting for more data. State: %d, Buffer: %zu/%zu, Payload remaining: %zu", parser->state, parser->buffer_pos, WS_BUFFER_SIZE, parser->payload_remaining); - return 0; + return i+1; } // 新增:打印解析器详细状态信息(用于调试) -- 2.17.1