验证屏保图片下载带ui验证
authorluozheng <1732036298@qq.com>
Sun, 28 Sep 2025 12:57:28 +0000 (20:57 +0800)
committerluozheng <1732036298@qq.com>
Sun, 28 Sep 2025 12:57:28 +0000 (20:57 +0800)
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_device_info.c

index 86d9325..784d747 100644 (file)
@@ -354,6 +354,11 @@ int uapi_ln_download_file(const char *url, const char *save_path)
                 total_written += written;
             }
         }
+        else 
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DOWNLOAD] recv_res = %d, break", recv_res);
+            break;
+        }
     } while (client_data.isMore);
 
     if (client_data.responseContentLen == 0)
@@ -461,19 +466,11 @@ void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type)
         case WS_CMD_DEVICE_BIND: {
             printf("[WS] DeviceBind:设备绑定\n");
             push_bind_and_unbind_notification(LN_DEVICE_BIND_STATUS_BOUND);
-            if(json_str)
-            {
-                // ln_parse_device_bind(json_str, (int)strlen(json_str));
-            }
             break;
         }
         case WS_CMD_DEVICE_UNBIND: {
             printf("[WS] DeviceUnbind:设备解绑\n");
             push_bind_and_unbind_notification(LN_DEVICE_BIND_STATUS_UNBOUND);
-            if(json_str)
-            {
-                // ln_parse_device_unbind(json_str, (int)strlen(json_str));
-            }
             break;
         }
         case WS_CMD_SCHEDULE_REMINDER: {
@@ -1090,6 +1087,35 @@ static void ln_http_server_send_task(void const *arg)
             printf("LN_HTTP_SERVICE_CMD_EMOJI_REPORT_ALL:上报所有角色表情组状态\n");
             // ln_emoji_report_all(mail.data);
         }
