添加哄睡询问 2686/2 2686/head 2687/target/2
authorhcj <1224667075@qq.com>
Wed, 5 Nov 2025 08:16:58 +0000 (16:16 +0800)
committerhcj <1224667075@qq.com>
Wed, 5 Nov 2025 08:16:58 +0000 (16:16 +0800)
code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.h
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c

index 0399c6c..e5264bd 100644 (file)
@@ -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[=<intention>]"},
     {(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"},
     
index 23ad08d..812f6bd 100644 (file)
@@ -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");
index 1d89c15..1b439ac 100644 (file)
@@ -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);
index c18659a..6f6c628 100644 (file)
@@ -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