From f1e5e9ab7fee73e7e4316bade4c485484656a1b7 Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Wed, 12 Nov 2025 15:45:49 +0800 Subject: [PATCH] =?utf8?q?ln:ota=E4=B8=8B=E8=BD=BD=E4=BC=98=E5=8C=96?= =?utf8?q?=EF=BC=8C=E6=AD=A3=E5=9C=A8=E4=B8=8B=E8=BD=BDOTA=E5=8D=87?= =?utf8?q?=E7=BA=A7=E5=8C=85=EF=BC=8C=E4=B8=8D=E5=A4=84=E7=90=86=E4=B8=9A?= =?utf8?q?=E5=8A=A1=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 19 ++++++++++++ code/sdk/zhihui/leiniao/imsl_ln/ln_api.h | 4 +++ code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c | 32 ++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 92ed8ed00..548ffc51d 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -44,6 +44,7 @@ char g_ln_device_user_id[64] = {0}; // 设备绑定用户ID static int g_ln_is_file_downloading = 0; // 是否正在下载文件 char g_ln_character_id[64] = {0}; // 角色ID static int g_ln_file_download_type = LN_FILE_DOWNLOAD_TYPE_NONE; // 文件下载类型 +static int g_ln_is_ota_downloading = 0; // 是否正在下载OTA升级包 /* 简单的字符串读写(以.bin形式读写原始字节,末尾补'\0')*/ static int ln_read_string_file(const char *file_path, char **out_str) @@ -407,6 +408,18 @@ void uapi_ln_set_file_download_type(int type) g_ln_file_download_type = type; } +/* 获取当前是否正在下载OTA升级包 */ +int uapi_ln_is_ota_downloading(void) +{ + return g_ln_is_ota_downloading; +} + +/* 设置OTA下载状态(内部使用) */ +void uapi_ln_set_ota_downloading(int downloading) +{ + g_ln_is_ota_downloading = downloading; +} + /* 获取ota包大小 */ static int g_ln_ota_package_size = 0; int uapi_ln_get_ota_package_size(void) @@ -930,6 +943,12 @@ void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type) // printf("[WS] cmd=%d message_id=%s cmd_str=%s\n", (int)type, message_id ? message_id : "", cmd_str ? cmd_str : ""); + if (uapi_ln_is_ota_downloading() == 1) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[WS] 正在下载OTA升级包,不处理业务消息"); + return; + } + switch (type) { case WS_CMD_CHARACTER_CHANGE: diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index e401444ef..5959587b3 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -252,6 +252,10 @@ int uapi_ln_is_file_downloading(void); int uapi_ln_get_file_download_type(void); //设置当前文件下载类型 void uapi_ln_set_file_download_type(int type); +/* 获取当前是否正在下载OTA升级包 */ +int uapi_ln_is_ota_downloading(void); +/* 设置OTA下载状态(内部使用) */ +void uapi_ln_set_ota_downloading(int downloading); /* 获取ota包大小 */ int uapi_ln_get_ota_package_size(void); /* 设置ota包大小 */ diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c index 9695c3e92..0e26b43e1 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_ota.c @@ -100,10 +100,16 @@ static void ln_ota_handle_download_msg(const OtaDownloadMsg *msg) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] MD5校验失败,建议重新下载"); uapi_pm_remove_sleep_veto(PM_ID_DEBUG); push_ota_status(OTA_UI_STATUS_FAILED); + /* 清除OTA下载状态 */ + uapi_ln_set_ota_downloading(0); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] MD5校验失败,清除下载状态保护"); } else { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] MD5校验出错"); uapi_pm_remove_sleep_veto(PM_ID_DEBUG); push_ota_status(OTA_UI_STATUS_FAILED); + /* 清除OTA下载状态 */ + uapi_ln_set_ota_downloading(0); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] MD5校验出错,清除下载状态保护"); } } break; @@ -111,6 +117,9 @@ static void ln_ota_handle_download_msg(const OtaDownloadMsg *msg) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] 下载失败: %s", msg->error_msg); uapi_pm_remove_sleep_veto(PM_ID_DEBUG); push_ota_status(OTA_UI_STATUS_FAILED); + /* 清除OTA下载状态 */ + uapi_ln_set_ota_downloading(0); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] 下载失败,清除下载状态保护"); break; default: WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] 未知状态: %d", msg->status); @@ -804,17 +813,32 @@ uint32_t ln_ota_download_flow_http(const char *device_id, (void)device_id; (void)device_token; (void)source_version; + + /* 检查是否正在下载OTA升级包,避免重复下载 */ + if (uapi_ln_is_ota_downloading() == 1) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] OTA升级包正在下载中,拒绝重复下载命令"); + return ERRCODE_FAIL; + } + if (!g_ln_last_target_version || !g_ln_last_package_url || g_ln_last_target_version[0] == '\0' || g_ln_last_package_url[0] == '\0') { printf("[OTA] no cached task to download, please GET_TASK first\n"); return ERRCODE_FAIL; } + + /* 设置OTA下载状态,防止被打断 */ + uapi_ln_set_ota_downloading(1); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] 开始OTA升级包下载,设置下载状态保护"); /* 固定保存到统一升级包路径 */ size_t sp_cap = strlen(UPG_FILE_NAME) + 1; printf("UPG_FILE_NAME:%s\n",UPG_FILE_NAME); char *save_path = (char *)malloc(sp_cap); if (!save_path) { + /* 清除OTA下载状态 */ + uapi_ln_set_ota_downloading(0); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] 内存分配失败,清除下载状态保护"); return ERRCODE_FAIL; } (void)snprintf(save_path, sp_cap, "%s", UPG_FILE_NAME); @@ -849,6 +873,10 @@ uint32_t ln_ota_download_flow_http(const char *device_id, if(remove(save_path) != 0) { printf("[OTA] remove file failed: %s\n", save_path); + /* 清除OTA下载状态 */ + uapi_ln_set_ota_downloading(0); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] 删除旧文件失败,清除下载状态保护"); + free(save_path); return ERRCODE_FAIL; } } @@ -868,6 +896,9 @@ uint32_t ln_ota_download_flow_http(const char *device_id, om.status = OTA_DOWNLOAD_STATUS_FAILED; snprintf(om.error_msg, sizeof(om.error_msg), "%s", "download failed"); ln_ota_handle_download_msg(&om); + /* 清除OTA下载状态 */ + uapi_ln_set_ota_downloading(0); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] 下载失败,清除下载状态保护"); free(save_path); return ERRCODE_FAIL; } @@ -879,6 +910,7 @@ uint32_t ln_ota_download_flow_http(const char *device_id, if (g_ln_last_package_md5) snprintf(om.md5, sizeof(om.md5), "%s", g_ln_last_package_md5); ln_ota_handle_download_msg(&om); } + /* 注意:下载完成后的状态清除在 ln_ota_handle_download_msg 中处理(MD5校验成功后会重启,失败则清除) */ free(save_path); return ERRCODE_SUCC; } -- 2.17.1