+        else if (mail.cmd == LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE)
+        {
+            printf("LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE:下载屏保文件\n");
+            if(mail.data)
+            {
+                ln_download_file_req_t req;
+                memcpy(&req, mail.data, sizeof(req));
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载URL: %s, 保存路径: %s", req.url, req.save_path);
+                errcode_t ret = uapi_ln_download_file(req.url, req.save_path);
+                if (ERRCODE_SUCC != ret)
+                {
+                    int i = 1;
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载失败,重试3次,第%d次", i);
+                    // 如果下载失败重试3次
+                    for (i = 1; i <= 3; i++)
+                    {
+                        ret = uapi_ln_download_file(req.url, req.save_path);
+                        if (ERRCODE_SUCC == ret)
+                        {
+                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载成功,第%d次", i);
+                            break;
+                        }
+                    }
+                }
+                /* 释放由发送方分配的指针 */
+                if (req.url) { free(req.url); req.url = NULL; }
+                if (req.save_path) { free(req.save_path); req.save_path = NULL; }
+            }
+        }
         if (mail.data != NULL)
         {
             printf("free(mail.data)\n");
index b8bfe77..5c3695c 100644 (file)
@@ -109,6 +109,15 @@ typedef struct
 #define LN_HTTP_SERVICE_CMD_EMOJI_REPORT 0x1007      /*上报角色表情组下载状态*/
 #define LN_HTTP_SERVICE_CMD_EMOJI_REPORT_ALL 0x1008  /*上报所有角色表情组状态*/
 
+/* 屏保下载文件相关命令 */
+#define LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE 0x1009 /* 下载屏保文件 */ 
+/* 下载文件相关结构体 */
+typedef struct
+{
+    char *url;       /* 下载URL,使用malloc分配,接收方负责free */
+    char *save_path; /* 保存路径,使用malloc分配,接收方负责free */
+} ln_download_file_req_t;
+
 /* 故事-随机故事 请求体(可选主题)*/
 typedef struct
 {
@@ -229,10 +238,6 @@ void ln_parse_character_config(const char *json_buf, int json_len);
 void ln_parse_sleep_mode_start(const char *json_str, int json_len);
 /* 解析哄睡模式结束 */
 void ln_parse_sleep_mode_end(const char *json_str, int json_len);
-/* 解析设备绑定 */
-void ln_parse_device_bind(const char *json_str, int json_len);
-/* 解析设备解绑 */
-void ln_parse_device_unbind(const char *json_str, int json_len);
 /* 解析日程提醒 */
 void ln_parse_schedule_reminder(const char *json_str, int json_len);
 /* 解析日程提醒配置 */
index 295b71b..fd05897 100644 (file)
@@ -142,10 +142,13 @@ void ln_parse_character_config(const char *json_buf, int json_len)
     }
 
     cJSON *errorCode = cJSON_GetObjectItem(root, "errorCode");
+    cJSON *message = cJSON_GetObjectItem(root, "message");
     if (errorCode && !cJSON_IsNull(errorCode))
     {
-        printf("[DEVICE_CHARACTER] server error: %s\n",
-               cJSON_IsString(errorCode) ? errorCode->valuestring : "unknown");
+        printf("[DEVICE_CHARACTER] server error: %s\n",cJSON_IsString(errorCode) ? errorCode->valuestring : "unknown");
+        printf("[DEVICE_CHARACTER] server message: %s\n",cJSON_IsString(message) ? message->valuestring : "unknown");
+        // 推送协议错误通知到UI
+        push_api_error_notification(cJSON_IsString(message) ? message->valuestring : "unknown");
         cJSON_Delete(root);
         free(text);
         return;
@@ -169,6 +172,19 @@ void ln_parse_character_config(const char *json_buf, int json_len)
     ln_assign_dup(&g_ln_character_config.character_name,
                   (cname && cJSON_IsString(cname)) ? cname->valuestring : "");
 
+
+    // "data": {
+    // "characterId": "char_001",
+    // "characterName": "小艾",
+    // "characterAvatar": {
+    //   "eyesShape": "upturned-eyes",
+    //   "hairColor": "blue",
+    //   "eyesColor": "green",
+    //   "hairStyle": "side-parted-comma",
+    //   "deviceScreen": "https://example.com/new_avatar.bin",
+    //   "screenImageAsEmoji": true
+    // }
+
     /* 头像配置 */
     cJSON *avatar = cJSON_GetObjectItem(data, "characterAvatar");
     if (avatar && cJSON_IsObject(avatar))
@@ -177,8 +193,8 @@ void ln_parse_character_config(const char *json_buf, int json_len)
         cJSON *eyesColor = cJSON_GetObjectItem(avatar, "eyesColor");
         cJSON *hairStyle = cJSON_GetObjectItem(avatar, "hairStyle");
         cJSON *eyesShape = cJSON_GetObjectItem(avatar, "eyesShape");
-        cJSON *screenImage = cJSON_GetObjectItem(avatar, "screenImage");
-        cJSON *screenImageAsEmoji = cJSON_GetObjectItem(avatar, "screenImageAsEmoji");
+        cJSON *deviceScreen = cJSON_GetObjectItem(avatar, "deviceScreen");
+        cJSON *deviceScreenAsEmoji = cJSON_GetObjectItem(avatar, "screenImageAsEmoji");
 
         ln_assign_dup(&g_ln_character_config.avatar_hair_color,
                       (hairColor && cJSON_IsString(hairColor)) ? hairColor->valuestring : "");
@@ -193,10 +209,10 @@ void ln_parse_character_config(const char *json_buf, int json_len)
                       (eyesShape && cJSON_IsString(eyesShape)) ? eyesShape->valuestring : "");
 
         ln_assign_dup(&g_ln_character_config.avatar_screen_image,
-                      (screenImage && cJSON_IsString(screenImage)) ? screenImage->valuestring : "");
+                      (deviceScreen && cJSON_IsString(deviceScreen)) ? deviceScreen->valuestring : "");
 
         g_ln_character_config.avatar_screen_image_as_emoji =
