From 24c2974245ba0ffd7b2941032ce50747edffedce Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Thu, 23 Apr 2026 16:05:04 +0800 Subject: [PATCH] =?utf8?q?=E9=9B=B7=E9=B8=9F=E6=96=B0=E5=8D=8F=E8=AE=AE?= =?utf8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../zhihui/leiniao/imsl_ln/ln_api_websocket.c | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c index 88548044e..042a284b9 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include #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, -- 2.17.1