修改获取录音路径函数 2347/1 2347/head 2348/target/1
authorcheng <chengyf@zhihuishixun.com>
Sat, 20 Sep 2025 14:35:04 +0000 (22:35 +0800)
committercheng <chengyf@zhihuishixun.com>
Sat, 20 Sep 2025 14:35:04 +0000 (22:35 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdDialogueView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp
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

index f07359f..f9ae368 100644 (file)
              return false;
          }
          g_isRecording = true;//设置录音状态
-         std::string audioPath = uapi_ln_get_story_choose_audio_path();
+         std::string audioPath = uapi_ln_get_audio_path();
         if(audioPath.empty())
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 故事选择的录音文件路径为空");
index bff370a..7f2f022 100644 (file)
@@ -601,7 +601,7 @@ static uint32_t ln_device_set_userid_at(uint8_t *para, uint32_t paraLen, char *s
     VAD_UNUSED(paraLen); 
     VAD_UNUSED(strCommonCmd);
     printf("[LN][DEVICE_SET_USER_ID]\n");
-    uapi_ln_set_device_bound();
+    uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_BOUND);
     return ERRCODE_SUCC;
 }
 /* OTA-获取升级任务:AT^LN_OTA_GET_TASK */
index 84c6e11..86ed32a 100644 (file)
@@ -127,26 +127,15 @@ const char *uapi_ln_ota_get_saved_path(void)
     return (g_ln_last_saved_path && g_ln_last_saved_path[0] != '\0') ? g_ln_last_saved_path : NULL;
 }
 
-/* 获取语音对话流录音音频路径 */
-const char *uapi_ln_get_speechchat_audio_path(void)
-{
-    // 判断目录是否存在,不存在则创建
-    if (access(LN_DATA_PATH, F_OK) == -1)
-    {
-        uapi_create_folder(LN_DATA_PATH);
-    }
-    const char *path = LN_DATA_PATH "/speech_chat_audio.mp3";
-    return path;
-}
 /* 获取选择故事录音音频路径 */
-const char *uapi_ln_get_story_choose_audio_path(void)
+const char *uapi_ln_get_audio_path(void)
 {
     // 判断目录是否存在,不存在则创建
     if (access(LN_DATA_PATH, F_OK) == -1)
     {
         uapi_create_folder(LN_DATA_PATH);
     }
-    const char *path = LN_DATA_PATH "/story_choose_audio.mp3";
+    const char *path = LN_DATA_PATH "/audio.mp3";
     return path;
 }
 
@@ -165,7 +154,7 @@ void uapi_ln_audio_download_is_cancel(int status)
 }
 
 /* 获取是否绑定用户 */
-uint32_t uapi_ln_is_device_bound(void)
+int uapi_ln_is_device_bound(void)
 {
     return g_ln_is_device_bound;
 }
@@ -176,9 +165,9 @@ const char* uapi_ln_get_user_id(void)
     return g_ln_device_user_id;
 }
 /* 获取是否绑定用户 */
-void uapi_ln_set_device_bound(void)
+void uapi_ln_set_device_bound(int val)
 {
-    g_ln_is_device_bound = 1;
+    g_ln_is_device_bound = val;
 }
 
 /* 获取设备角色配置 */
@@ -486,213 +475,112 @@ static void handle_ota_download_msg(const OtaDownloadMsg *msg)
 
 
 /* ============================ WebSocket 业务消息 上层处理 ============================ */