-            (screenImageAsEmoji && cJSON_IsBool(screenImageAsEmoji)) ? (cJSON_IsTrue(screenImageAsEmoji) ? 1 : 0) : 0;
+            (deviceScreenAsEmoji && cJSON_IsBool(deviceScreenAsEmoji)) ? (cJSON_IsTrue(deviceScreenAsEmoji) ? 1 : 0) : 0;
     }
     else
     {
@@ -226,30 +242,31 @@ void ln_parse_character_config(const char *json_buf, int json_len)
     printf("  avatar_screen_image_as_emoji: %d\n", g_ln_character_config.avatar_screen_image_as_emoji);
 
     // 如果屏保图片不为空,则保存到本地
-    int ret = ERRCODE_SUCC;
-    if (g_ln_character_config.avatar_screen_image)
+    if (g_ln_character_config.avatar_screen_image && strlen(g_ln_character_config.avatar_screen_image) > 0 
+        && g_ln_character_config.avatar_screen_image_as_emoji == 1)
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保图片不为空,下载屏保图片");
         // 下载屏保图片,eg:"https://example.com/new_avatar.bin"
-        ret = uapi_ln_download_file(g_ln_character_config.avatar_screen_image, LN_DEVICE_SCREEN_IMAGE_FILE);
-        if (ERRCODE_SUCC != ret)
+        ln_download_file_req_t req;
+        memset(&req, 0, sizeof(req));
+        /* 分配与拷贝,发送方分配,接收方负责释放 */
+        if (g_ln_character_config.avatar_screen_image) {
+            size_t ulen = strlen(g_ln_character_config.avatar_screen_image);
+            req.url = (char *)malloc(ulen + 1);
+            if (req.url) {
+                memcpy(req.url, g_ln_character_config.avatar_screen_image, ulen + 1);
+            }
+        }
         {
-            int i = 1;
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载失败,重试3次,第%d次", i);
-            // 如果下载失败重试3次
-            for (i = 1; i <= 3; i++)
-            {
-                ret = uapi_ln_download_file(g_ln_character_config.avatar_screen_image, LN_DEVICE_SCREEN_IMAGE_FILE);
-                if (ERRCODE_SUCC == ret)
-                {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载成功,第%d次", i);
-                    break;
-                }
+            const char *save = LN_DEVICE_SCREEN_IMAGE_FILE;
+            size_t slen = strlen(save);
+            req.save_path = (char *)malloc(slen + 1);
+            if (req.save_path) {
+                memcpy(req.save_path, save, slen + 1);
             }
         }
-    }
-    if (ERRCODE_SUCC != ret)
-    {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] 屏保下载失败,最终失败");
+        do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_DOWNLOAD_SCREEN_IMAGE, (char *)&req, sizeof(req));
+
     }
 
     /* 推送角色配置更改通知 */
@@ -259,7 +276,7 @@ void ln_parse_character_config(const char *json_buf, int json_len)
                                               g_ln_character_config.avatar_hair_color,
                                               g_ln_character_config.avatar_eyes_color,
                                               g_ln_character_config.avatar_hair_style,
-                                              ret == ERRCODE_SUCC ? 1 : 0);
+                                              g_ln_character_config.avatar_screen_image_as_emoji);
 
     cJSON_Delete(root);
     free(text);
@@ -321,17 +338,13 @@ uint32_t ln_device_get_character_http(const char *device_id,
     if (code != 200)
     {
         printf("device getCharacter: HTTP %d\n", code);
-        if (clientData.responseBuf && clientData.responseBufLen > 0)
-        {
-            // int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen;
-            printf("device getCharacter: responseBuf=%s\n", clientData.responseBuf);
-        }
         goto end;
     }
 
     if (clientData.responseBuf && clientData.responseBufLen > 0)
     {
         int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen;
+        ln_parse_character_config(clientData.responseBuf, real_len);
     }
 
 end: