From 3347361203c919131912e7c4c824ca0344aea7b3 Mon Sep 17 00:00:00 2001 From: lnk Date: Mon, 10 Mar 2025 21:26:17 +0800 Subject: [PATCH] fix soe --- cfg_parse/cfg_parser.cpp | 26 +++++++++++++++++--- json/create_json.cpp | 12 ++++++---- mms/mms_process.c | 51 +++++++++++++++++++++++++++++++++++----- mms/mmscli_log.c | 14 ++++++++++- mms/mmscli_rpt.c | 2 +- mms/rdb_ext_utils.c | 42 +++++++++++++++++++++++---------- 6 files changed, 120 insertions(+), 27 deletions(-) diff --git a/cfg_parse/cfg_parser.cpp b/cfg_parse/cfg_parser.cpp index 82e47ab..13f2821 100644 --- a/cfg_parse/cfg_parser.cpp +++ b/cfg_parse/cfg_parser.cpp @@ -11778,7 +11778,7 @@ void printLedgerinshell(const ied_usr_t& ied_usr, QIODevice* outputDevice) { outputDevice->write("\r\x1B[K");outputDevice->write(" |-- qvvr_idx: " + QByteArray::number(ied_usr.LD_info[i].qvvr_idx) + "\n"); outputDevice->write("\r\x1B[K");outputDevice->write(" |-- QVVRs:\n"); for (int j = 0; j < 256; ++j) { - if (ied_usr.LD_info[i].qvvr[j].used_status != 0) { + if (ied_usr.LD_info[i].qvvr[j].used_status != QVVR_DATA_NOT_USED) { outputDevice->write("\r\x1B[K");outputDevice->write(" |-- QVVR[" + QByteArray::number(j) + "]:\n"); outputDevice->write("\r\x1B[K");outputDevice->write(" |-- used_status: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].used_status) + "\n"); outputDevice->write("\r\x1B[K");outputDevice->write(" |-- QVVR_start: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].QVVR_start) + "\n"); @@ -14091,8 +14091,28 @@ void handleUploadResponse(const std::string& response, char* wavepath) { std::cout << "Uploaded File Name: " << fileName << std::endl; std::cout << "File URL: " << url << std::endl; - //记录返回的文件路径和文件名 - strcpy(wavepath, nameItem->valuestring); + // 找到最后一个 '/' + 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); + } + } else { + // 如果没有 '/',直接复制整个字符串 + strcpy(wavepath, name.c_str()); + } + + std::cout << "wavepath: " << wavepath << std::endl; } } else { std::cerr << "Error: Missing expected fields in JSON response." << std::endl; diff --git a/json/create_json.cpp b/json/create_json.cpp index 336cbc6..22f59dc 100644 --- a/json/create_json.cpp +++ b/json/create_json.cpp @@ -4003,7 +4003,10 @@ void connectlog_pgsql(char* id,char* datetime,int status) //std::cout << "jsonString: " << jsonString << std::endl;////减少多余的打印 //发送数据到远端 - SendJsonAPI_web(WEB_COMFLAG, "", jsonString,&ptr); + SendJsonAPI_web(WEB_COMFLAG, "", jsonString,&ptr);//不使用接口lnk20250310 + //使用队列 + //if()//稳态才上传 + //处理返回的数据 // 检查 ptr 是否为 NULL,避免 std::string 初始化失败 @@ -4222,7 +4225,7 @@ char* mp_id,char* Qvvr_rptname,char* devtype) // //不需要数据类型,因为是http接口不是数据队列 cJSON_AddStringToObject(root, "monitorId", mp_id); cJSON_AddNumberToObject(root, "amplitude", mag); - cJSON_AddNumberToObject(root, "duration", dur * 1000); + cJSON_AddNumberToObject(root, "duration", dur); cJSON_AddNumberToObject(root, "eventType", dis_kind); // 格式化时间戳为日期字符串(假设时间戳为毫秒) char start_time_str[25]; @@ -4232,8 +4235,9 @@ char* mp_id,char* Qvvr_rptname,char* devtype) // // 添加毫秒部分 snprintf(start_time_str + strlen(start_time_str), sizeof(start_time_str) - strlen(start_time_str), ".%03lld", start_tm % 1000); cJSON_AddStringToObject(root, "startTime", start_time_str); - cJSON_AddStringToObject(root, "wavePathcfg", uuid_cfg); // 动态设置波形文件路径 - cJSON_AddStringToObject(root, "wavePathdat", uuid_dat); // 动态设置波形文件路径 + //cJSON_AddStringToObject(root, "wavePathcfg", uuid_cfg); // 动态设置波形文件路径不需要传具体文件名 + //cJSON_AddStringToObject(root, "wavePathdat", uuid_dat); // 动态设置波形文件路径 + cJSON_AddStringToObject(root, "wavePath", uuid_dat); //添加相别部分 if (c_xmlcfg.WavePhasicFlag == "1") { QString Qvvr_Rptname;//转换为qstring格式 diff --git a/mms/mms_process.c b/mms/mms_process.c index dd2c4da..3e9bdd2 100644 --- a/mms/mms_process.c +++ b/mms/mms_process.c @@ -1957,6 +1957,7 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) printf(">>>>>>>> extract_timestamp_from_cfg_file end \n"); if (ret2 ==APR_SUCCESS) { //to find the paired qvvr by the time of trig_tm + printf(">>>>>>>> extract_timestamp_from_cfg_file success \n"); qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //根据文件的触发时间查找检测点记录的匹配上的暂态事件 if (qvvr) { char* uuid_cfg = (char*)malloc(65 * sizeof(char));//上传文件后获取到的路径 @@ -1965,8 +1966,8 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) char* filename_dat = (char*)malloc(100 * sizeof(char)); //lnk202411-5 记录web返回的路径+文件名 - char* wavepath_cfg = (char*)malloc(168 * sizeof(char)); - char* wavepath_dat = (char*)malloc(168 * sizeof(char)); + char* wavepath_cfg = (char*)malloc(256 * sizeof(char)); + char* wavepath_dat = (char*)malloc(256 * sizeof(char)); /*上传.cfg和.dat两个文件*/ char linux_cmd[256] = {0}; printf(">>>>>>>> qvvr ok end \n"); @@ -1991,7 +1992,26 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) } //LNK20241031使用JSON编码文件上传-具体的远端路径可以用原本代码的硬编码或者在配置文件中获取 else if (FILE_FLAG == 4) { - SOEFileWeb(loc_file_fullname_cfg, oss_file_fullname_cfg, wavepath_cfg); + 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); + + SOEFileWeb(loc_file_fullname_cfg, mq_file_fullname_cfg, wavepath_cfg); } else { @@ -2020,7 +2040,26 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) } //LNK20241031使用JSON编码文件上传-具体的远端路径可以用原本代码的硬编码或者在配置文件中获取 else if (FILE_FLAG == 4) { - SOEFileWeb(loc_file_fullname_dat, oss_file_fullname_dat, wavepath_dat); + 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); + + SOEFileWeb(loc_file_fullname_cfg, mq_file_fullname_dat, wavepath_cfg); } printf("\n>>>>>>!! %s %s...... \n", oss_file_fullname_dat, loc_file_fullname_dat); /*上传.cfg和.dat两个文件*/ @@ -2043,9 +2082,9 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info ) else if(FILE_FLAG==4)//lnk20241031发送暂态web消息 { //内存分配部分不修改 - size_t cfg_len = strlen(wavepath_cfg); + size_t cfg_len = strlen(wavepath_cfg) + 1; char* cfg_result = (char*)malloc(cfg_len * sizeof(char)); // 动态分配足够的内存空间 - size_t dat_len = strlen(wavepath_dat); + size_t dat_len = strlen(wavepath_dat) + 1; char* dat_result = (char*)malloc(dat_len * sizeof(char)); // 动态分配足够的内存空间 if (cfg_result != NULL && dat_result != NULL) { diff --git a/mms/mmscli_log.c b/mms/mmscli_log.c index 975a29e..e740ed0 100644 --- a/mms/mmscli_log.c +++ b/mms/mmscli_log.c @@ -244,7 +244,19 @@ static ST_RET process_jou_entry(loginfo_t *loginfo,apr_time_t t, char* q = mms_dec_data.data_item[ii].u.data_str; //调试用lnk20250307 - printf("q[0] = %c ,q[1] = %c !!!!!",q[0],q[1]); + if (q != NULL) +{ + int i; + for (i = 0; q[i] != '\0'; i++) + { + /* 如果当前字符是 '\0' 则跳过,但循环条件已经排除了 '\0' */ + if (q[i] == '\0') + continue; + printf("q[%d] = %c\n", i, q[i]); + } + printf("!!!!!\n"); +} + //调试用lnk20250307 if (q[0] == '0' && q[1] == '0'){ quality = 0; diff --git a/mms/mmscli_rpt.c b/mms/mmscli_rpt.c index f58d6e9..87e803f 100644 --- a/mms/mmscli_rpt.c +++ b/mms/mmscli_rpt.c @@ -2453,7 +2453,7 @@ void my_local_to_data(ST_CHAR* datptr, SD_CONST RUNTIME_TYPE* rt_head, break; case RT_BIT_STRING: - myLocToTextBs((ST_UCHAR*)datptr, rt_ptr, tmpBuf); + myLocToTextBs((ST_UCHAR*)datptr, rt_ptr, tmpBuf);//将存储在内存中的比特串转换为对应的文本字符串(由字符 '1' 和 '0' 组成) strcpy(data->data_item[valid_item_num].comp_name, (const char*)attr_str); data->data_item[valid_item_num].size = abs(rt_ptr->u.p.el_len); data->data_item[valid_item_num].type = DATA_STR_TYPE; diff --git a/mms/rdb_ext_utils.c b/mms/rdb_ext_utils.c index e1d6ff8..36788aa 100644 --- a/mms/rdb_ext_utils.c +++ b/mms/rdb_ext_utils.c @@ -487,16 +487,18 @@ void processQVVR_data(LD_info_t* LD_info,char* FULL_FCDA_Name,double v) LD_info->qvvr[LD_info->qvvr_idx].QVVR_start = (v>0.99) ? 1:0; } else if ( strstr(FULL_FCDA_Name,"VVaTm$mag$f") ) - LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime = v; + LD_info->qvvr[LD_info->qvvr_idx].QVVR_PerTime = (float)v; + else if ( strstr(FULL_FCDA_Name,"VVa$mag$f") ) - LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg = v; + LD_info->qvvr[LD_info->qvvr_idx].QVVR_Amg = (float)v; else { if ( strstr(FULL_FCDA_Name,"DipStr$stVal") && (v>0.99) ) //电压暂降 - LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1; + LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210002;//按照接口修改 else if ( strstr(FULL_FCDA_Name,"SwlStr$stVal") && (v>0.99) ) //电压暂升 - LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 2; + LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210001; else if ( strstr(FULL_FCDA_Name,"IntrStr$stVal") && (v>0.99) ) //电压中断 - LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 3; + LD_info->qvvr[LD_info->qvvr_idx].QVVR_type = 1210004; + } if (strstr(FULL_FCDA_Name, "QVVR")) { @@ -514,16 +516,16 @@ 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*1000) + 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);//监测点号,文件和监测点暂态事件匹配上的暂态报告名,终端类型 + 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); - } + }*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////// int find_paired = FALSE; @@ -546,6 +548,18 @@ void processQVVR_end(LD_info_t* LD_info) LD_info->qvvr[LD_info->qvvr_idx].used_status = QVVR_DATA_NOT_USED; //当前这个点位置释放 find_paired = TRUE; + + //匹配后再发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->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); + } + break; } } @@ -578,13 +592,17 @@ 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(单位:毫秒) if ((LD_info->qvvr[i].used_status == QVVR_DATA_PAIRED) && (diff <= 1)) { // 如果匹配,返回该 QVVR 数据的指针 + printf(">>>>> pair QVVR success>>>>>> \n"); return &(LD_info->qvvr[i]); } } + printf(">>>>> pair QVVR fail>>>>>> \n"); // 如果没有找到匹配的 QVVR 数据,返回 NULL return NULL; }