-void ln_ws_process_message(int cmd, const char *json_str)
+void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type)
 {
-    if (!json_str) 
-    {
-        printf("[WS] invalid json string\n");
-        return;
-    }
-    
-    cJSON *root = cJSON_Parse(json_str);
-    if (!root) 
+    if (!data_msg || !data_msg->raw_json)
     {
-        printf("[WS] parse json failed\n");
+        printf("[WS] invalid data message\n");
         return;
     }
-    const cJSON *msgId = cJSON_GetObjectItem(root, "messageId");
-    const cJSON *command = cJSON_GetObjectItem(root, "command");
-    const char *message_id = (msgId && cJSON_IsString(msgId)) ? msgId->valuestring : NULL;
-    const char *cmd_str = (command && cJSON_IsString(command)) ? command->valuestring : "";
 
-    printf("[WS] cmd=%d message_id=%s cmd_str=%s\n", cmd, message_id, cmd_str);
+    const char *json_str = data_msg->raw_json;
+    const char *message_id = data_msg->message_id;
+    const char *cmd_str = data_msg->command_str;
 
-    switch (cmd) {
-        case LN_WS_RECV_CHARACTER_CHANGE: {
+    printf("[WS] cmd=%d message_id=%s cmd_str=%s\n", (int)type, message_id ? message_id : "", cmd_str ? cmd_str : "");
+
+    switch (type) {
+        case WS_CMD_CHARACTER_CHANGE: {
             printf("[WS] CharacterChange:角色切换\n");
             break;
         }
-        case LN_WS_RECV_CHARACTER_CONFIG_CHANGE: {
+        case WS_CMD_CHARACTER_CONFIG_CHANGE: {
             printf("[WS] CharacterConfigChange:角色配置更改(CharacterConfigChange)\n");
-            // 通知设备切换到指定角色
             if(json_str)
             {
-                ln_parse_character_config(json_str, strlen(json_str));
+                ln_parse_character_config(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_SLEEP_MODE_START: {
+        case WS_CMD_SLEEP_MODE_START: {
             printf("[WS] SleepModeStart:哄睡模式开始\n");
-            // 通知设备开始哄睡
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_003",
-                //     "command": "SleepModeStart",
-                //     "data": {
-                //       "storyTheme": "爱情故事" //故事主题
-                //     }
-                // }
-                // ln_parse_sleep_mode_start(json_str, strlen(json_str));
+                // ln_parse_sleep_mode_start(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_SLEEP_MODE_END: {
+        case WS_CMD_SLEEP_MODE_END: {
             printf("[WS] SleepModeEnd:哄睡模式结束\n");
-            // 通知设备结束哄睡
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_004",
-                //     "command": "SleepModeEnd",
-                //     "data": {}
-                // }
-                // ln_parse_sleep_mode_end(json_str, strlen(json_str));
+                // ln_parse_sleep_mode_end(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_DEVICE_BIND: {
+        case WS_CMD_DEVICE_BIND: {
             printf("[WS] DeviceBind:设备绑定\n");
-            // 通知设备已被用户绑定
+            uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_BOUND);
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_007",
-                //     "command": "DeviceBind",
-                //     "data": {
-                //       "userId": "user_001",
-                //       "userName": "张三",
-                //       "bindTime": 1640995200
-                //     }
-                // }
-                // ln_parse_device_bind(json_str, strlen(json_str));
+                // ln_parse_device_bind(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_DEVICE_UNBIND: {
+        case WS_CMD_DEVICE_UNBIND: {
             printf("[WS] DeviceUnbind:设备解绑\n");
-            // 通知设备已被用户解绑
+            do_restore_factory_setting();
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_008",
-                //     "command": "DeviceUnbind",
-                //     "data": {
-                //       "userId": "user_001",
-                //       "reason": "用户主动解绑",
-                //       "unbindTime": 1640995200
-                //     }
-                // }
-                // ln_parse_device_unbind(json_str, strlen(json_str));
+                // ln_parse_device_unbind(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_SCHEDULE_REMINDER: {
+        case WS_CMD_SCHEDULE_REMINDER: {
             printf("[WS] ScheduleReminder:日程提醒\n");
-            // 推送日程提醒信息
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_009",
-                //     "command": "ScheduleReminder",
-                //     "data": {
-                //       "scheduleId": 123,
-                //       "deviceId": "DEVICE_001",
-                //       "scheduleName": "开会提醒",
-                //       "reminderContent": "您有一个会议即将开始,请准备参加",
-                //       "reminderAudioUrl": "https://example.com/reminder/reminder_001.mp3",
-                //       "enableVoice": 1,
-                //       "enableVibration": 1
-                //     }
-                // }
-                ln_parse_schedule_reminder(json_str, strlen(json_str));
+                ln_parse_schedule_reminder(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_SCHEDULE_REMINDER_CFG: {
+        case WS_CMD_SCHEDULE_REMINDER_CFG: {
             printf("[WS] ScheduleReminderConfig:日程提醒配置\n");
-            // 推送日程提醒配置
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_009",
-                //     "command": "ScheduleReminderConfig",
-                //     "data": {
-                //       "scheduleName": "七点起床"
-                //     }
-                // }
-                ln_parse_schedule_reminder_config(json_str, strlen(json_str));
+                ln_parse_schedule_reminder_config(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_DOWNLOAD_EMOJI: {
+        case WS_CMD_DOWNLOAD_EMOJI: {
             printf("[WS] DownloadEmoji:下载表情\n");
-            // 下载表情
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_011",
-                //     "command": "DownloadEmoji",
-                //     "data": {
-                //       "characterId": "char_001",
-                //       "eyesColor": "blue",
-                //       "eyesShape": "calm-eyes",
-                //       "emotionEmojis": [
-                //         {
-                //           "emotion": "happy",
-                //           "emojiUrl": "https://example.com/emoji/happy.mp4"
-                //         },
-                //         {
-                //           "emotion": "sad",
-                //           "emojiUrl": "https://example.com/emoji/sad.mp4"
-                //         }
-                //       ]
-                //     }
-                // }
-                // ln_parse_download_emoji(json_str, strlen(json_str));
+                // ln_parse_download_emoji(json_str, (int)strlen(json_str));
             }
             break;
         }
-        case LN_WS_RECV_DELETE_EMOJI: {
+        case WS_CMD_DELETE_EMOJI: {
             printf("[WS] DeleteEmoji:删除表情\n");
-            // 删除表情
             if(json_str)
             {
-                // {
-                //     "deviceId": "DEVICE_001",
-                //     "timestamp": 1640995200,
-                //     "messageId": "msg_012",
-                //     "command": "DeleteEmoji",
-                //     "data": {
-                //       "characterId": "char_001",
-                //       "eyesColor": "blue",
-                //       "eyesShape": "calm-eyes"
-                //     }
-                // }
-                // ln_parse_delete_emoji(json_str, strlen(json_str));
+                // ln_parse_delete_emoji(json_str, (int)strlen(json_str));
             }
             break;
         }
+        case WS_CMD_PING: {
+            printf("[WS] Ping\n");
+            break;
+        }
+        case WS_CMD_PONG: {
+            printf("[WS] Pong\n");
+            break;
+        }
         default: {
-            printf("[WS] Unknown command=%s\n", cmd_str);
+            printf("[WS] Unknown command=%s\n", cmd_str ? cmd_str : "");
             break;
         }
     }
-    cJSON_Delete(root);
 }
 /* ============================ WebSocket 业务消息 上层处理 End============================ */
 
@@ -1189,17 +1077,30 @@ static void ln_http_server_send_task(void const *arg)
         if (mail.cmd == LN_HTTP_SERVICE_CMD_GET_DEVICE_TOKEN)
         {
             printf("LN_HTTP_SERVICE_CMD_GET_DEVICE_TOKEN:获取雷鸟设备Token\n");
-            ln_get_device_token_http(uapi_ln_get_device_id(), uapi_ln_get_device_iccid(), uapi_ln_get_device_model(), uapi_ln_get_device_version());
+            uint32_t ret = ln_get_device_token_http(uapi_ln_get_device_id(), uapi_ln_get_device_iccid(), uapi_ln_get_device_model(), uapi_ln_get_device_version());
+            if (ret == ERRCODE_SUCC) 
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN_HTTP_SERVER_SEND_TASK] 获取雷鸟设备Token成功\n");
+                ret = ln_ws_start(ln_ws_process_message);
+                if (ret != 0)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN_HTTP_SERVER_SEND_TASK] 启动WebSocket失败: %d\n", ret);
+                }
+            } 
+            else 
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN_HTTP_SERVER_SEND_TASK] 获取雷鸟设备Token失败\n");
+            }
         }
         else if (mail.cmd == LN_HTTP_SERVICE_CMD_SPEECH_CHAT_STREAM)
         {
             printf("LN_HTTP_SERVICE_CMD_SPEECH_CHAT_STREAM\n");
-            ln_speech_chat_stream_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_speechchat_audio_path());
+            ln_speech_chat_stream_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_audio_path());
         }
         else if (mail.cmd == LN_HTTP_SERVICE_CMD_STORY_CHOOSE)
         {
             printf("LN_HTTP_SERVICE_CMD_STORY_CHOOSE:选择故事\n");
-            ln_story_choose_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_story_choose_audio_path());
+            ln_story_choose_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_audio_path());
         }
         else if (mail.cmd == LN_HTTP_SERVICE_CMD_STORY_RANDOM)
         {
@@ -1231,13 +1132,13 @@ static void ln_http_server_send_task(void const *arg)
             (void)uapi_ln_device_get_user_id(&st, g_ln_device_user_id, sizeof(g_ln_device_user_id));
             /* 将内部状态映射为上层更直观的 0/1/2/3 */
             if (st == LN_DEVICE_BIND_STATUS_UNBOUND ) {
-                g_ln_is_device_bound = 0;//未绑定
+                uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_UNBOUND);//未绑定
             } else if (st == LN_DEVICE_BIND_STATUS_BOUND) {
-                g_ln_is_device_bound = 1;//已绑定
+                uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_BOUND);//已绑定
             } else if (st == LN_DEVICE_BIND_STATUS_AUTH_FAILURE) {
-                g_ln_is_device_bound = 2;//认证失败
+                uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_AUTH_FAILURE);//认证失败
             } else {
-                g_ln_is_device_bound = 3;//其他错误
+                uapi_ln_set_device_bound(LN_DEVICE_BIND_STATUS_ERROR);//其他错误
                 g_ln_device_user_id[0] = '\0';
             }
             printf("LN_HTTP_SERVICE_CMD_GET_USER_ID:获取设备绑定用户ID: %s\n", uapi_ln_get_user_id());
index d881853..879a716 100644 (file)
@@ -86,19 +86,6 @@ typedef struct
 #define LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD 0x51 /* 触发 OTA 包下载(根据 getTask 的返回 packageUrl)*/
 #define LN_HTTP_RECV_OTA_DOWNLOAD_MSG 0x61    /* 可选:OTA 下载控制消息(JSON)接收)*/
 
-/* WebSocket 业务消息接收命令(供 WS 回调上报分类使用)*/
-#define LN_WS_RECV_UNKNOWN 0x70                 /* 未知命令 */
-#define LN_WS_RECV_CHARACTER_CHANGE 0x71        /* 角色切换 (CharacterChange) */
-#define LN_WS_RECV_CHARACTER_CONFIG_CHANGE 0x72 /* 角色配置更改 (CharacterConfigChange) */
-#define LN_WS_RECV_SLEEP_MODE_START 0x73        /* 哄睡模式开始 (SleepModeStart) */
-#define LN_WS_RECV_SLEEP_MODE_END 0x74          /* 哄睡模式结束 (SleepModeEnd) */
-#define LN_WS_RECV_DEVICE_BIND 0x75             /* 设备绑定 (DeviceBind) */
-#define LN_WS_RECV_DEVICE_UNBIND 0x76           /* 设备解绑 (DeviceUnbind) */
-#define LN_WS_RECV_SCHEDULE_REMINDER 0x77       /* 日程提醒 (ScheduleReminder) */
-#define LN_WS_RECV_SCHEDULE_REMINDER_CFG 0x78   /* 日程提醒配置 (ScheduleReminderConfig) */
-#define LN_WS_RECV_DOWNLOAD_EMOJI 0x79          /* 下载表情 (DownloadEmoji) */
-#define LN_WS_RECV_DELETE_EMOJI 0x7A            /* 删除表情 (DeleteEmoji) */
-
 /* 音频播放相关命令 */
 #define LN_HTTP_SERVICE_CMD_AUDIO_PLAY 0x1001      /* 播放音频 */
 #define LN_HTTP_SERVICE_CMD_AUDIO_STOP 0x1002      /* 停止播放音频 */
@@ -208,16 +195,14 @@ void uapi_ln_clear_device_token(void);
 int uapi_ln_ota_get_update_type(void);
 /* OTA 下载保存的最后一个文件路径(无则返回NULL)*/
 const char *uapi_ln_ota_get_saved_path(void);
-/* 获取语音对话流录音音频路径 */
-const char *uapi_ln_get_speechchat_audio_path(void);
-/* 获取选择故事录音音频路径 */
-const char *uapi_ln_get_story_choose_audio_path(void);
+/* 获取选择录音音频路径 */
+const char *uapi_ln_get_audio_path(void);
 /* 音频下载/播放控制 */
 void uapi_ln_audio_download_is_cancel(int status);
 /* 获取是否绑定用户 */
-uint32_t uapi_ln_is_device_bound(void);
+int uapi_ln_is_device_bound(void);
 /* 设置是否绑定用户 */
-void uapi_ln_set_device_bound(void);
+void uapi_ln_set_device_bound(int val);
 /* 获取设备绑定用户ID */
 const char *uapi_ln_get_user_id(void);
 /* 获取设备角色配置 */
@@ -326,20 +311,20 @@ uint32_t ln_emoji_report_all_http(const char *device_id,
 
 /* WebSocket命令枚举 */
 typedef enum {
-    WS_CMD_UNKNOWN = 0,
-    WS_CMD_CHARACTER_CHANGE,
-    WS_CMD_CHARACTER_CONFIG_CHANGE,
-    WS_CMD_SLEEP_MODE_START,
-    WS_CMD_SLEEP_MODE_END,
-    WS_CMD_DEVICE_BIND,
-    WS_CMD_DEVICE_UNBIND,
-    WS_CMD_SCHEDULE_REMINDER,
-    WS_CMD_SCHEDULE_REMINDER_CFG,
-    WS_CMD_DOWNLOAD_EMOJI,
-    WS_CMD_DELETE_EMOJI,
-    WS_CMD_PING,
-    WS_CMD_PONG,
-    WS_CMD_MAX
+    WS_CMD_UNKNOWN = 0,               /* 未知命令 */
+    WS_CMD_CHARACTER_CHANGE,         /* 角色切换 (CharacterChange) */   
+    WS_CMD_CHARACTER_CONFIG_CHANGE, /* 角色配置更改 (CharacterConfigChange) */
+    WS_CMD_SLEEP_MODE_START,         /* 哄睡模式开始 (SleepModeStart) */
+    WS_CMD_SLEEP_MODE_END,           /* 哄睡模式结束 (SleepModeEnd) */
+    WS_CMD_DEVICE_BIND,              /* 设备绑定 (DeviceBind) */
+    WS_CMD_DEVICE_UNBIND,            /* 设备解绑 (DeviceUnbind) */
+    WS_CMD_SCHEDULE_REMINDER,        /* 日程提醒 (ScheduleReminder) */
+    WS_CMD_SCHEDULE_REMINDER_CFG,    /* 日程提醒配置 (ScheduleReminderConfig) */
+    WS_CMD_DOWNLOAD_EMOJI,           /* 下载表情 (DownloadEmoji) */
+    WS_CMD_DELETE_EMOJI,             /* 删除表情 (DeleteEmoji) */
+    WS_CMD_PING,                     /* 心跳 (Ping) */
+    WS_CMD_PONG,                     /* 心跳回应 (Pong) */
+    WS_CMD_MAX                       /* 最大命令 */
 } ws_command_t;
 
 /* 消息数据结构 */
@@ -355,6 +340,10 @@ typedef struct {
 /* 消息处理回调函数类型 */
 typedef void (*ws_message_callback_t)(const ws_data_msg_t *data_msg, ws_command_t type);
 
+/* -------------------------------- 注册进的回调函数 -------------------------------- */
+void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type);
+/* -------------------------------------------------------------------------- */
+
 /* WebSocket接口函数 */
 int ln_ws_start(ws_message_callback_t callback);
 int ln_ws_send_text(const char *text);