From: Caisking <3449750381@qq.com> Date: Wed, 25 Sep 2024 11:03:27 +0000 (+0800) Subject: 增加心率血氧json解析的错误预防处理 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=refs%2Fchanges%2F1017%2F1;p=mirrors%2FFD230.git 增加心率血氧json解析的错误预防处理 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp index 6d9550e4f..4067f5226 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp @@ -113,128 +113,167 @@ namespace OHOS static constexpr const char *HEART_JSON_PATH = "/user/userdata/health/heart.json"; static constexpr const char *BLOOD_JSON_PATH = "/user/userdata/health/blood.json"; - // 读取血氧数据 - BloodOxygenData *HealthService::ReadBloodOxygenData() - { - // 判断文件夹是否存在 - if (!CreateHealthFolder()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file"); - return nullptr; - } - - // 读取文件 - std::ifstream inFile(BLOOD_JSON_PATH); - if (!inFile.is_open()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file"); - return nullptr; - } - - // 读取文件内容到字符串 - std::stringstream buffer; - buffer << inFile.rdbuf(); - std::string jsonDataString = buffer.str(); - const char *jsonData = jsonDataString.c_str(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData); - - // 关闭文件 - inFile.close(); - - if (jsonDataString.empty()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty"); - return nullptr; - } - - cJSON *oxygen_root = cJSON_Parse(jsonData); - if (oxygen_root == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "oxygen_root is empty"); - return nullptr; - } - - BloodOxygenData *data = new BloodOxygenData(); - - cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value"); - cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp"); - - if (value_item && timestamp_item) - { - data->SPO2 = value_item->valueint; - data->timestamp = timestamp_item->valuedouble; - } - else - { - // 读取的数据异常 - cJSON_Delete(oxygen_root); - delete data; - return nullptr; - } - cJSON_Delete(oxygen_root); - return data; + // 读取血氧数据 + BloodOxygenData *HealthService::ReadBloodOxygenData() + { + // 判断文件夹是否存在 + if (!CreateHealthFolder()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder"); + return nullptr; + } + + // 读取文件 + std::ifstream inFile(BLOOD_JSON_PATH); + if (!inFile.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file"); + return nullptr; + } + + // 读取文件内容到字符串 + std::stringstream buffer; + buffer << inFile.rdbuf(); + std::string jsonDataString = buffer.str(); + const char *jsonData = jsonDataString.c_str(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData); + + // 关闭文件 + inFile.close(); + + if (jsonDataString.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty"); + return nullptr; + } + + cJSON *oxygen_root = cJSON_Parse(jsonData); + if (oxygen_root == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data"); + return nullptr; + } + + BloodOxygenData *data = new BloodOxygenData(); + + cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value"); + cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp"); + + // 检查是否存在必要字段,并验证数据类型 + if (value_item && cJSON_IsNumber(value_item) && timestamp_item && cJSON_IsNumber(timestamp_item)) + { + data->SPO2 = value_item->valueint; + data->timestamp = timestamp_item->valuedouble; + + // 进一步验证数据的合理性 + if (data->SPO2 < 0 || data->SPO2 > 100) // 血氧饱和度范围是0-100 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid SPO2 value: %d", data->SPO2); + cJSON_Delete(oxygen_root); + delete data; + return nullptr; + } + } + else + { + // 读取的数据异常 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields"); + cJSON_Delete(oxygen_root); + delete data; + return nullptr; + } + + cJSON_Delete(oxygen_root); + return data; } - // 读取心率数据 - HeartRateData *HealthService::ReadHeartRateData() - { - // 判断文件夹是否存在 - if (!CreateHealthFolder()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file"); - return nullptr; - } - - // 读取文件 - std::ifstream inFile(HEART_JSON_PATH); - if (!inFile.is_open()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file"); - // 创建一个默认值为 0的数据 存储到json里面 ? - return nullptr; - } - - // 读取文件内容到字符串 - std::stringstream buffer; - buffer << inFile.rdbuf(); - std::string jsonDataString = buffer.str(); - const char *jsonData = jsonDataString.c_str(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData); - - // 关闭文件 - inFile.close(); - - if (jsonDataString.empty()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty"); - return nullptr; - } - - cJSON *heart_root = cJSON_Parse(jsonData); - if (heart_root == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heart_root is empty"); - return nullptr; - } - HeartRateData *data = new HeartRateData(); - - cJSON *value_item = cJSON_GetObjectItem(heart_root, "value"); - cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp"); - - if (value_item && timestamp_item) - { - data->Heart = value_item->valueint; - data->timestamp = timestamp_item->valuedouble; - } - else - { - // 读取的数据异常 - cJSON_Delete(heart_root); - delete data; - return nullptr; - } - cJSON_Delete(heart_root); - return data; + // 读取心率数据 + HeartRateData *HealthService::ReadHeartRateData() + { + // 判断文件夹是否存在 + if (!CreateHealthFolder()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder"); + return nullptr; + } + + // 读取文件 + std::ifstream inFile(HEART_JSON_PATH); + if (!inFile.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file, creating default data"); + + // 创建默认值为 0 的数据并存储到 JSON 文件 + HeartRateData defaultData; + defaultData.Heart = 0; // 默认心率值 + defaultData.timestamp = static_cast(time(nullptr)); // 当前时间戳 + + // 创建 JSON 对象并写入文件 + cJSON *defaultRoot = cJSON_CreateObject(); + cJSON_AddNumberToObject(defaultRoot, "value", defaultData.Heart); + cJSON_AddNumberToObject(defaultRoot, "timestamp", defaultData.timestamp); + + // 写入 JSON 文件 + FILE *file = fopen(HEART_JSON_PATH, "w"); + if (file) + { + char *jsonString = cJSON_Print(defaultRoot); + fprintf(file, "%s", jsonString); + fclose(file); + free(jsonString); + } + cJSON_Delete(defaultRoot); + + // 返回默认数据 + HeartRateData *data = new HeartRateData(defaultData); + return data; + } + + // 读取文件内容到字符串 + std::stringstream buffer; + buffer << inFile.rdbuf(); + std::string jsonDataString = buffer.str(); + const char *jsonData = jsonDataString.c_str(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData); + + // 关闭文件 + inFile.close(); + + if (jsonDataString.empty()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty"); + return nullptr; + } + + cJSON *heart_root = cJSON_Parse(jsonData); + if (heart_root == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data"); + return nullptr; + } + + HeartRateData *data = new HeartRateData(); + + cJSON *value_item = cJSON_GetObjectItem(heart_root, "value"); + cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp"); + + // 检查是否存在必要字段,并验证数据类型 + if (value_item && cJSON_IsNumber(value_item) && timestamp_item && cJSON_IsNumber(timestamp_item)) + { + data->Heart = value_item->valueint; + data->timestamp = timestamp_item->valuedouble; + } + else + { + // 读取的数据异常 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields"); + cJSON_Delete(heart_root); + delete data; + return nullptr; + } + + cJSON_Delete(heart_root); + return data; } // 保存血氧数据 bool HealthService::UpdateHealthData(const BloodOxygenData &data)