雷鸟新协议修改 3363/1 3363/head 3366/target/1
authorhcj <1224667075@qq.com>
Thu, 23 Apr 2026 08:05:04 +0000 (16:05 +0800)
committerhcj <1224667075@qq.com>
Thu, 23 Apr 2026 08:05:04 +0000 (16:05 +0800)
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c

index 8854804..042a284 100644 (file)
@@ -8,6 +8,8 @@
 #include <sys/stat.h>
 #include <unistd.h>
 #include <ctype.h>
+#include <time.h>
+#include <sys/time.h>
 #include "cJSON.h" // Added for JSON parsing
 #include "custom_utils.h"
 #include "soc_osal.h"
@@ -182,6 +184,10 @@ static void record_audio_duration(uint32_t duration);
 static bool check_playback_completion_by_duration(void);
 static bool check_playback_completion_by_timeout(void);
 
+/* 发送语音聊天响应应答 */
+bool ln_ws_send_voice_chat_response_ack(char *ack_message_id);
+
+
 static char story_theme_cache[64]={0};
 
 static uint32_t g_story_index=0;
@@ -2369,6 +2375,7 @@ static int ln_ws_parse_data_message(const char *json_str, ws_data_msg_t *data_ms
     
     // 解析VoiceChatResponse特定字段
     if (data_msg->command == WS_CMD_VOICE_CHAT_RESPONSE) {
+        ln_ws_send_voice_chat_response_ack(data_msg->message_id);
         cJSON *data_obj = cJSON_GetObjectItem(root, "data");
         if (data_obj && cJSON_IsObject(data_obj)) {
             // 解析finished字段(先解析到data_msg,但不更新全局上下文)
@@ -4498,6 +4505,98 @@ bool ln_ws_send_story_continue_request(void)
     LN_WS_DEBUG("StoryContinueRequest sent successfully\n");
     return true;
 }
+/*
+{
+    "deviceId": "DEVICE_001",
+    "timestamp": 1640995204123,
+    "messageId": "ack_001",
+    "command": "VoiceChatResponseAck",
+    "data": {
+      "ackMessageId": "voice_resp_001",
+      "chatId": "chat_12345",
+      "clientTimestampMs": 1640995204123
+    }
+  }
+*/
+
+bool ln_ws_send_voice_chat_response_ack(char *ack_message_id)
+{
+    printf("ln_ws_send_voice_chat_response_ack: %s\n", ack_message_id);
+    if (!g_audio_initialized) {
+        LN_WS_ERROR("Audio not initialized, please call ln_ws_audio_init() first\n");
+        return false;
+    }
+    
+    if (g_ws_connected != WS_STATE_CONNECTED) {
+        LN_WS_WARN("Cannot send voice chat response ack, connection state: %d\n", g_ws_connected);
+        return false;
+    }
+
+    char chat_id[64];
+    generate_chat_id(chat_id, sizeof(chat_id));
+    // 生成消息ID
+    char message_id[128];
+    generate_message_id(message_id, sizeof(message_id), chat_id, 1);
+
+    // 构建JSON消息
+    cJSON *json = cJSON_CreateObject();
+    if (!json) {
+        LN_WS_ERROR("Failed to create JSON object\n");
+        return false;
+    }
+    
+    /* Unix 毫秒时间戳(与 server 侧 ms 一致,勿用 time(NULL) 秒级) */
+    struct timeval tv_now;
+    double ts_ms;
+    if (gettimeofday(&tv_now, NULL) == 0) {
+        ts_ms = (double)tv_now.tv_sec * 1000.0 + (double)tv_now.tv_usec / 1000.0;
+    } else {
+        ts_ms = (double)time(NULL) * 1000.0;
+    }
+    uint64_t ts_ms_ll = (uint64_t)ts_ms;
+
+    // 添加基本字段
+    cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+    cJSON_AddNumberToObject(json, "timestamp", ts_ms_ll);
+    cJSON_AddStringToObject(json, "messageId", message_id);
+    cJSON_AddStringToObject(json, "command", "VoiceChatResponseAck");
+    
+    // 添加data字段
+    cJSON *data = cJSON_CreateObject();
+    if (!data) {
+        LN_WS_ERROR("Failed to create data JSON object\n");
+        cJSON_Delete(json);
+        return false;
+    }
+    
+    cJSON_AddStringToObject(data, "ackMessageId", ack_message_id);
+    cJSON_AddStringToObject(data, "chatId", chat_id);
+    cJSON_AddNumberToObject(data, "clientTimestampMs", ts_ms_ll);
+    
+    cJSON_AddItemToObject(json, "data", data);
+    
+    // 转换为字符串
+    char *json_string = cJSON_Print(json);
+    if (!json_string) {
+        LN_WS_ERROR("Failed to convert JSON to string\n");
+        cJSON_Delete(json);
+        return false;
+    }
+    
+    LN_WS_ERROR("Sending VoiceChatResponseAck: %s\n", json_string);
+    int ret = uapi_ws_send_text(json_string);
+    cJSON_free(json_string);
+    cJSON_Delete(json);
+
+    if (ret != 0) {
+        LN_WS_ERROR("Failed to send VoiceChatResponseAck\n");
+        return false;
+    }
+    LN_WS_DEBUG("VoiceChatResponseAck sent successfully\n");
+    return true;
+}
+    
+    // 发送消息 
 // {
 //   "deviceId": "DEVICE_001",
 //   "timestamp": 1640995200,