From f2556662ed1026df308b47780a9bb871acbf1dcd Mon Sep 17 00:00:00 2001 From: lnk Date: Tue, 11 Mar 2025 11:29:24 +0800 Subject: [PATCH] fix soe --- cfg_parse/cfg_parser.cpp | 36 +++++++++++-------------- mms/mms_process.c | 57 ++++++++++++++++------------------------ mms/mmscli_log.c | 6 ++--- mms/mmscli_rpt.c | 4 +-- mms/rdb_ext_utils.c | 24 ++++++++--------- 5 files changed, 55 insertions(+), 72 deletions(-) diff --git a/cfg_parse/cfg_parser.cpp b/cfg_parse/cfg_parser.cpp index 13f2821..78631c6 100644 --- a/cfg_parse/cfg_parser.cpp +++ b/cfg_parse/cfg_parser.cpp @@ -14091,26 +14091,20 @@ void handleUploadResponse(const std::string& response, char* wavepath) { std::cout << "Uploaded File Name: " << fileName << std::endl; std::cout << "File URL: " << url << std::endl; - // 找到最后一个 '/' - const char *lastSlash = strrchr(name.c_str(), '/'); - - if (lastSlash != NULL) { - // 取 '/' 之后的部分,即文件名 - const char *filename = lastSlash + 1; - - // 检测文件名是否重复(按长度拆分成前半部分和后半部分进行比较) - size_t len = strlen(filename); - size_t halfLen = len / 2; - if (strncmp(filename, filename + halfLen, halfLen) == 0) { - strncpy(wavepath, filename, halfLen); - wavepath[halfLen] = '\0'; // 确保字符串以 '\0' 结尾 - } else { - strcpy(wavepath, filename); - } + // 找到最后一个 '.' + size_t pos = fileName.find_last_of('.'); + std::string nameWithoutExt; + + if (pos != std::string::npos) { + // 截取去掉后缀的部分 + nameWithoutExt = fileName.substr(0, pos); } else { - // 如果没有 '/',直接复制整个字符串 - strcpy(wavepath, name.c_str()); + // 如果没有后缀,直接使用原文件名 + nameWithoutExt = fileName; } + + // 拷贝到 wavepath + strcpy(wavepath, nameWithoutExt.c_str()); std::cout << "wavepath: " << wavepath << std::endl; } @@ -14254,11 +14248,11 @@ void SOEFileWeb(char* localpath,char* cloudpath, char* wavepath) void SOEFileWeb_test() { - char localpath[128] = {"./file_test.txt"}; - char cloudpath[128] = {"/comtrade/file_test.txt"}; + char localpath[128] = {"/FeProject/comtrade/his/PQMonitor_PQM1_000420_20250310_151030_923.cfg"}; + char cloudpath[128] = {"/comtrade/192.168.1.105/"}; char wavepath[128] = {""}; SOEFileWeb(localpath,cloudpath,wavepath); - std::cout << "wavepath" << wavepath << std::endl; + std::cout << "wavepath:" << wavepath << std::endl; } /*/////////////////////////////////////////////////////////lnk10-24根据web接口修改/////////////////////////////////////////////////////////////*/ /*封装C可调用的台账更新函数 *///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/mms/mms_process.c b/mms/mms_process.c index 3e9bdd2..3f46eb7 100644 --- a/mms/mms_process.c +++ b/mms/mms_process.c @@ -1995,29 +1995,21 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) char mq_file_fullname_cfg[256]; // 远端文件名 memset(mq_file_fullname_cfg, 0, sizeof(mq_file_fullname_cfg)); - // 复制文件名到可修改的缓冲区 - char cfg_filename[128]; // 假设最大长度 128 - strncpy(cfg_filename, cfg_only_filename_ret, sizeof(cfg_filename) - 1); - cfg_filename[sizeof(cfg_filename) - 1] = '\0'; // 确保字符串以 '\0' 结尾 - - // 找到最后一个 '.',确定扩展名位置 - char *pos = strrchr(cfg_filename, '.'); - if (pos != NULL) { - // 修改扩展名为 ".CFG" - strcpy(pos, ".CFG"); - } - // 使用修改后的文件名传入 apr_snprintf - apr_snprintf(mq_file_fullname_cfg, sizeof(mq_file_fullname_cfg), "comtrade/%s/%s", - LD_info->ied->channel[0].addr_str, cfg_filename); + apr_snprintf(mq_file_fullname_cfg, sizeof(mq_file_fullname_cfg), "comtrade/%s/", + LD_info->ied->channel[0].addr_str); SOEFileWeb(loc_file_fullname_cfg, mq_file_fullname_cfg, wavepath_cfg); + + printf("\n>>>>>>!! %s %s...... \n", mq_file_fullname_cfg, loc_file_fullname_cfg); } - else - { + + if (FILE_FLAG == 4) { } - printf("\n>>>>>>!! %s %s...... \n", oss_file_fullname_cfg, loc_file_fullname_cfg); + else{ + printf("\n>>>>>>!! %s %s...... \n", oss_file_fullname_cfg, loc_file_fullname_cfg); + } apr_snprintf(linux_cmd,sizeof(linux_cmd),"./sftp_upload %s %s/%04d",dat_only_filename_ret,file_yyyymm,LD_info->line_id);//先通过sftp上传才发json过去 //printf("\n>>>>>> %s ...... \n",linux_cmd); @@ -2043,25 +2035,22 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) char mq_file_fullname_dat[256]; // 远端文件名 memset(mq_file_fullname_dat, 0, sizeof(mq_file_fullname_dat)); - // 复制文件名到可修改的缓冲区 - char dat_filename[128]; // 假设最大长度 128 - strncpy(dat_filename, cfg_only_filename_ret, sizeof(dat_filename) - 1); - dat_filename[sizeof(dat_filename) - 1] = '\0'; // 确保字符串以 '\0' 结尾 - - // 找到最后一个 '.',确定扩展名位置 - char *pos = strrchr(dat_filename, '.'); - if (pos != NULL) { - // 修改扩展名为 ".CFG" - strcpy(pos, ".CFG"); - } - // 使用修改后的文件名传入 apr_snprintf - apr_snprintf(mq_file_fullname_dat, sizeof(mq_file_fullname_dat), "comtrade/%s/%s", - LD_info->ied->channel[0].addr_str, dat_filename); + apr_snprintf(mq_file_fullname_dat, sizeof(mq_file_fullname_dat), "comtrade/%s/", + LD_info->ied->channel[0].addr_str); - SOEFileWeb(loc_file_fullname_cfg, mq_file_fullname_dat, wavepath_cfg); + SOEFileWeb(loc_file_fullname_dat, mq_file_fullname_dat, wavepath_dat); + + printf("\n>>>>>>!! %s %s...... \n", mq_file_fullname_dat, loc_file_fullname_dat); } - printf("\n>>>>>>!! %s %s...... \n", oss_file_fullname_dat, loc_file_fullname_dat); + + if (FILE_FLAG == 4) { + + } + else{ + printf("\n>>>>>>!! %s %s...... \n", oss_file_fullname_dat, loc_file_fullname_dat); + } + /*上传.cfg和.dat两个文件*/ /*上传消息*/ //to send json of this qvvr and rdre @@ -2114,7 +2103,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) free(dat_result); // 使用完毕后释放动态分配的内存空间 } /*上传消息*/ - qvvr->used_status = QVVR_DATA_NOT_USED; + qvvr->used_status = QVVR_DATA_NOT_USED;//上传信息后这个qvvr的状态置为未使用 free(uuid_cfg); free(uuid_dat); free(filename_cfg); diff --git a/mms/mmscli_log.c b/mms/mmscli_log.c index e740ed0..dd74e08 100644 --- a/mms/mmscli_log.c +++ b/mms/mmscli_log.c @@ -377,7 +377,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t, if ( ('$'==mms_ref[length_FCDA-2]) && ('q'==mms_ref[length_FCDA-1]) ) { //调试用lnk20250307 - printf("going q"); + //printf("going q"); if(not_set_log_q_this && ( log_data_type == STEADY_DATA )) { int quality = 0; @@ -413,7 +413,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t, else if ( ('$'==mms_ref[length_FCDA-2]) && ('t'==mms_ref[length_FCDA-1]) ) { //调试用lnk20250307 - printf("going t"); + //printf("going t"); if (not_set_log_t_this) { apr_time_t t = convert_btime6_to_apr_time(&(mms_dec_data.data_item[ii].u.data_bTime6)); @@ -443,7 +443,7 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t, } else { //调试用lnk20250307 - printf("going v"); + //printf("going v"); if ( log_data_type == QVVR_DATA ){ processQVVR_data(loginfo->LD_info,mms_ref,v); diff --git a/mms/mmscli_rpt.c b/mms/mmscli_rpt.c index 87e803f..f07d202 100644 --- a/mms/mmscli_rpt.c +++ b/mms/mmscli_rpt.c @@ -1059,10 +1059,10 @@ ST_VOID u_iec_rpt_ind_data_by_devtype(MVL_VAR_ASSOC** info_va, } else if (('$' == FULL_FCDA_Name[length_FCDA - 2]) && ('t' == FULL_FCDA_Name[length_FCDA - 1])) { if (not_set_rpt_TimeID_this) { - apr_time_t t = convert_btime6_to_apr_time(&(mms_dec_data.data_item[ii].u.data_bTime6)); + apr_time_t t = convert_btime6_to_apr_time(&(mms_dec_data.data_item[ii].u.data_bTime6));//微秒 if (strstr(rcb_info->RptID, "QVVR")) {//CZY 2023-08-17 WW 2022-11-14 修改判断LLN0$BR$brcbQVVR if (strstr(FULL_FCDA_Name, "VarStr$t")) { - processQVVR_time(LD_info, t / 1000); + processQVVR_time(LD_info, t / 1000);//毫秒 not_set_rpt_TimeID_this = FALSE; } } diff --git a/mms/rdb_ext_utils.c b/mms/rdb_ext_utils.c index 36788aa..4e5017b 100644 --- a/mms/rdb_ext_utils.c +++ b/mms/rdb_ext_utils.c @@ -516,16 +516,7 @@ void processQVVR_end(LD_info_t* LD_info) ied_t *ied = LD_info->ied; ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied); int ret; - long long end_tm = (long long)(LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime) + LD_info->qvvr[LD_info->qvvr_idx].QVVR_time; //结束时间是持续时间加触发时间 - /*ret = transfer_json_qvvr_data(g_node_id, //这个参数没有使用 - LD_info->line_id, //监测点序号 - LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg, LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime, LD_info->qvvr[LD_info->qvvr_idx].QVVR_time, end_tm, LD_info->qvvr[LD_info->qvvr_idx].QVVR_type, //伏值、持续时间、开始时间、结束时间、暂态类型 - "", "", //两个文件路径为空 - LD_info->mp_id, LD_info->qvvr[LD_info->qvvr_idx].QVVR_Rptname, ied_usr->dev_type);//监测点号,文件和监测点暂态事件匹配上的暂态报告名,终端类型 - if(!ret)//失败 - { - printf("\n~~~~~~~~~~~~~~~~~ QVVR_json_data send error: line_id=%d \n",LD_info->line_id); - }*/ + long long end_tm = (long long)(LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime) + LD_info->qvvr[LD_info->qvvr_idx].QVVR_time; //结束时间是持续时间加触发时间,毫秒 //////////////////////////////////////////////////////////////////////////////////////////////////////////// int find_paired = FALSE; @@ -539,8 +530,13 @@ void processQVVR_end(LD_info_t* LD_info) continue; if (LD_info->qvvr[i].used_status != QVVR_DATA_RECEIVED)//跳过没有收到波动的位置 continue; - //其他某位置的波动也没有定义类型/这个位置的波动类型和当前位置的波动类型一致 + //其他某位置的波动也没有定义类型/这个位置的波动类型和当前位置的波动类型一致,暂降事件一次会发三个报告 if ( (LD_info->qvvr[i].QVVR_type==0)||(LD_info->qvvr[i].QVVR_type==LD_info->qvvr[LD_info->qvvr_idx].QVVR_type) ) { + + //调试用 + printf("\n~~~~~~~this qvvr node type before record is %d~~~~~~~~~~ \n",LD_info->qvvr[i].QVVR_type); + printf("\n~~~~~~~now qvvr node type before record is %d~~~~~~~~~~ \n",LD_info->qvvr[LD_info->qvvr_idx].QVVR_type); + LD_info->qvvr[i].used_status = QVVR_DATA_PAIRED; //匹配上了 LD_info->qvvr[i].QVVR_type = LD_info->qvvr[LD_info->qvvr_idx].QVVR_type; LD_info->qvvr[i].QVVR_PerTime = LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime; @@ -549,10 +545,13 @@ void processQVVR_end(LD_info_t* LD_info) LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //当前这个点位置释放 find_paired = TRUE; + //调试用 + printf("\n~~~~~~~qvvr node %d status is pair~~~~~~~~~~ \n",i); + //匹配后再发qvvr ret = transfer_json_qvvr_data(g_node_id, //这个参数没有使用 LD_info->line_id, //监测点序号 - LD_info->qvvr[i].QVVR_Amg, LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime, LD_info->qvvr[LD_info->qvvr_idx].QVVR_time, end_tm, LD_info->qvvr[LD_info->qvvr_idx].QVVR_type, //伏值、持续时间、开始时间、结束时间、暂态类型 + LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg, LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime, LD_info->qvvr[LD_info->qvvr_idx].QVVR_time, end_tm, LD_info->qvvr[LD_info->qvvr_idx].QVVR_type, //伏值、持续时间、开始时间、结束时间、暂态类型 "", "", //两个文件路径为空 LD_info->mp_id, LD_info->qvvr[LD_info->qvvr_idx].QVVR_Rptname, ied_usr->dev_type);//监测点号,文件和监测点暂态事件匹配上的暂态报告名,终端类型 if(!ret)//失败 @@ -592,6 +591,7 @@ QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info, long long trig_tm) // 计算当前 QVVR 数据的时间戳与触发时间戳之间的差异 diff = abs(LD_info->qvvr[i].QVVR_time - trig_tm); + //调试用 printf("QVVRTIME:%lld >>>>> COMTRADE trig_tm:%lld >>>>> diff:%lld\n",LD_info->qvvr[i].QVVR_time,trig_tm,diff); // 如果该 QVVR 数据的状态是 "已配对"(QVVR_DATA_PAIRED)并且时间差小于等于 1(单位:毫秒)