case OTA_DOWNLOAD_STATUS_PROGRESS:
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] 下载进度: %d%%", msg->progress);
push_ota_progress(msg->progress);
+ /* 上报升级进度 */
+ if (g_ln_last_update_id && g_ln_last_update_id[0] != '\0') {
+ char progress_msg[128];
+ snprintf(progress_msg, sizeof(progress_msg), "升级进度%d%%", msg->progress);
+ ln_ws_send_device_upgrade_status_report(g_ln_last_update_id, "UPGRADING", msg->progress, progress_msg);
+ }
break;
case OTA_DOWNLOAD_STATUS_COMPLETED:
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] 下载完成,文件路径: %s", msg->file_path);
int md5_ok = ln_ota_is_md5_ok(msg->file_path, msg->md5);
if (md5_ok == 1) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] MD5校验成功,准备重启升级");
+ /* 上报升级成功状态(注意:设备即将重启,此消息可能无法发送,但尝试发送) */
+ if (g_ln_last_update_id && g_ln_last_update_id[0] != '\0') {
+ ln_ws_send_device_upgrade_status_report(g_ln_last_update_id, "SUCCESS", 100, "升级包下载完成,MD5校验成功,准备重启升级");
+ }
uapi_delete_files(LN_TOKEN_FILE);//删除旧版本的token文件
push_ota_status(OTA_UI_STATUS_SUCCESS);
(void)uaip_cmd_update_request();
} else if (md5_ok == 0) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] MD5校验失败,建议重新下载");
+ /* 上报升级失败状态 */
+ if (g_ln_last_update_id && g_ln_last_update_id[0] != '\0') {
+ ln_ws_send_device_upgrade_status_report(g_ln_last_update_id, "FAILED", 0, "MD5校验失败,建议重新下载");
+ }
uapi_ln_remove_vote();
push_ota_status(OTA_UI_STATUS_FAILED);
/* 清除OTA下载状态 */
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] MD5校验失败,清除下载状态保护");
} else {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] MD5校验出错");
+ /* 上报升级失败状态 */
+ if (g_ln_last_update_id && g_ln_last_update_id[0] != '\0') {
+ ln_ws_send_device_upgrade_status_report(g_ln_last_update_id, "FAILED", 0, "MD5校验出错");
+ }
uapi_ln_remove_vote();
push_ota_status(OTA_UI_STATUS_FAILED);
/* 清除OTA下载状态 */
break;
case OTA_DOWNLOAD_STATUS_FAILED:
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"[OTA_DOWNLOAD] 下载失败: %s", msg->error_msg);
+ /* 上报升级失败状态 */
+ if (g_ln_last_update_id && g_ln_last_update_id[0] != '\0') {
+ char error_msg[256];
+ snprintf(error_msg, sizeof(error_msg), "下载失败: %s", msg->error_msg);
+ ln_ws_send_device_upgrade_status_report(g_ln_last_update_id, "FAILED", 0, error_msg);
+ }
uapi_ln_remove_vote();
push_ota_status(OTA_UI_STATUS_FAILED);
/* 清除OTA下载状态 */
(packageMd5 && cJSON_IsString(packageMd5)) ? packageMd5->valuestring : "<null>",
(description && cJSON_IsString(description)) ? description->valuestring : "<null>");
/* 记录必要字段供后续 AT^LN_OTA_DOWNLOAD 使用 */
+ if (g_ln_last_update_id) { free(g_ln_last_update_id); g_ln_last_update_id = NULL; }
if (g_ln_last_target_version) { free(g_ln_last_target_version); g_ln_last_target_version = NULL; }
if (g_ln_last_package_url) { free(g_ln_last_package_url); g_ln_last_package_url = NULL; }
if (g_ln_last_package_md5) { free(g_ln_last_package_md5); g_ln_last_package_md5 = NULL; }
g_ln_last_package_size = 0;
+
+ /* 保存 updateId,用于状态上报 */
+ if (updateId && (cJSON_IsString(updateId) || cJSON_IsNumber(updateId))) {
+ char update_id_str[64] = {0};
+ if (cJSON_IsString(updateId)) {
+ snprintf(update_id_str, sizeof(update_id_str), "%s", updateId->valuestring);
+ } else if (cJSON_IsNumber(updateId)) {
+ snprintf(update_id_str, sizeof(update_id_str), "%d", (int)updateId->valuedouble);
+ }
+ if (update_id_str[0] != '\0') {
+ size_t len = strlen(update_id_str);
+ g_ln_last_update_id = (char *)malloc(len + 1);
+ if (g_ln_last_update_id) {
+ memcpy(g_ln_last_update_id, update_id_str, len + 1);
+ }
+ }
+ }
if (targetVersion && cJSON_IsString(targetVersion)) {
size_t len = strlen(targetVersion->valuestring);
g_ln_last_target_version = (char *)malloc(len + 1);
description->valuestring);
/* 记录必要字段供后续 AT^LN_OTA_DOWNLOAD 使用 */
+ if (g_ln_last_update_id) { free(g_ln_last_update_id); g_ln_last_update_id = NULL; }
if (g_ln_last_target_version) { free(g_ln_last_target_version); g_ln_last_target_version = NULL; }
if (g_ln_last_package_url) { free(g_ln_last_package_url); g_ln_last_package_url = NULL; }
if (g_ln_last_package_md5) { free(g_ln_last_package_md5); g_ln_last_package_md5 = NULL; }
g_ln_last_package_md5 = (char *)malloc(len + 1);
if (g_ln_last_package_md5) memcpy(g_ln_last_package_md5, packageMd5->valuestring, len + 1);
}
+
+ /* 保存 updateId,用于状态上报 */
+ if (updateId && (cJSON_IsString(updateId) || cJSON_IsNumber(updateId))) {
+ char update_id_str[64] = {0};
+ if (cJSON_IsString(updateId)) {
+ snprintf(update_id_str, sizeof(update_id_str), "%s", updateId->valuestring);
+ } else if (cJSON_IsNumber(updateId)) {
+ snprintf(update_id_str, sizeof(update_id_str), "%d", (int)updateId->valuedouble);
+ }
+ if (update_id_str[0] != '\0') {
+ size_t len = strlen(update_id_str);
+ g_ln_last_update_id = (char *)malloc(len + 1);
+ if (g_ln_last_update_id) {
+ memcpy(g_ln_last_update_id, update_id_str, len + 1);
+ }
+ }
+ }
if (description && cJSON_IsString(description)) {
const char *description_ = description->valuestring;
/* 设置OTA下载状态,防止被打断 */
uapi_ln_set_ota_downloading(1);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[OTA_DOWNLOAD] 开始OTA升级包下载,设置下载状态保护");
+
+ /* 上报升级开始状态 */
+ if (g_ln_last_update_id && g_ln_last_update_id[0] != '\0') {
+ ln_ws_send_device_upgrade_status_report(g_ln_last_update_id, "UPGRADING", 0, "开始下载升级包");
+ }
/* 固定保存到统一升级包路径 */
size_t sp_cap = strlen(UPG_FILE_NAME) + 1;
printf("UPG_FILE_NAME:%s\n",UPG_FILE_NAME);
free(save_path);
return ERRCODE_SUCC;
}
+
+/* 发送设备升级状态上报 DeviceUpgradeStatusReport */
+int ln_ws_send_device_upgrade_status_report(const char *update_id, const char *status, int progress, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send DeviceUpgradeStatusReport, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "upgrade_status_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "DeviceUpgradeStatusReport");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddStringToObject(data, "updateId", (update_id && update_id[0]) ? update_id : "");
+ cJSON_AddStringToObject(data, "status", (status && status[0]) ? status : "UPGRADING");
+
+ /* progress 仅在 status 为 UPGRADING 时有效 */
+ if (status && strcmp(status, "UPGRADING") == 0)
+ {
+ cJSON_AddNumberToObject(data, "progress", progress);
+ }
+
+ cJSON_AddStringToObject(data, "message", msg ? msg : "");
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent DeviceUpgradeStatusReport: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
\ No newline at end of file