优化websocket解析 2072/1 2072/head 2073/target/1 2074/target/1
author孙春阳 <snickersun@163.com>
Wed, 13 Aug 2025 15:30:57 +0000 (23:30 +0800)
committer孙春阳 <snickersun@163.com>
Wed, 13 Aug 2025 15:30:57 +0000 (23:30 +0800)
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp
code/sdk/drivers/peripheral/slip/cat1Service/websocket_parser.cpp

index 0c72124..d81b4a4 100644 (file)
@@ -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");
         }
     }
     
index 1105df5..3bdaede 100644 (file)
@@ -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;
 }
 
 // 新增:打印解析器详细状态信息(用于调试)