#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"
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;
// 解析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,但不更新全局上下文)
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,