From 499fa589a06be623f9aac5fb49b75d0f67541d6e Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Wed, 25 Sep 2024 19:03:27 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E5=BF=83=E7=8E=87=E8=A1=80?= =?utf8?q?=E6=B0=A7json=E8=A7=A3=E6=9E=90=E7=9A=84=E9=94=99=E8=AF=AF?= =?utf8?q?=E9=A2=84=E9=98=B2=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../health_service/health_service.cpp | 279 ++++++++++-------- 1 file changed, 159 insertions(+), 120 deletions(-) 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) -- 2.17.1