语言播放解决 2067/1 2067/head 2068/target/1
authorhcj <1224667075@qq.com>
Tue, 12 Aug 2025 13:39:28 +0000 (21:39 +0800)
committerhcj <1224667075@qq.com>
Tue, 12 Aug 2025 13:39:28 +0000 (21:39 +0800)
code/sdk/drivers/peripheral/slip/cat1Service/bk_websocket.h
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp

index 0b761bd..33156f0 100644 (file)
@@ -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];
index 5272d12..aafc19b 100644 (file)
@@ -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;
 }
 
 // 多余的函数已移除,现在只使用一个统一的解析器