From f0dad5f5f655275a1b8cf728f8bbbc4436183fa6 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Wed, 5 Nov 2025 16:16:58 +0800 Subject: [PATCH] =?utf8?q?=E6=B7=BB=E5=8A=A0=E5=93=84=E7=9D=A1=E8=AF=A2?= =?utf8?q?=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../zhihui/leiniao/imsl_ln/leiniao_api_at.c | 34 ++++- code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 11 ++ code/sdk/zhihui/leiniao/imsl_ln/ln_api.h | 2 + .../zhihui/leiniao/imsl_ln/ln_api_websocket.c | 126 +++++++++++++++++- 4 files changed, 171 insertions(+), 2 deletions(-) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c index 0399c6c5e..e5264bdaf 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c @@ -467,6 +467,37 @@ static uint32_t ln_ws_send_voice_chat_interrupt_at(uint8_t *para, uint32_t paraL return ERRCODE_SUCC; } +/* AT^LN_WS_SEND_SLEEP_MODE_INQUIRE - 发送睡眠模式询问请求 */ +static uint32_t ln_ws_send_sleep_mode_inquire_at(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + LN_UNUSED(strCommonCmd); + + const char *intention = "询问睡眠模式"; // 默认意图 + + // 解析参数 + if (para != NULL && paraLen > 0) { + uint8_t argv[LN_MAX_ARGC][LN_MAX_ARGV_LEN] = {0}; + uint32_t argc = 0; + + if (ConvertCmdToParam(para, paraLen, argv, &argc) == LN_SUCCESS) { + if (argc >= 1) { + intention = (const char *)argv[0]; + } + } + } + + printf("[LN][WS_SEND_SLEEP_MODE_INQUIRE] Sending sleep mode inquire with intention: %s\n", intention); + + int ret = ln_ws_send_sleep_mode_inquire(intention); + if (ret != 0) + { + printf("[LN][WS_SEND_SLEEP_MODE_INQUIRE] failed: %d\n", ret); + return ERRCODE_FAIL; + } + printf("[LN][WS_SEND_SLEEP_MODE_INQUIRE] success\n"); + return ERRCODE_SUCC; +} + /* AT^LN_WS_SLEEP */ static uint32_t ln_ws_sleep_at(uint8_t *para, uint32_t paraLen, char *strCommonCmd) { @@ -1452,7 +1483,7 @@ static uint32_t ln_ws_audio_init_at(uint8_t *para, uint32_t paraLen, char *strCo printf("[LN][WS_AUDIO_INIT] Initializing WebSocket audio...\n"); - //ln_ws_audio_init(); + ln_ws_audio_init(); printf("[LN][WS_AUDIO_INIT] WebSocket audio initialized successfully\n"); return ERRCODE_SUCC; @@ -1514,6 +1545,7 @@ static const at_cmd_table_t g_ln_api_cmd[] = { {(char *)"AT^LN_WS_END_AUDIO_CHAT", ln_ws_end_audio_chat_at, (char *)"结束音频聊天: AT^LN_WS_END_AUDIO_CHAT"}, {(char *)"AT^LN_WS_SEND_RANDOM_STORY", ln_ws_send_random_story_at, (char *)"发送随机故事请求: AT^LN_WS_SEND_RANDOM_STORY[=storyTheme]"}, {(char *)"AT^LN_WS_SEND_VOICE_CHAT_INTERRUPT", ln_ws_send_voice_chat_interrupt_at, (char *)"发送语音聊天打断请求: AT^LN_WS_SEND_VOICE_CHAT_INTERRUPT[=reason]"}, + {(char *)"AT^LN_WS_SEND_SLEEP_MODE_INQUIRE", ln_ws_send_sleep_mode_inquire_at, (char *)"发送睡眠模式询问请求: AT^LN_WS_SEND_SLEEP_MODE_INQUIRE[=]"}, {(char *)"AT^LN_WS_AUDIO_INIT", ln_ws_audio_init_at, (char *)"初始化WebSocket音频: AT^LN_WS_AUDIO_INIT"}, {(char *)"AT^LN_WS_AUDIO_DEINIT", ln_ws_audio_deinit_at, (char *)"反初始化WebSocket音频: AT^LN_WS_AUDIO_DEINIT"}, diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 23ad08dad..812f6bde6 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -932,6 +932,17 @@ void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type) } break; } + case WS_CMD_SLEEP_MODE_INQUIRE: + { + printf("[WS] SleepModeInquire:睡眠模式询问\n"); + if (data_msg) + { + printf("[WS] SleepModeInquire - intention: %s, chatId: %s\n", + data_msg->text_content, data_msg->chat_id); + // 可以在这里添加具体的处理逻辑,比如触发UI通知等 + } + break; + } case WS_CMD_DEVICE_BIND: { printf("[WS] DeviceBind:设备绑定\n"); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index 1d89c15b4..1b439acf2 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -388,6 +388,7 @@ typedef enum { WS_CMD_CHARACTER_CONFIG_CHANGE, /* 角色配置更改 (CharacterConfigChange) */ WS_CMD_SLEEP_MODE_START, /* 哄睡模式开始 (SleepModeStart) */ WS_CMD_SLEEP_MODE_END, /* 哄睡模式结束 (SleepModeEnd) */ + WS_CMD_SLEEP_MODE_INQUIRE, /* 睡眠模式询问 (SleepModeInquire) */ WS_CMD_DEVICE_BIND, /* 设备绑定 (DeviceBind) */ WS_CMD_DEVICE_UNBIND, /* 设备解绑 (DeviceUnbind) */ WS_CMD_SCHEDULE_REMINDER, /* 日程提醒 (ScheduleReminder) */ @@ -448,6 +449,7 @@ int ln_ws_send_random_story_request(const char *story_theme); int ln_ws_start_audio_chat(ln_audio_chat_command_t command_type); int ln_ws_end_audio_chat(void); int ln_ws_send_voice_chat_interrupt(const char *reason); +int ln_ws_send_sleep_mode_inquire(const char *intention); const char* ln_ws_get_current_chat_id(void); int ln_ws_stop(void); // int ln_ws_force_reconnect(void); 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 c18659aff..6f6c628e6 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c @@ -1558,6 +1558,8 @@ static ws_command_t ln_ws_parse_command_string(const char *command_str) return WS_CMD_SLEEP_MODE_START; } else if (strcmp(command_str, "SleepModeEnd") == 0) { return WS_CMD_SLEEP_MODE_END; + } else if (strcmp(command_str, "SleepModeInquire") == 0) { + return WS_CMD_SLEEP_MODE_INQUIRE; } else if (strcmp(command_str, "DeviceBind") == 0) { return WS_CMD_DEVICE_BIND; } else if (strcmp(command_str, "DeviceUnbind") == 0) { @@ -1632,7 +1634,16 @@ static ws_command_t ln_ws_parse_command_string(const char *command_str) // "errorCode": null // } // } - +// { +// "deviceId": "DEVICE_001", +// "timestamp": 1640995200, +// "messageId": "sleep_inquire_001", +// "command": "SleepModeInquire", +// "data": { +// "intention": "START_SLEEP_MODE", +// "chatId": "chat_12345" +// } +// } // {"deviceId":"860132063148589","timestamp":1760408698,"messageId":"1edfb1fc9d904ceb8ca5579241aee1ee","command":"VoiceChatResponse","data":{"finished":false,"chatId":"chat_1760408691_1125307275","data":{"audioDuration":1583,"audioUrl":"http://ambybox-api.test.leiniao.com/ambybox-device-api/file/933515348189_20251014102458_1760408698051.mp3","textContent":"有什么想聊聊的吗?","intention":"None","npcEmotion":"winking"}}} static int ln_ws_parse_data_message(const char *json_str, ws_data_msg_t *data_msg) { @@ -1899,6 +1910,29 @@ static int ln_ws_parse_data_message(const char *json_str, ws_data_msg_t *data_ms data_msg->text_content, data_msg->audio_url); } + // 解析SleepModeInquire特定字段 + if (data_msg->command == WS_CMD_SLEEP_MODE_INQUIRE) { + cJSON *data_obj = cJSON_GetObjectItem(root, "data"); + if (data_obj && cJSON_IsObject(data_obj)) { + // 解析intention字段,存储到text_content中 + cJSON *intention = cJSON_GetObjectItem(data_obj, "intention"); + if (intention && cJSON_IsString(intention) && intention->valuestring) { + strncpy(data_msg->text_content, intention->valuestring, sizeof(data_msg->text_content) - 1); + data_msg->text_content[sizeof(data_msg->text_content) - 1] = '\0'; + } + + // 解析chatId字段 + cJSON *chat_id = cJSON_GetObjectItem(data_obj, "chatId"); + if (chat_id && cJSON_IsString(chat_id) && chat_id->valuestring) { + strncpy(data_msg->chat_id, chat_id->valuestring, sizeof(data_msg->chat_id) - 1); + data_msg->chat_id[sizeof(data_msg->chat_id) - 1] = '\0'; + } + } + + LN_WS_DEBUG("SleepModeInquire parsed: intention=%s, chatId=%s\n", + data_msg->text_content, data_msg->chat_id); + } + // 保存原始JSON字符串 data_msg->raw_json = (char*)malloc(strlen(json_str) + 1); if (data_msg->raw_json) { @@ -3234,3 +3268,93 @@ static int ln_ws_send_cached_audio_data(void) return ret; } + + +// { +// "deviceId": "设备ID", +// "timestamp": 1640995200, +// "messageId": "消息ID", +// "command": "SleepModeInquire", +// "data": { +// "intention": "用户意图", +// "chatId": "对话ID,用于标识本次询问" +// } +// } + +/* 发送睡眠模式询问请求 */ +int ln_ws_send_sleep_mode_inquire(const char *intention) +{ + // 检查音频是否已初始化 + if (!g_audio_initialized) { + LN_WS_ERROR("Audio not initialized, please call ln_ws_audio_init() first\n"); + return -1; + } + + if (!intention) { + LN_WS_ERROR("Invalid intention parameter\n"); + return -1; + } + + if (g_ws_connected != WS_STATE_CONNECTED) { + LN_WS_WARN("Cannot send sleep mode inquire, connection state: %d\n", g_ws_connected); + return -1; + } + + // 生成聊天ID + 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 -1; + } + + // 添加基本字段 + cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id()); + cJSON_AddNumberToObject(json, "timestamp", (double)time(NULL)); + cJSON_AddStringToObject(json, "messageId", message_id); + cJSON_AddStringToObject(json, "command", "SleepModeInquire"); + + // 添加data字段 + cJSON *data = cJSON_CreateObject(); + if (!data) { + LN_WS_ERROR("Failed to create data JSON object\n"); + cJSON_Delete(json); + return -1; + } + + cJSON_AddStringToObject(data, "intention", intention); + cJSON_AddStringToObject(data, "chatId", chat_id); + 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 -1; + } + + LN_WS_INFO("Sending SleepModeInquire: %s\n", json_string); + + // 发送消息 + int ret = uapi_ws_send_text(json_string); + + // 清理资源 + cJSON_free(json_string); + cJSON_Delete(json); + + if (ret == 0) { + LN_WS_DEBUG("SleepModeInquire sent successfully\n"); + } else { + LN_WS_ERROR("Failed to send SleepModeInquire\n"); + } + + return ret; +} \ No newline at end of file -- 2.17.1