From: luozheng <1732036298@qq.com> Date: Sun, 28 Sep 2025 12:57:28 +0000 (+0800) Subject: 验证屏保图片下载带ui验证 X-Git-Tag: V1.0.9_20251128_194606_LN~294^2~3 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=75dea552ea63ef758277d8c9ecd26dd0426725b3;p=mirrors%2FFD230.git 验证屏保图片下载带ui验证 --- diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 86d93250c..784d74714 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -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"); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index b8bfe77a7..5c3695c59 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -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); /* 解析日程提醒配置 */ diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c index 295b71b76..fd0589749 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_device_info.c @@ -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: