From 633682ae0c1fefdf7ce87f801acda502245cc591 Mon Sep 17 00:00:00 2001 From: lnk Date: Wed, 2 Apr 2025 15:16:11 +0800 Subject: [PATCH] fix qvvr new funtion --- cfg_parse/cfg_parser.cpp | 17 ++++----- json/create_json.cpp | 75 +++++++++++++++++++++++++++++----------- 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/cfg_parse/cfg_parser.cpp b/cfg_parse/cfg_parser.cpp index 3f9e54a..31b0640 100644 --- a/cfg_parse/cfg_parser.cpp +++ b/cfg_parse/cfg_parser.cpp @@ -11484,18 +11484,19 @@ void OnTimerThread::run() // 回调函数,将数据直接追加到 *ptr 中 size_t req_reply_http(void* contents, size_t size, size_t nmemb, void* userp) { size_t realsize = size * nmemb; - char** ptr = (char**)userp; + char** responsePtr = (char**)userp; - // 动态扩展 *ptr 的内存 - char* temp = (char*)realloc(*ptr, strlen(*ptr) + realsize + 1); + size_t oldLen = strlen(*responsePtr); // 当前已有长度 + char* temp = (char*)realloc(*responsePtr, oldLen + realsize + 1); // +1 留空间给 '\0' if (temp == NULL) { - printf("Memory allocation failed!\n"); - return 0; // 返回 0 以通知 curl 停止数据接收 + printf("Memory reallocation failed!\n"); + return 0; } - *ptr = temp; - // 追加数据到 *ptr - strncat(*ptr, (char*)contents, realsize); + *responsePtr = temp; + memcpy(*responsePtr + oldLen, contents, realsize); // 直接拷贝原始数据 + (*responsePtr)[oldLen + realsize] = '\0'; // 手动添加字符串结束符 + return realsize; } diff --git a/json/create_json.cpp b/json/create_json.cpp index 17bd5f8..3ceecb5 100644 --- a/json/create_json.cpp +++ b/json/create_json.cpp @@ -4378,8 +4378,11 @@ static void scanAndResendOfflineFiles(const std::string &dirPath) { // 获取目录下所有文件信息 std::vector fileList; + + std::cout << "getDirectoryFilesInfo" << std::endl; getDirectoryFilesInfo(dirPath, fileList); + std::cout << "send every file" << std::endl; // 逐个文件尝试重发 for (size_t i = 0; i < fileList.size(); ++i) { // 读取文件内容(即之前存的 JSON) @@ -4399,24 +4402,46 @@ static void scanAndResendOfflineFiles(const std::string &dirPath) } fclose(fp); + std::cout << "send jsonContent" << jsonContent << std::endl; + // 尝试发送 char* ptr = NULL; // 接收返回 - SendJsonAPI_web(0, "", jsonContent.c_str(), &ptr); + SendJsonAPI_web(WEB_EVENT, "", jsonContent.c_str(), &ptr); if (ptr != NULL) { - // 表示有响应,则可视为成功;根据项目需要可加更精细的判断 - handleCommentResponse(std::string(ptr)); - free(ptr); - // 删除文件 - remove(fileList[i].fileName.c_str()); + + cJSON* j_r = cJSON_Parse(ptr); + if (j_r == NULL) { + std::cout << "old file send fail" << std::endl; + // 表示有响应,则可视为成功;根据项目需要可加更精细的判断 + handleCommentResponse(std::string(ptr)); + } + else{ + std::cout << "old file send success,remove it" << std::endl; + // 删除文件 + remove(fileList[i].fileName.c_str()); + + free(j_r); + } + } else { // 发送失败,保留文件,以便下次重试 + std::cout << "old file send fail" << std::endl; } + free(ptr); } } // ***************************************************************************************** - +std::string FormatTimeForFilename(const std::string& timeStr) { + std::string result; + for (char c : timeStr) { + if (isdigit(c)) { + result += c; + } + } + return result; +} // ======================== 原先的函数 ======================== int transfer_json_qvvr_data(unsigned int func_type, int monitor_id, double mag, double dur, long long start_tm, long long end_tm, int dis_kind, @@ -4484,9 +4509,12 @@ char* mp_id,char* Qvvr_rptname,char* devtype) // ================ 插入新功能 ========================= // ********** 新增功能开始 ********** + if(ptr != NULL) { - // 如果发送失败(ptr == NULL),则把当前 json 存入指定目录(/FeProject/dat/qvvr/) - if (ptr == NULL) { + cJSON* j_r = cJSON_Parse(ptr); + // 如果发送失败(j_r == NULL),则把当前 json 存入指定目录(/FeProject/dat/qvvr/) + if (j_r == NULL) { + std::cout << "qvvr send fail ,store in local" << std::endl; // 1) 先检查/FeProject/dat/qvvr/目录文件大小是否超过 10M,若超过则删除最老的一个文件 std::string qvvrDir = "/FeProject/dat/qvvr/"; checkAndRemoveOldestIfNeeded(qvvrDir, 10LL * 1024 * 1024); @@ -4496,7 +4524,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype) std::string fileName = qvvrDir; fileName += mp_id; fileName += "-"; - fileName += start_time_str; + fileName += FormatTimeForFilename(start_time_str); fileName += "-"; char buf[64]; @@ -4505,27 +4533,32 @@ char* mp_id,char* Qvvr_rptname,char* devtype) fileName += ".txt"; // 把 json_string 写入文件 - writeJsonToFile(fileName.c_str(), json_string); - } - - // 无论此次发送成功或失败,都要扫描/FeProject/dat/qvvr/目录下的文件并尝试依次重发 - { - std::string qvvrDir = "/FeProject/dat/qvvr/"; - scanAndResendOfflineFiles(qvvrDir); + writeJsonToFile(fileName.c_str(), json_string); } + else{ + free(j_r); + //后续处理 + } } + // 无论此次发送成功或失败,都要扫描/FeProject/dat/qvvr/目录下的文件并尝试依次重发 + if(1) + { + std::string qvvrDir = "/FeProject/dat/qvvr/"; + scanAndResendOfflineFiles(qvvrDir); + } // ********** 新增功能结束 ********** - // 下面继续原逻辑,不动 + // 下面继续原逻辑,不动,处理本次发送 if (ptr != NULL) { + std::cout << "current qvvr handle response" << std::endl; handleCommentResponse(std::string(ptr)); free(ptr); } else { // 处理 ptr 为 NULL 的情况,例如日志记录或错误处理 std::cout << "Error: Received NULL response" << std::endl; - // 释放内存 - cJSON_Delete(root); - free(json_string); + // 释放内存 + cJSON_Delete(root); + free(json_string); return 0; }