Files
microser/cfg_parse/cfg_parser.cpp
2025-01-16 16:17:01 +08:00

14283 lines
518 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using namespace std;
#include <QFile>
#include <QXmlStreamWriter>
#include <QtXml/QDomDocument>
#include <QtXml/QDomElement>
#include <QtXml/QDomNode>
#include <QtXml/QDomNodeList>
#include <QtCore/qglobal.h>
#include <QStringList>
#include <QSettings>
#include <QDateTime>
#include <QDir>
#include <QFileInfo>
#include <QDebug>
#include <QMutex>
#include <QMap>
#include <ctime>
#define OTL_ODBC_ODBC
#define OTL_ODBC_UNIX
#include <unistd.h>
#include "otlv4.h"
#include <stdio.h>
#include <sstream> //lnk 2024-10-16
#include <set> //写去重的设备类型
#include <fstream>//上传文件
#include "../mms/db_interface.h"
#include "../json/save2json.h"
#include "../json/mms_json_inter.h"
#include "../mms/rdb_client.h"
#include "../mms/interface.h"
#include "../json/cjson.h"//WW 2023-08-27新增json解析函数
#include "../include/curl/curl.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
extern pt61850app_t* g_pt61850app;
extern node_t* g_node;
extern apr_pool_t* g_cfg_pool;
extern apr_pool_t* g_init_pool;
extern apr_pool_t* g_temp_dev_pool;
extern char subdir[128];
extern int g_front_seg_index;
extern unsigned int g_no_auth;
extern char g_onlyIP[255]; //直连某个IP仅仅为方便测试
int g_DevFlag = 0;
#ifdef __cplusplus
}
#endif
//ZW 2023-10-10 单条补招结构
class RecallInfo
{
public:
long long starttime;
long long endtime;
};
//CZY 2023-09-17 控制命令解析
class ProgramParam //
{
public:
QList<QString> terminal_list;//终端id列表
QString file_name;//程序下装可用下装程序在oss中的位置
};
//CZY 2023-09-17 控制命令解析
class RecallParam //
{
public:
QString mp_id;//监测点id
QString start;//补招数据起始时间
QString end;//补招数据结束时间
int voltage;//暂态数据标志
int stat;//稳态数据标志
};
//CZY 2023-10-12 装置识别码与密钥
class terminal_ext //
{
public:
char terminal_identify_code[100];//终端识别码
char terminal_key[100];//终端密钥
};
class CJournalRecall //日志补招结构类
{
public:
QString MonitorID; //线路监测点号
QString StartTime; //数据补招起始时间
QString EndTime; //数据补招结束时间
QString STEADY; //补招历史统计数据标识 0-不补招1-补招
QString VOLTAGE; //补招暂态事件标识 0-不补招1-补招
};
/*lnk 2024-10-15 */
class ledger_monitor //监测点台账
{
public:
char monitor_id[64];
char terminal_code[64];
char monitor_name[64];
char logical_device_seq[64];
char voltage_level[64];
char terminal_connect[64];
char timestamp[64];
char status[255];
char count_cfg[64]; //不是台账的一部分,用来记录数据库或业务中台的台账数量
};
class terminal_dev //终端台账
{
public:
char terminal_id[64];
char terminal_code[64];
char org_name[64];
char maint_name[64];
char station_name[64];
char tmnl_factory[64];
char tmnl_status[64];
char dev_type[64];
char dev_key[255];
char dev_series[255];
char addr_str[64];
char port[64];
char timestamp[64];
ledger_monitor line[10];
char count_cfg[64]; //不是台账的一部分,用来记录数据库或业务中台的台账数量
};
class icd_model //icd模型
{
public:
char model_id[64];
char tmnl_type[64];
char tmnl_type_id[64]; //不使用
char tmnl_factory[64]; //不使用
char file_name[128];
char file_path[128];
char timestamp[64];
};
class front_list//前置表
{
public:
char front_ip[64];
char front_port[64];
char front_inst[64];
char front_type[64];
char front_status[64];
char front_version[64];
char mp_num[64];
};
class intact_list//前置表
{
public:
char monitor_id[64];
char statistical_date[64];
char exp_num[64];
char act_num[64];
std::vector<std::string> value_time; //时间集合
char last_value_time[64];
};
/*lnk 2024-10-15 */
list<CJournalRecall> g_StatisticLackList; //日志补招结构类链表
QMutex g_StatisticLackList_list_mutex; //recall队列数据锁
QString DEVIE_CONFIG_FN = QString("Device_Config.xml");//不用
QString LINE_CONFIG_FN = QString("Line_Config.xml");//不用
QString JSON_CONFIG_FN_old = QString("JiangSu_Config.xml");//默认映射文件
QString THREE_SECS_CONFIG_FN = QString("Trigger3S.xml");//实时数据用
QString RECALL_CONFIG_FN = QString("Recall.xml");//不用
//lnk20241220创建一个用来台账更新的文件保证数据完整的情况下更新台账
std::string LEDGER_UPDATE_FN = "LedgerUpdate.xml";
const int MAX_CPUNO = 10;
//WW 2-23-08-20 add start
otl_connect db; //OTL数据库连接对象 WW 2023-08-20
int g_iOTLFlag = 0; //Sql是否执行标志(0-不执行1-执行) //lnk202410-22替换web接口后关闭
std::string g_strOTLType = "PostgreSQL"; //OTL连接数据库类型
//std::string g_strOTLConnect = "pqsadmin/dnzladmin_001@pgsql"; //OTL数据库连接参数
//std::string g_strOTLConnect = "postgres/postgres@pgsql"; //OTL数据库连接参数
std::string g_strOTLConnect = "postgres/bmdev@123@pgsql"; //OTL数据库连接参数
//////CZY 2023-09-06 config
//多前置flag:1为开启,0为关闭
int MULTIPLE_NODE_FLAG = 1;
extern const char* PROGRAM_VERSION;
extern int FRONT_MP_NUM;
int ACCOUNT_UPDATE_INTERVAL;
char* ACCOUNT_UPDATE_LAST_TIME;
int MULIT_NODE_INTERVAL;
int COMMUNICATION_LOG_STATUS_TIME;
int COMMUNICATION_LOG_ABNORMAL_TIME;
char* POSTGRES_DATABASE;//数据库库名
char* POSTGRES_USERNAME;//数据库用户名
char* POSTGRES_PASSWORD;//数据库密码
char* POSTGRES_SCHEMA;//数据库模式名
char* POSTGRES_DNSNAME;//取postgres/guass库
char* POSTGRES_TABLEPREFIX;//表名前缀
char* CLIENT_ID;//中台CLIENT_ID
char* CLIENT_SECRET;//中台CLIENT_SECRET
char* TOKEN_URL;//中台取token接口
char* DEVICE_URL;//中台取终端接口
char* GRANT_TYPE;//中台GRANT_TYPE
char* UDS_UPLOAD_URL;
char* UDS_DOWNLOAD_URL;
char* UDS_DELETE_URL;
//char * OSS_ENDPOINT;
//char * ACCESS_KEY_ID;
//char * ACCESS_KEY_SECRET;
//char * BUCKET_NAME;
int FILE_FLAG;
int SEND_FLAG;
int FRONT_INST;
char* FRONT_IP;
int CITY_FLAG;
int recall_len;
int recall_sta;
int recall_daily;
char* BROKER_LIST;
char* TOPIC_STAT;
char* TOPIC_PST;
char* TOPIC_PLT;
char* TOPIC_EVENT;
char* TOPIC_ALARM;
char* TOPIC_SNG;
//lnk20241220
char* TOPIC_RTDATA;
char* PROTOCOL;
char* MECHANISMS;
char* KEYTAB_FILE;
char* SERVICE_NAME;
char* PRINCIPAL;
char* DOMAIN_NAME;
extern int g_front_seg_index;
extern int g_front_seg_num;
/*移植配置变量lnk10-9*/
//生产者
std::string G_ROCKETMQ_PRODUCER = "";//rocketmq producer
std::string G_ROCKETMQ_IPPORT = "";//rocketmq ip+port
std::string G_ROCKETMQ_TOPIC = "";//topie
std::string G_ROCKETMQ_TAG = "";//tag
std::string G_ROCKETMQ_KEY = "";//key
int QUEUENUM = 0;
std::string BROKERNAME = "";
//消费者
std::string G_ROCKETMQ_CONSUMER = "";//rocketmq consumer
std::string G_MQCONSUMER_IPPORT = "";//consumer ip+port
std::string G_MQCONSUMER_TOPIC_RT = "";//consumer topie
std::string G_MQCONSUMER_TAG_RT = "";//consumer tag
std::string G_MQCONSUMER_KEY_RT = "";//consumer key
std::string G_MQCONSUMER_ACCESSKEY = "";
std::string G_MQCONSUMER_SECRETKEY = "";
std::string G_MQCONSUMER_CHANNEL = "";
std::string G_MQCONSUMER_TOPIC_UD = "";//consumer topie
std::string G_MQCONSUMER_TAG_UD = "";//consumer tag
std::string G_MQCONSUMER_KEY_UD = "";//consumer key
std::string G_MQCONSUMER_TOPIC_RC = "";//consumer topie
std::string G_MQCONSUMER_TAG_RC = "";//consumer tag
std::string G_MQCONSUMER_KEY_RC = "";//consumer key
std::string G_MQCONSUMER_TOPIC_SET = "";//consumer topie
std::string G_MQCONSUMER_TAG_SET = "";//consumer tag
std::string G_MQCONSUMER_KEY_SET = "";//consumer key
int G_TEST_FLAG = 0;
int G_TEST_NUM = 0;
int TEST_PORT = 11000;//用于当前进程登录测试shell的端口
//终端和监测点的状态筛选
std::string TERMINAL_STATUS = "";
std::string MONITOR_STATUS = "";
std::string ICD_FLAG = "";
//保留socket连接设置开关
int SOCKET_PORT = 13000;
int SOCKETENABLE = 0;
//添加http配置和台账配置lnk20241031
int HTTPENABLE = 0;
std::string HTTP_IP = "";
int HTTP_PORT = 12000;
/*添加web接口lnk202411-6*/
std::string WEB_DEVICE = "";
std::string WEB_ICD = "";
std::string WEB_INTEGRITY = ""; //暂不使用
std::string WEB_COMFLAG = "";
std::string WEB_EVENT = "";
std::string WEB_FILEUPLOAD = "";
std::string WEB_FILEDOWNLOAD = "";
//lnk20250115添加台账锁
extern pthread_mutex_t mtx;
/*lnk 2024-10-21 */
int OTL_Select_DecideRecall_web(char* time, char* id);//判断是否需要补招
void OTL_Select_recall_web(char* time, char* id); //数据完整性补招判断
bool CheckPG_To_Recall_web(long long start, long long end, char* Monitorid);
//////////////////////////////////////////////////////////////////////////
std::string g_strUID = ""; //OTL数据库连接用户名
int g_iOTLConnectLimit = 3; //OTL数据库超时连接次数限制 注数据库允许最大连接次数单次数据库连接计数超过3次重新执行数据库线程
//数据库Sql链表---------------------------------------
extern QList<QString> Sql_data_list; //Sql执行语句链表
extern QMutex Sql_data_list_mutex; //Sql执行语句锁
extern int server_socket; //Web Socket服务端实例
extern unsigned int g_node_id; //前置程序类型(100-500)
//WW 2023-08-20 end
////////////////////////////////////////////////////////////////////////////////////////////////////
void parse_log_switch_ini(unsigned int* error, unsigned int* warn, unsigned int* info)
{
QString pt61850netd_pqfe_IniFilename = QString("../etc/pt61850netd_pqfe.ini");
QSettings settings(pt61850netd_pqfe_IniFilename, QSettings::IniFormat);
settings.beginGroup("Log");
*error = settings.value("error", 0).toUInt();
*warn = settings.value("warn", 0).toUInt();
*info = settings.value("info", 0).toUInt();
g_no_auth = settings.value("no_auth", 0).toUInt();
g_DevFlag = settings.value("DevFlag", 0).toUInt();
settings.endGroup();
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//lnk20250114不使用的代码
#if 0
/* xml 示例 设备终端配置
<GetDevInfoList>
<DevAccountList>
<Count>6</Count>
<DevAccount>
<DEV_Index>1268918860</DEV_Index>
<DEV_Type>PQS-882A</DEV_Type>
<DEV_IP>127.0.0.1</DEV_IP>
<DEV_PortID>102</DEV_PortID>
<DEV_Key>IXFhekB3c3gzZWRjNHJmdg==</DEV_Key>
<DEV_Series>UHFzJmNuODcwMjk5</DEV_Series>
<DEV_DevFlag>0</DEV_DevFlag>
</DevAccount>
</DevAccountList>
</GetDevInfoList>
*/
int parse_device_cfg()
{
ied_t* ied;
ied_usr_t* ied_usr;
chnl_usr_t* chnl_usr;
unsigned int count_cfg = 0;
unsigned int count_real = 0;
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/");
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(cfg_dir + DEVIE_CONFIG_FN);
if (!file.open(QIODevice::ReadOnly))
return APR_EBADPATH; //以只读方式打开
if (!doc.setContent(&file)) {
file.close();
return APR_EBADF;
}
//将文件内容读到doc中
QDomElement docElem = doc.documentElement(); //返回根元素
QDomNode n = docElem.firstChild(); //返回根节点的第一个子节点
while (!n.isNull())
{ //如果节点不为空
if (n.isElement()) //如果节点是元素
{
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName();
if (strTag == "DevAccountList") {
QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表
for (int i = 0; i < list.count(); i++) //遍历该列表
{
QDomNode node = list.at(i);
if (node.isElement()) {
QString strTag2 = node.toElement().tagName();
if (strTag2 == "Count") {
count_cfg = node.toElement().text().toUInt();
g_node->n_clients = count_cfg;
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (unsigned int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
}
else if (strTag2 == "DevAccount") {
ied = g_node->clients[count_real++];
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, MAX_CPUNO * sizeof(LD_info_t));
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
QDomNodeList list2 = node.childNodes(); //获得元素node的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) { //遍历该列表
QDomNode node2 = list2.at(i2);
if (node2.isElement()) {
QString devPropTag = node2.toElement().tagName();
QString devPropVal = node2.toElement().text();
if (devPropTag == "DEV_Index") {
ied_usr->dev_idx = devPropVal.toInt();
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", devPropVal.toAscii().data());
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_code), "%s", devPropVal.toAscii().data());
}
else if (devPropTag == "DEV_Type") {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", devPropVal.toAscii().data());
cout << "dev_type" << ied_usr->dev_type << endl;
}
else if (devPropTag == "DEV_Code") {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", devPropVal.toAscii().data());
cout << "dev_code" << ied_usr->terminal_code << endl;
}
else if (devPropTag == "DEV_Key") {
QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ba.data());
}
else if (devPropTag == "DEV_Series") {
QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ba.data());
}
else if (devPropTag == "DEV_DevFlag")
ied_usr->dev_flag = devPropVal.toInt();
else if (devPropTag == "DEV_IP") {
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;
ied->channel[0].addr = ntohl(inet_addr(devPropVal.toAscii().data()));
strncpy(ied->channel[0].addr_str, devPropVal.toAscii().data(), LONGNAME - 1);
ied->channel[0].addr_str[LONGNAME - 1] = 0;
}
else if (devPropTag == "DEV_PortID")
ied->channel[0].port = devPropVal.toUInt();
}
}// for(int i2=0; i2<list2.count(); i2++)
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
} //else if ( strTag2 == "DevAccount" )
}
}
}
}
n = n.nextSibling(); //下一个兄弟节点
}
if (count_real < count_cfg)
g_node->n_clients = count_real;
if (count_cfg != count_real)
return APR_EBADF;
return APR_SUCCESS;
}
int parse_line_cfg()
{
ied_t* ied;
ied_usr_t* ied_usr;
int count_cfg = 0;
int count_real = 0;
LD_info_t line_info;
int dev_idx_in_line = 0;
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/");
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(cfg_dir + LINE_CONFIG_FN);
if (!file.open(QIODevice::ReadOnly))
return APR_EBADPATH; //以只读方式打开
if (!doc.setContent(&file)) {
file.close();
return APR_EBADF;
}
//将文件内容读到doc中
QDomElement docElem = doc.documentElement(); //返回根元素
QDomNode n = docElem.firstChild(); //返回根节点的第一个子节点
while (!n.isNull())
{ //如果节点不为空
if (n.isElement()) //如果节点是元素
{
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName();
if (strTag == "MonitorAccountList") {
QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表
for (int i = 0; i < list.count(); i++) //遍历该列表
{
QDomNode node = list.at(i);
if (node.isElement()) {
QString strTag2 = node.toElement().tagName();
if (strTag2 == "Count") {
count_cfg = node.toElement().text().toInt();
}
else if (strTag2 == "MonitorAccount") {
count_real++;
dev_idx_in_line = -1;
memset(&line_info, 0, sizeof(line_info));
QDomNodeList list2 = node.childNodes(); //获得元素node的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) { //遍历该列表
QDomNode node2 = list2.at(i2);
if (node2.isElement()) {
QString devPropTag = node2.toElement().tagName();
QString devPropVal = node2.toElement().text();
if (devPropTag == "LINE_Index") {
line_info.line_id = devPropVal.toInt();
strcpy(line_info.mp_id, devPropVal.toAscii().data());
}
else if (devPropTag == "DEV_Index") {
strcpy(line_info.terminal_code, devPropVal.toAscii().data());
dev_idx_in_line = devPropVal.toInt();
}
else if (devPropTag == "CPUNO")
line_info.cpuno = devPropVal.toInt();
else if (devPropTag == "Name")
apr_snprintf(line_info.name, sizeof(line_info.name), "%s", devPropVal.toAscii().data());
//strcpy(line_info.mp_id, "not def");
//strcpy(line_info.terminal_code, "tmpcode1");
strcpy(line_info.voltage_level, "14");
line_info.read_flag = 1;
}
}// for(int i2=0; i2<list2.count(); i2++)
ied = find_ied_from_dev_idx(dev_idx_in_line);
if (ied && ied->usr_ext && line_info.cpuno) {
char str[256];
byte_t cpuno = line_info.cpuno;
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->LD_info[cpuno - 1] = line_info;
ied_usr->LD_info[cpuno - 1].ied = ied;
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].rptcount = 0;
if (cpuno > ied->cpucount)
ied->cpucount = cpuno;
}
} //else if ( strTag2 == "DevAccount" )
}
}
}
}
n = n.nextSibling(); //下一个兄弟节点
}
if (count_cfg != count_real)
return APR_EBADF;
return APR_SUCCESS;
}
#endif
//////////////////////////////////////////////////////////CZY
void update_odbc(char* newServicename, char* newPort) {
const char* filename = "/etc/odbc.ini";
const char* searchip = "Servername="; // 要查找的行的开头
const char* searchport = "Port="; // 要查找的行的开头
const char* tempFilename = "/tmp/odbc.ini.XXXXXX"; // 临时文件名
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("Error opening file\n");
return;
}
// 创建临时文件
char tempFilenameBuffer[256];
strcpy(tempFilenameBuffer, tempFilename);
int tempfd = mkstemp(tempFilenameBuffer);
FILE* tempfile = fdopen(tempfd, "w");
// 逐行读取文件
char line[256];
while (fgets(line, sizeof(line), file)) {
if (strncmp(line, searchip, strlen(searchip)) == 0) {
// 如果找到要修改的行,则写入新的值
fprintf(tempfile, "Servername=%s\n", newServicename);
}
else if (strncmp(line, searchport, strlen(searchport)) == 0) {
// 如果找到要修改的行,则写入新的值
fprintf(tempfile, "Port=%s\n", newPort);
}
else {
// 否则将原始行写入临时文件
fputs(line, tempfile);
}
}
// 关闭文件
fclose(file);
fclose(tempfile);
// 替换原始文件
remove(filename);
rename(tempFilenameBuffer, filename);
}
//CZY 2023-09-06 config
void init_config() {
QByteArray ba;
QString MyKafkaIniFilename = QString("../etc/") + QString("mykafka.ini"); //+QString::fromAscii(subdir)
QSettings settings(MyKafkaIniFilename, QSettings::IniFormat);
ACCOUNT_UPDATE_INTERVAL = settings.value("AccountUpdate/Interval", 0).toInt();
qDebug() << "Read ACCOUNT_UPDATE_INTERVAL:" << ACCOUNT_UPDATE_INTERVAL << endl;
ba = settings.value("AccountUpdate/LastUpdateTime", "").toString().toLatin1();
ACCOUNT_UPDATE_LAST_TIME = strdup(ba.data());
qDebug() << "Read ACCOUNT_UPDATE_LAST_TIME:" << ACCOUNT_UPDATE_LAST_TIME << endl;
MULIT_NODE_INTERVAL = settings.value("MultiNode/Interval", 0).toInt();
qDebug() << "Read MULIT_NODE_INTERVAL:" << MULIT_NODE_INTERVAL << endl;
SEND_FLAG = settings.value("Flag/SendFlag", 0).toInt();
qDebug() << "Read SEND_FLAG:" << SEND_FLAG << endl;
FILE_FLAG = settings.value("Flag/FileFlag", 0).toInt();
qDebug() << "Read FILE_FLAG:" << FILE_FLAG << endl;
FRONT_INST = settings.value("Flag/FrontInst", 0).toInt();
qDebug() << "Read FRONT_INST:" << FRONT_INST << endl;
ba = settings.value("Flag/FrontIP", "").toString().toLatin1();
FRONT_IP = strdup(ba.data());
qDebug() << "Read FRONT_IP:" << FRONT_IP << endl;
CITY_FLAG = settings.value("Flag/CityFlag", 0).toInt();
qDebug() << "Read CITY_FLAG:" << CITY_FLAG << endl;
//台账配置lnk20241031//////////////////////////////////////////////////////////////
TERMINAL_STATUS = settings.value("Ledger/TerminalStatus", 0).toString().toStdString();
std::cout << "Read TERMINAL_STATUS:" << TERMINAL_STATUS << std::endl;
MONITOR_STATUS = settings.value("Ledger/MonitorStatus", 0).toString().toStdString();
std::cout << "Read MONITOR_STATUS:" << MONITOR_STATUS << std::endl;
ICD_FLAG = settings.value("Ledger/IcdFlag", 0).toString().toStdString();
std::cout << "Read ICD_FLAG:" << ICD_FLAG << std::endl;
//////////////////////////////////////////////////添加socket开关///////////////////
SOCKETENABLE = settings.value("Socket/SocketEnable", 0).toInt();
SOCKET_PORT = settings.value("Socket/SocketPort", 0).toInt();
//////添加http配置//////////////////////////////////////////////////////////////////
HTTPENABLE = settings.value("Http/HttpEnable", 0).toInt();
ba = settings.value("Http/HttpIp", "").toString().toLatin1();
HTTP_IP = strdup(ba.data());
std::cout << "Read HTTP_IP:" << HTTP_IP << std::endl;
HTTP_PORT = settings.value("Http/HttpPort", 0).toInt();
std::cout << "Read HTTP_PORT:" << HTTP_PORT << std::endl;
ba = settings.value("Http/WebDevice", "").toString().toLatin1();
WEB_DEVICE = strdup(ba.data());
std::cout << "Read WEB_DEVICE:" << WEB_DEVICE << std::endl;
ba = settings.value("Http/WebIcd", "").toString().toLatin1();
WEB_ICD = strdup(ba.data());
std::cout << "Read WEB_ICD:" << WEB_ICD << std::endl;
ba = settings.value("Http/WebIntegrity", "").toString().toLatin1();
WEB_INTEGRITY = strdup(ba.data());
std::cout << "Read WEB_INTEGRITY:" << WEB_INTEGRITY << std::endl;
ba = settings.value("Http/WebComflag", "").toString().toLatin1();
WEB_COMFLAG = strdup(ba.data());
std::cout << "Read WEB_COMFLAG:" << WEB_COMFLAG << std::endl;
ba = settings.value("Http/WebEvent", "").toString().toLatin1();
WEB_EVENT = strdup(ba.data());
std::cout << "Read WEB_EVENT:" << WEB_EVENT << std::endl;
ba = settings.value("Http/WebFileupload", "").toString().toLatin1();
WEB_FILEUPLOAD = strdup(ba.data());
std::cout << "Read WEB_FILEUPLOAD:" << WEB_FILEUPLOAD << std::endl;
ba = settings.value("Http/WebFiledownload", "").toString().toLatin1();
WEB_FILEDOWNLOAD = strdup(ba.data());
std::cout << "Read WEB_FILEDOWNLOAD:" << WEB_FILEDOWNLOAD << std::endl;
///////////////////////////////////////////////////////////////////////////////////////////////////////
recall_len = settings.value("Recall/recall_lenth", 0).toInt();
qDebug() << "Read recall_lenth:" << recall_len << endl;
recall_sta = settings.value("Recall/recall_start", 0).toInt();
qDebug() << "Read recall_start:" << recall_sta << endl;
recall_daily = settings.value("Recall/recall_dailytime", 0).toInt();
qDebug() << "Read recall_dailytime:" << recall_daily << endl;
COMMUNICATION_LOG_STATUS_TIME = settings.value("CommunicationLog/StatusRecordDuration", 0).toInt();
qDebug() << "Read COMMUNICATION_LOG_STATUS_TIME:" << COMMUNICATION_LOG_STATUS_TIME << endl;
COMMUNICATION_LOG_ABNORMAL_TIME = settings.value("CommunicationLog/AbnormalRecordDuration", 0).toInt();
qDebug() << "Read COMMUNICATION_LOG_ABNORMAL_TIME:" << COMMUNICATION_LOG_ABNORMAL_TIME << endl;
ba = settings.value("Postgres/Database", "").toString().toLatin1();
POSTGRES_DATABASE = strdup(ba.data());
ba = settings.value("Postgres/Username", "").toString().toLatin1();
POSTGRES_USERNAME = strdup(ba.data());
/*QString postgres_password = settings.value("Postgres/Password", "").toString();
ba = QByteArray::fromBase64(postgres_password.toAscii());*/
ba = settings.value("Postgres/Password", "").toString().toLatin1();
POSTGRES_PASSWORD = strdup(ba.data());
ba = settings.value("Postgres/Schema", "").toString().toLatin1();
POSTGRES_SCHEMA = strdup(ba.data());
ba = settings.value("Postgres/Dnsname", "").toString().toLatin1();
POSTGRES_DNSNAME = strdup(ba.data());
ba = settings.value("Postgres/TablePrefix", "").toString().toLatin1();
POSTGRES_TABLEPREFIX = strdup(ba.data());
qDebug() << "Read POSTGRES_DATABASE:" << POSTGRES_DATABASE << endl;
qDebug() << "Read POSTGRES_USERNAME:" << POSTGRES_USERNAME << endl;
qDebug() << "Read POSTGRES_PASSWORD:" << POSTGRES_PASSWORD << endl;
qDebug() << "Read POSTGRES_SCHEMA:" << POSTGRES_SCHEMA << endl;
qDebug() << "Read POSTGRES_DNSNAME:" << POSTGRES_DNSNAME << endl;
qDebug() << "Read POSTGRES_TABLEPREFIX:" << POSTGRES_TABLEPREFIX << endl;
ba = settings.value("Oss/OssEndpoint", "").toString().toLatin1();
OSS_ENDPOINT = strdup(ba.data());
ba = settings.value("Oss/AccessKeyID", "").toString().toLatin1();
ACCESS_KEY_ID = strdup(ba.data());
ba = settings.value("Oss/AccessKeySecret", "").toString().toLatin1();
ACCESS_KEY_SECRET = strdup(ba.data());
ba = settings.value("Oss/BucketName", "").toString().toLatin1();
BUCKET_NAME = strdup(ba.data());
qDebug() << "Read OSS_ENDPOINT:" << OSS_ENDPOINT << endl;
qDebug() << "Read ACCESS_KEY_ID:" << ACCESS_KEY_ID << endl;
qDebug() << "Read ACCESS_KEY_SECRET:" << ACCESS_KEY_SECRET << endl;
qDebug() << "Read BUCKET_NAME:" << BUCKET_NAME << endl;
ba = settings.value("Kafka/brokerlist", "").toString().toLatin1();
BROKER_LIST = strdup(ba.data());
ba = settings.value("Kafka/HisTopic", "").toString().toLatin1();
TOPIC_STAT = strdup(ba.data());
ba = settings.value("Kafka/PSTTopic", "").toString().toLatin1();
TOPIC_PST = strdup(ba.data());
ba = settings.value("Kafka/PLTTopic", "").toString().toLatin1();
TOPIC_PLT = strdup(ba.data());
ba = settings.value("Kafka/EventTopic", "").toString().toLatin1();
TOPIC_EVENT = strdup(ba.data());
ba = settings.value("Kafka/AlmTopic", "").toString().toLatin1();
TOPIC_ALARM = strdup(ba.data());
ba = settings.value("Kafka/SngTopic", "").toString().toLatin1();
TOPIC_SNG = strdup(ba.data());
ba = settings.value("Kafka/RTDataTopic", "").toString().toLatin1();
TOPIC_RTDATA = strdup(ba.data());
qDebug() << "Read BROKER_LIST:" << BROKER_LIST << endl;
qDebug() << "Read TOPIC_STAT:" << TOPIC_STAT << endl;
qDebug() << "Read TOPIC_PST:" << TOPIC_PST << endl;
qDebug() << "Read TOPIC_PLT:" << TOPIC_PLT << endl;
qDebug() << "Read TOPIC_EVENT:" << TOPIC_EVENT << endl;
qDebug() << "Read TOPIC_ALARM:" << TOPIC_ALARM << endl;
qDebug() << "Read TOPIC_SNG:" << TOPIC_SNG << endl;
qDebug() << "Read TOPIC_RTDATA:" << TOPIC_RTDATA << endl;
ba = settings.value("Kafka/Protocol", "").toString().toLatin1();
PROTOCOL = strdup(ba.data());
ba = settings.value("Kafka/Mechanisms", "").toString().toLatin1();
MECHANISMS = strdup(ba.data());
ba = settings.value("Kafka/KeytabFile", "").toString().toLatin1();
KEYTAB_FILE = strdup(ba.data());
ba = settings.value("Kafka/ServiceName", "").toString().toLatin1();
SERVICE_NAME = strdup(ba.data());
ba = settings.value("Kafka/Principal", "").toString().toLatin1();
PRINCIPAL = strdup(ba.data());
ba = settings.value("Kafka/DomainName", "").toString().toLatin1();
DOMAIN_NAME = strdup(ba.data());
qDebug() << "Read PROTOCOL:" << PROTOCOL << endl;
qDebug() << "Read MECHANISMS:" << MECHANISMS << endl;
qDebug() << "Read KEYTAB_FILE:" << KEYTAB_FILE << endl;
qDebug() << "Read SERVICE_NAME:" << SERVICE_NAME << endl;
qDebug() << "Read PRINCIPAL:" << PRINCIPAL << endl;
qDebug() << "Read DOMAIN_NAME:" << DOMAIN_NAME << endl;
ba = settings.value("Web/ClientId", "").toString().toLatin1();
CLIENT_ID = strdup(ba.data());
ba = settings.value("Web/ClientSecret", "").toString().toLatin1();
CLIENT_SECRET = strdup(ba.data());
ba = settings.value("Web/TokenUrl", "").toString().toLatin1();
TOKEN_URL = strdup(ba.data());
ba = settings.value("Web/DeviceUrl", "").toString().toLatin1();
DEVICE_URL = strdup(ba.data());
ba = settings.value("Web/GrantType", "").toString().toLatin1();
GRANT_TYPE = strdup(ba.data());
qDebug() << "Read CLIENT_ID:" << CLIENT_ID << endl;
qDebug() << "Read CLIENT_SECRET:" << CLIENT_SECRET << endl;
qDebug() << "Read TOKEN_URL:" << TOKEN_URL << endl;
qDebug() << "Read DEVICE_URL:" << DEVICE_URL << endl;
qDebug() << "Read GRANT_TYPE:" << GRANT_TYPE << endl;
ba = settings.value("Uds/UdsUploadUrl", "").toString().toLatin1();
UDS_UPLOAD_URL = strdup(ba.data());
ba = settings.value("Uds/UdsDownloadUrl", "").toString().toLatin1();
UDS_DOWNLOAD_URL = strdup(ba.data());
qDebug() << "Read UDS_UPLOAD_URL:" << UDS_UPLOAD_URL << endl;
qDebug() << "Read UDS_DOWNLOAD_URL:" << UDS_DOWNLOAD_URL << endl;
/*添加rocketmq的解析10-9 */////////////////////////////////////////////////////////////////
//生产者
ba = settings.value("RocketMq/producer", "").toString().toLatin1();
G_ROCKETMQ_PRODUCER = strdup(ba.data());
ba = settings.value("RocketMq/Ipport", "").toString().toLatin1();
G_ROCKETMQ_IPPORT = strdup(ba.data());
ba = settings.value("RocketMq/Topic", "").toString().toLatin1();
G_ROCKETMQ_TOPIC = strdup(ba.data());
ba = settings.value("RocketMq/Tag", "").toString().toLatin1();
G_ROCKETMQ_TAG = strdup(ba.data());
ba = settings.value("RocketMq/Key", "").toString().toLatin1();
G_ROCKETMQ_KEY = strdup(ba.data());
QUEUENUM = settings.value("RocketMq/Queuenum", 0).toInt();
//消费者
ba = settings.value("RocketMq/consumer", "").toString().toLatin1();
G_ROCKETMQ_CONSUMER = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerIpport", "").toString().toLatin1();
G_MQCONSUMER_IPPORT = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTopicRT", "").toString().toLatin1();
G_MQCONSUMER_TOPIC_RT = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTagRT", "").toString().toLatin1();
G_MQCONSUMER_TAG_RT = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerKeyRT", "").toString().toLatin1();
G_MQCONSUMER_KEY_RT = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerAccessKey", "").toString().toLatin1();
G_MQCONSUMER_ACCESSKEY = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerSecretKey", "").toString().toLatin1();
G_MQCONSUMER_SECRETKEY = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerChannel", "").toString().toLatin1();
G_MQCONSUMER_CHANNEL = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTopicUD", "").toString().toLatin1();
G_MQCONSUMER_TOPIC_UD = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTagUD", "").toString().toLatin1();
G_MQCONSUMER_TAG_UD = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerKeyUD", "").toString().toLatin1();
G_MQCONSUMER_KEY_UD = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTopicRC", "").toString().toLatin1();
G_MQCONSUMER_TOPIC_RC = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTagRC", "").toString().toLatin1();
G_MQCONSUMER_TAG_RC = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerKeyRC", "").toString().toLatin1();
G_MQCONSUMER_KEY_RC = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTopicSET", "").toString().toLatin1();
G_MQCONSUMER_TOPIC_SET = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerTagSET", "").toString().toLatin1();
G_MQCONSUMER_TAG_SET = strdup(ba.data());
ba = settings.value("RocketMq/ConsumerKeySET", "").toString().toLatin1();
G_MQCONSUMER_KEY_SET = strdup(ba.data());
//MQ测试
G_TEST_FLAG = settings.value("RocketMq/Testflag", 0).toInt();
G_TEST_NUM = settings.value("RocketMq/Testnum", 0).toInt();
//测试shell
TEST_PORT = settings.value("RocketMq/TestPort", 0).toInt();
//生产者相关打印
std::cout << "Read G_ROCKETMQ_PRODUCER:" << G_ROCKETMQ_PRODUCER << std::endl;
std::cout << "Read G_ROCKETMQ_IPPORT:" << G_ROCKETMQ_IPPORT << std::endl;
std::cout << "Read G_ROCKETMQ_TOPIC:" << G_ROCKETMQ_TOPIC << std::endl;
std::cout << "Read G_ROCKETMQ_TAG:" << G_ROCKETMQ_TAG << std::endl;
std::cout << "Read G_ROCKETMQ_KEY:" << G_ROCKETMQ_KEY << std::endl;
std::cout << "Read QUEUENUM:" << QUEUENUM << std::endl;
//消费者相关打印
std::cout << "Read G_ROCKETMQ_CONSUMER:" << G_ROCKETMQ_CONSUMER << std::endl;
std::cout << "Read G_MQCONSUMER_IPPORT:" << G_MQCONSUMER_IPPORT << std::endl;
std::cout << "Read G_MQCONSUMER_TOPIC_RT:" << G_MQCONSUMER_TOPIC_RT << std::endl;
std::cout << "Read G_MQCONSUMER_TAG_RT:" << G_MQCONSUMER_TAG_RT << std::endl;
std::cout << "Read G_MQCONSUMER_KEY_RT:" << G_MQCONSUMER_KEY_RT << std::endl;
std::cout << "Read G_MQCONSUMER_ACCESSKEY:" << G_MQCONSUMER_ACCESSKEY << std::endl;
std::cout << "Read G_MQCONSUMER_SECRETKEY:" << G_MQCONSUMER_SECRETKEY << std::endl;
std::cout << "Read G_MQCONSUMER_CHANNEL:" << G_MQCONSUMER_CHANNEL << std::endl;
std::cout << "Read G_MQCONSUMER_TOPIC_UD:" << G_MQCONSUMER_TOPIC_UD << std::endl;
std::cout << "Read G_MQCONSUMER_TAG_UD:" << G_MQCONSUMER_TAG_UD << std::endl;
std::cout << "Read G_MQCONSUMER_KEY_UD:" << G_MQCONSUMER_KEY_UD << std::endl;
std::cout << "Read G_MQCONSUMER_TOPIC_RC:" << G_MQCONSUMER_TOPIC_RC << std::endl;
std::cout << "Read G_MQCONSUMER_TAG_RC:" << G_MQCONSUMER_TAG_RC << std::endl;
std::cout << "Read G_MQCONSUMER_KEY_RC:" << G_MQCONSUMER_KEY_RC << std::endl;
std::cout << "Read G_MQCONSUMER_TOPIC_SET:" << G_MQCONSUMER_TOPIC_SET << std::endl;
std::cout << "Read G_MQCONSUMER_TAG_SET:" << G_MQCONSUMER_TAG_SET << std::endl;
std::cout << "Read G_MQCONSUMER_KEY_SET:" << G_MQCONSUMER_KEY_SET << std::endl;
//Mq测试相关打印
std::cout << "Read G_TEST_FLAG:" << G_TEST_FLAG << std::endl;
std::cout << "Read G_TEST_NUM:" << G_TEST_NUM << std::endl;
/////////////////////////////////////////////////////////////////////////////////////////
/*Nacos_GetParam(POSTGRES_USERNAME, POSTGRES_PASSWORD, CLIENT_ID, CLIENT_SECRET);
qDebug() << "Read CLIENT_ID:" << CLIENT_ID << endl;
qDebug() << "Read CLIENT_SECRET:" << CLIENT_SECRET << endl;
qDebug() << "Read POSTGRES_USERNAME:" << POSTGRES_USERNAME << endl;
qDebug() << "Read POSTGRES_PASSWORD:" << POSTGRES_PASSWORD << endl;*/
/*lnk10-12 暂不使用Nacos*/
/*
char* database_ip = NULL;
char* database_port = NULL;
sleep(3);
Read_Nacos_Param_Postgres(&database_ip, &database_port, &POSTGRES_DATABASE, &POSTGRES_USERNAME, &POSTGRES_PASSWORD, &POSTGRES_SCHEMA, &POSTGRES_DNSNAME, &POSTGRES_TABLEPREFIX);
qDebug() << "Read database_ip:" << database_ip << endl;
qDebug() << "Read database_port:" << database_port << endl;
update_odbc(database_ip, database_port);
qDebug() << "Read POSTGRES_DATABASE:" << POSTGRES_DATABASE << endl;
qDebug() << "Read POSTGRES_USERNAME:" << POSTGRES_USERNAME << endl;
qDebug() << "Read POSTGRES_PASSWORD:" << POSTGRES_PASSWORD << endl;
qDebug() << "Read POSTGRES_SCHEMA:" << POSTGRES_SCHEMA << endl;
qDebug() << "Read POSTGRES_DNSNAME:" << POSTGRES_DNSNAME << endl;
qDebug() << "Read POSTGRES_TABLEPREFIX:" << POSTGRES_TABLEPREFIX << endl;
sleep(3);
Read_Nacos_Param_Kafka(&BROKER_LIST, &TOPIC_STAT, &TOPIC_PST, &TOPIC_PLT, &TOPIC_EVENT, &TOPIC_ALARM, &TOPIC_SNG, &PROTOCOL, &MECHANISMS, &SERVICE_NAME, &PRINCIPAL, &DOMAIN_NAME);
qDebug() << "Read BROKER_LIST:" << BROKER_LIST << endl;
qDebug() << "Read TOPIC_STAT:" << TOPIC_STAT << endl;
qDebug() << "Read TOPIC_PLT:" << TOPIC_PLT << endl;
qDebug() << "Read TOPIC_EVENT:" << TOPIC_EVENT << endl;
qDebug() << "Read TOPIC_ALARM:" << TOPIC_ALARM << endl;
qDebug() << "Read TOPIC_SNG:" << TOPIC_SNG << endl;
qDebug() << "Read PROTOCOL:" << PROTOCOL << endl;
qDebug() << "Read PRINCIPAL:" << PRINCIPAL << endl;
sleep(3);
Read_Nacos_Param_Web(&CLIENT_ID, &CLIENT_SECRET, &TOKEN_URL, &DEVICE_URL, &GRANT_TYPE);
qDebug() << "Read CLIENT_ID:" << CLIENT_ID << endl;
qDebug() << "Read CLIENT_SECRET:" << CLIENT_SECRET << endl;
qDebug() << "Read TOKEN_URL:" << TOKEN_URL << endl;
qDebug() << "Read DEVICE_URL:" << DEVICE_URL << endl;
qDebug() << "Read GRANT_TYPE:" << GRANT_TYPE << endl;
sleep(3);
Read_Nacos_Param_Flag(&FILE_FLAG, &SEND_FLAG, &FRONT_INST, &FRONT_IP);
sleep(3);
Read_Nacos_Param_Recall(&recall_len, &recall_sta, &recall_daily);
qDebug() << "Read SEND_FLAG:" << SEND_FLAG << endl;
qDebug() << "Read FILE_FLAG:" << FILE_FLAG << endl;
qDebug() << "Read FRONT_INST:" << FRONT_INST << endl;
qDebug() << "Read FRONT_IP:" << FRONT_IP << endl;
qDebug() << "Read recall_lenth:" << recall_len << endl;
qDebug() << "Read recall_start:" << recall_sta << endl;
qDebug() << "Read recall_dailytime:" << recall_daily << endl;
sleep(3);
Read_Nacos_Param_Uds(&UDS_UPLOAD_URL, &UDS_DOWNLOAD_URL, &UDS_DELETE_URL);
qDebug() << "Read UDS_UPLOAD_URL:" << UDS_UPLOAD_URL << endl;
qDebug() << "Read UDS_DOWNLOAD_URL:" << UDS_DOWNLOAD_URL << endl;
qDebug() << "Read UDS_DELETE_URL:" << UDS_DELETE_URL << endl;
*/
//2024-10-25lnk 不需要多前置前置ip从配置文件获取不连接数据库
/*
if (g_front_seg_index != 0 && g_front_seg_num != 0) {
FRONT_INST = g_front_seg_index;
if (FRONT_IP != nullptr) {
free(FRONT_IP); // 如果是通过malloc分配的
}
FRONT_IP = (char*)malloc(64); // 分配内存
// 使用sprintf将int值为字符串
sprintf(FRONT_IP, "%d", g_front_seg_index);
}
qDebug() << "Read FRONT_INST:" << FRONT_INST << endl;
qDebug() << "Read FRONT_IP:" << FRONT_IP << endl;
g_strOTLConnect = POSTGRES_USERNAME;
g_strOTLConnect.append("/");
g_strOTLConnect.append(POSTGRES_PASSWORD);
g_strOTLConnect.append("@");
g_strOTLConnect.append(POSTGRES_DNSNAME);
cout << "Read g_strOTLConnect:" << g_strOTLConnect << endl;*/
//20241212lnk添加多前置
if (g_front_seg_index != 0 && g_front_seg_num != 0) {
MULTIPLE_NODE_FLAG = 1;
std::cout << "当前功能是多进程:" << g_front_seg_index << std::endl;
}
else{
MULTIPLE_NODE_FLAG = 0;
std::cout << "当前功能是单进程:" << std::endl;
}
//20250109lnk添加进程测试打印端口
if (g_node_id == STAT_DATA_BASE_NODE_ID)//统计采集
TEST_PORT = TEST_PORT + STAT_DATA_BASE_NODE_ID + g_front_seg_index;
else if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {//补召
TEST_PORT = TEST_PORT + RECALL_HIS_DATA_BASE_NODE_ID + g_front_seg_index;
}
else if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {//3秒采集
TEST_PORT = TEST_PORT + THREE_SECS_DATA_BASE_NODE_ID + g_front_seg_index;
}
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID) {//暂态录波
TEST_PORT = TEST_PORT + SOE_COMTRADE_BASE_NODE_ID + g_front_seg_index;
}
}
// CZY 测试 ping IP
// 执行命令并获取输出结果
std::string executeCommand(const std::string& command) {
std::string result = "";
FILE* pipe = popen(command.c_str(), "r");
if (!pipe) {
std::cerr << "Error executing command." << std::endl;
return result;
}
char buffer[128];
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
bool telnet_port_socket(const char* ip, int port) {
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_pton(AF_INET, ip, &server_addr.sin_addr);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
return false;
}
// 设置连接超时时间为5秒
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0) {
perror("setsockopt");
close(sockfd);
return false;
}
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0) {
perror("setsockopt");
close(sockfd);
return false;
}
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
if (errno == EINPROGRESS) {
fd_set fds;
FD_ZERO(&fds);
FD_SET(sockfd, &fds);
int ret = select(sockfd + 1, NULL, &fds, NULL, &timeout);
if (ret == -1) {
perror("select");
close(sockfd);
return false;
}
else if (ret == 0) {
// 连接超时
close(sockfd);
return false;
}
else {
int error;
socklen_t len = sizeof(error);
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len);
if (error == 0) {
// 连接成功
close(sockfd);
return true;
}
else {
// 连接失败
close(sockfd);
return false;
}
}
}
else {
// 连接失败
close(sockfd);
return false;
}
}
// 连接成功
close(sockfd);
return true;
}
// ping IP
bool ping_ip(const std::string& ip) {
std::string command = "ping -c 1 -w 2.5 " + ip;
std::string result = executeCommand(command);
// 判断输出结果是否包含 "1 packets transmitted, 1 received" 字符串
if (result.find("1 packets transmitted, 1 received") != std::string::npos) {
return true;
}
else {
return false;
}
}
int init_ping_telnet(int& ip_count, int& telnet_count) {
cout << "start test ping telnet" << endl;
ied_t* ied = NULL;
int iedno;
LD_info_t* LD_info = NULL;
int count = 0;
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
ied = g_node->clients[iedno];
if (ied) {
//ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
if (g_onlyIP[0] != 0 && (strcmp(g_onlyIP, ied->channel[0].addr_str) != 0)) {
continue;
}
ied->channel[0].addr_str;//DEV_IP
ied->channel[0].port;//DEV_PortID
bool pingResult = ping_ip(ied->channel[0].addr_str);
//bool pingResult = test_ping(ied->channel[0].addr_str);
//bool telnetResult = telnetIPPort(ied->channel[0].addr_str, ied->channel[0].port);
bool telnetResult = telnet_port_socket(ied->channel[0].addr_str, ied->channel[0].port);
std::string strlog = "";
strlog.append("Ping to IP ");
strlog.append(ied->channel[0].addr_str);
if (pingResult) {
ip_count++;
std::cout << "Ping to IP " << ied->channel[0].addr_str << " is successful." << std::endl;
strlog.append(" is successful.");
}
else {
std::cout << "Ping to IP " << ied->channel[0].addr_str << " is unsuccessful." << std::endl;
strlog.append(" is unsuccessful.");
}
add_comm_log(const_cast<char*>(strlog.c_str()));
strlog = "";
std::string str = QString::number(ied->channel[0].port).toStdString();
strlog.append("Telnet port ");
strlog.append(str);
if (telnetResult) {
telnet_count++;
std::cout << "Telnet port " << ied->channel[0].port << " is open on IP " << ied->channel[0].addr_str << std::endl;
strlog.append(" is open on IP ");
}
else {
std::cout << "Telnet port " << ied->channel[0].port << " is closed on IP " << ied->channel[0].addr_str << std::endl;
strlog.append(" is closed on IP ");
}
strlog.append(ied->channel[0].addr_str);
add_comm_log(const_cast<char*>(strlog.c_str()));
cout << "iedno:" << iedno << " ip_count:" << ip_count << " telnet_count:" << telnet_count << endl;
QString MyKafkaIniFilename = QString("../etc/") + QString("testping.ini"); //+QString::fromAscii(subdir)
QSettings settings(MyKafkaIniFilename, QSettings::IniFormat);
settings.setValue("test/IpCount", ip_count);
settings.setValue("test/TelnetCount", telnet_count);
settings.setValue("test/IedCount", iedno);
}
}
cout << "end test ping telnet" << endl;
return 1;
}
//CZY 2023-08-30 read device account from web api
long long charToLongLong(const char* time_str) {
string str_time = "2022-01-01 10:00:00";
struct tm tm_time = {};
strptime(str_time.c_str(), "%Y-%m-%d %H:%M:%S", &tm_time);
time_t time_stamp = mktime(&tm_time);
//cout << "时间戳为:" << time_stamp << endl;
return time_stamp;
}
//CZY 2023-08-30 chat* null or emptry
bool isCharPtrEmpty(const char* str) {
return str == nullptr || str[0] == '\0' || str == "";
}
// CZY 2024-07-24 函数:检查字符串是否全为数字
int isAllDigits(const char* str) {
while (*str) {
if (!isdigit((unsigned char)*str)) {
return 0; // 发现非数字字符
}
str++;
}
return 1; // 所有字符都是数字
}
// CZY 2024-07-24函数将字符串转换为int如果可能
int stringToInt(const char* str, int* result) {
if (isAllDigits(str)) {
*result = atoi(str); // 使用atoi进行转换注意atoi不会检查溢出
return 1; // 转换成功
}
return 0; // 转换失败
}
//lnk20241206不使用的代码
#if 0
void GetWebApiJson(int perpage, int page, int flag);
//CZY 2023-10-12
int read_terminal_ext_pg(QMap<QString, terminal_ext*>* terminal_ext_map) {
cout << "start read terminal_ext" << endl;
terminal_ext* ext;
//读取数据
try {
OTLConnect();
//int rtState = OTLState();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select \"terminal_code\",\"terminal_identify_code\",\"terminal_key\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_terminal_ext");
str1.append("\";");
//cout << "pg sql1 is:" << str1 << endl;
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
while (!i.eof()) { //while not end-of-data
char terminal_code[100];
char terminal_identify_code[100];
char terminal_key[100];
i >> terminal_code >> terminal_identify_code >> terminal_key;
//qDebug() << "terminal_ext1:" << terminal_code << "," <<terminal_identify_code << "," <<terminal_key << endl;
if (!terminal_ext_map->contains(terminal_code)) {
ext = new terminal_ext();
terminal_ext_map->insert(terminal_code, ext);
apr_snprintf(ext->terminal_identify_code, sizeof(ext->terminal_identify_code), "%s", terminal_identify_code);//terminal_code
apr_snprintf(ext->terminal_key, sizeof(ext->terminal_key), "%s", terminal_key);//terminal_code
//qDebug() << "terminal_ext2:" << terminal_code << "," << ext->terminal_identify_code << "," << ext->terminal_key << endl;
}
else
{
qDebug() << terminal_code << endl;
}
}
OTLDisconnect();
cout << "end read terminal_ext" << endl;
return 1;
}
catch (otl_exception& e)
{
printf("\ndev PostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
}
static QString strDevCJson;
static QString strToken;
//CZY 2023-09-10 web device
//flag
int parse_device_cfg_json()
{
qDebug() << "parse_device_cfg_json" << endl;
if (FRONT_INST == 0 || FRONT_IP[0] == '\0') {
MULTIPLE_NODE_FLAG = 0;
cout << "set MULTIPLE_NODE_FLAG:0,because do not have FRONT_INST or FRONT_IP" << endl;
}
char front_type[2];
int mp_num;
if (MULTIPLE_NODE_FLAG) {
//std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(POSTGRES_SCHEMA);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("meas_pq_front_list_tr");
str1.append("\" where \"front_ip\" = '");
str1.append(FRONT_IP);
str1.append("' and \"front_inst\" = ");
std::string str3 = QString::number(FRONT_INST).toStdString();
str1.append(str3);
str1.append(";");
try {
OTLConnect();
otl_stream i1(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
int front_count;
while (!i1.eof()) { //while not end-of-data
i1 >> front_count;
//cout << "count=" << f2 << endl;
}
cout << "count=" << front_count << endl;
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
QString selectFrontSql;
selectFrontSql.append(QString("select \"front_type\",\"mp_num\" from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where \"front_ip\" = '0.0.0.0' and \"front_inst\"=0"));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
OTLConnect();
otl_stream i2(1, // buffer size
selectFrontSql.toStdString().c_str(),
//SELECT statement
db //connect object
);
//create select stream
while (!i2.eof()) { //while not end-of-data
i2 >> front_type >> mp_num;
break;
//cout << "count=" << f2 << endl;
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
QString addFrontSql;
addFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
addFrontSql.append(QString("values('%1',10000,%2,'%3','01','%4',200) ").arg(FRONT_IP).arg(FRONT_INST).arg(front_type).arg(PROGRAM_VERSION));
addFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
addFrontSql.append(QString("\"front_type\"= '%1',\"front_version\"='%2'").arg(front_type).arg(PROGRAM_VERSION));
cout << addFrontSql.toStdString().c_str() << endl;
OTLConnect();
int rt = write_to_db(addFrontSql.toStdString().c_str());
OTLDisconnect();
}
cout << "mp_num:" << mp_num << " FRONT_INST:" << FRONT_INST << endl;
ied_t* ied;
ied_usr_t* ied_usr;
chnl_usr_t* chnl_usr;
int count_cfg = 0;
int count_real = 0;
//多个设备循环,中台读取台账终端数量
int array_size = 0;
//读取数据
//string* json_buf;
cJSON* json = NULL;
cJSON* json_value = NULL;
cJSON* json_records = NULL;
cJSON* json_node = NULL;
int dev_num = 0;
QMap<QString, terminal_ext*> terminal_ext_map;
read_terminal_ext_pg(&terminal_ext_map);
try {
int effective_flag = 1;
//读取台账失败次数 5次
int dev_read_count = 0;
int total;
while (effective_flag == 1 && dev_read_count <= 5) {
effective_flag = 0;
dev_read_count++;
GetWebApiJson(1, 1, CITY_FLAG);
if (strDevCJson == "") {
cout << "json select total error" << endl;
return APR_EBADF;
}
//char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"16M00000128569231\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}}],\"searchCount\":true,\"size\":1,\"total\":391}},\"status\":\"000000\"}";
/* char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"16M00000128569231\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}},{\"assets\":[],\"distribution\":1,\"id\":\"af8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"16M00002128569231\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"af8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"100.232.245.97\"}}],\"searchCount\":true,\"size\":2,\"total\":391}},\"status\":\"000000\"}";
json = cJSON_Parse(json_buf);*/
//char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"E8300\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.161.208.227\",\"equipCode\":\"22M00000299758903\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"20102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}},{\"assets\":[],\"distribution\":1,\"id\":\"af8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"E8300\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.161.208.237\",\"equipCode\":\"22M00000299800679\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"af8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"10022\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"100.232.245.97\"}}],\"searchCount\":true,\"size\":2,\"total\":391}},\"status\":\"000000\"}";
//json = cJSON_Parse(json_buf);
//char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}}],\"searchCount\":true,\"size\":1,\"total\":391}},\"status\":\"000000\"}";
json = cJSON_Parse(strDevCJson.toUtf8().constData()); //json格式序列化
//cout << cJSON_Print(json) << endl;
if (NULL == json)
{
printf("cJSON_Parse error:%s\n", cJSON_GetErrorPtr());
return APR_EBADF;
}
json_records = cJSON_GetObjectItem(json, "result"); //获取result
json_records = cJSON_GetObjectItem(json_records, "0751002"); //获取0751002
json_value = cJSON_GetObjectItem(json_records, "total"); //获取 total
if (json_value != NULL) {
total = json_value->valueint;
}
cJSON_Delete(json);
if (MULTIPLE_NODE_FLAG && g_front_seg_num == 0) {
GetWebApiJson(mp_num, FRONT_INST, CITY_FLAG);
}
else if (MULTIPLE_NODE_FLAG && g_front_seg_num != 0) {
int front_num = (total / g_front_seg_num) + 1;
GetWebApiJson(front_num, FRONT_INST, CITY_FLAG);
}
else {
/* cout << "dev total:" << total << endl;
if (total > 300) {
total = 300;
cout << "update dev total:" << total << endl;
}*/
GetWebApiJson(total, 1, CITY_FLAG);
}
if (strDevCJson == "") {
cout << "select dev json error" << endl;
return APR_EBADF;
}
json = cJSON_Parse(strDevCJson.toUtf8().constData()); //json格式序列化
//json = cJSON_Parse(json_buf);
json_records = cJSON_GetObjectItem(json, "result"); //获取result
json_records = cJSON_GetObjectItem(json_records, "0751002"); //获取0751002
json_value = cJSON_GetObjectItem(json_records, "size"); //获取 size
json_records = cJSON_GetObjectItem(json_records, "records"); //获取records
array_size = cJSON_GetArraySize(json_records); //获取数组大小
if (array_size <= 1) {
effective_flag = 1;
if (dev_read_count <= 5) {
cJSON_Delete(json);
}
}
}
count_cfg = array_size;
cout << "count_cfg" << "--" << count_cfg << endl;
g_node->n_clients = count_cfg;
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
printf("array_size=%d\n", array_size);
for (int i = 0; i < array_size; i++)
{
json_node = cJSON_GetArrayItem(json_records, i);//array
json_node = cJSON_GetObjectItem(json_node, "resource"); //获取resource
ied = g_node->clients[count_real++];
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, MAX_CPUNO * sizeof(LD_info_t));
for (int num = 0; num < MAX_CPUNO; num++) {
ied_usr->LD_info[num].read_flag = 0;
}
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
json_value = cJSON_GetObjectItem(json_node, "astId"); //获取 astId
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", json_value->valuestring);//terminal_id
cout << "terminal_id:" << json_value->valuestring << "--" << ied_usr->terminal_id << endl;
}
else {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", "");//terminal_id
cout << "default terminal_id:" << ied_usr->terminal_id << endl;
}
json_value = cJSON_GetObjectItem(json_node, "equipCode"); //获取 equipCode
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", json_value->valuestring);//terminal_code
cout << "terminal_code:" << json_value->valuestring << "--" << ied_usr->terminal_code << endl;
}
else {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", "");//terminal_code
cout << "default terminal_code:" << ied_usr->terminal_code << endl;
}
json_value = cJSON_GetObjectItem(json_node, "city#Name"); //获取 city#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->org_name, sizeof(ied_usr->org_name), "%s", json_value->valuestring);//org_name
cout << "org_name:" << json_value->valuestring << "--" << ied_usr->org_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "maintOrg#Name"); //获取 maintOrg#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->maint_name, sizeof(ied_usr->maint_name), "%s", json_value->valuestring);//maint_name
cout << "maint_name:" << json_value->valuestring << "--" << ied_usr->maint_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "station#Name"); //获取 station#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->station_name, sizeof(ied_usr->station_name), "%s", json_value->valuestring);//station_name
cout << "station_name:" << json_value->valuestring << "--" << ied_usr->station_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "manufacturer#Name"); //获取 manufacturer#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", json_value->valuestring);//tmnl_factory
cout << "tmnl_factory:" << json_value->valuestring << "--" << ied_usr->tmnl_factory << endl;
}
json_value = cJSON_GetObjectItem(json_node, "deployState"); //获取 deployState
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", json_value->valuestring);//tmnl_status
cout << "tmnl_status:" << json_value->valuestring << "--" << ied_usr->tmnl_status << endl;
}
else {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", "10");//tmnl_status
cout << "default tmnl_status:" << ied_usr->tmnl_status << endl;
}
//json_value = cJSON_GetObjectItem(json_node, "lastUpdateTime"); //获取 lastUpdateTime
json_value = cJSON_GetObjectItem(json_node, "ctime"); //获取 ctime
if (json_value != NULL && json_value->string != NULL) {
//ied_usr->time = strtoll(json_value->valuestring, NULL, 10);//time
ied_usr->time = charToLongLong(json_value->valuestring);//time
cout << "time:" << ied_usr->time << endl;
}
json_value = cJSON_GetObjectItem(json_node, "model"); //获取 model
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", json_value->valuestring);//DEV_Type
cout << "dev_type:" << json_value->valuestring << "--" << ied_usr->dev_type << endl;
}
else {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", "no-type");//DEV_Type
cout << "default dev_type:" << ied_usr->dev_type << endl;
}
int t = 0;
if (t) {
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "!qaz@wsx3edc4rfv");//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "Pqs&cn870299");//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else {
cout << "code:" << ied_usr->terminal_code << endl;
if (terminal_ext_map.contains(QString::fromUtf8(ied_usr->terminal_code))) {
//terminal_ext* ext = terminal_ext_map.value(ied_usr->terminal_code);
terminal_ext* ext = terminal_ext_map.value(QString::fromUtf8(ied_usr->terminal_code));
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ext->terminal_key);//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ext->terminal_identify_code);//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else
{
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
}
ied_usr->dev_flag = 0;//DEV_DevFlag
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;//channel
cout << "channel_type:" << ied->channel[0].channel_type << endl;
ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
json_value = cJSON_GetObjectItem(json_node, "ipAddress"); //获取 ipAddress
if (json_value != NULL && json_value->string != NULL) {
if (t && i == 0) {
ied->channel[0].addr = ntohl(inet_addr("172.40.251.35"));//DEV_IP
strncpy(ied->channel[0].addr_str, "172.40.251.35", LONGNAME - 1);//DEV_IP
}
else {
ied->channel[0].addr = ntohl(inet_addr(json_value->valuestring));//DEV_IP
strncpy(ied->channel[0].addr_str, json_value->valuestring, LONGNAME - 1);//DEV_IP
}
cout << "addr:" << json_value->valuestring << "--" << ied->channel[0].addr << "--" << ied->channel[0].addr_str << endl;
}
else {
ied->channel[0].addr = ntohl(inet_addr("0.0.0.1"));//DEV_IP
strncpy(ied->channel[0].addr_str, "0.0.0.1", LONGNAME - 1);//DEV_IP
//}
cout << "default addr:" << ied->channel[0].addr_str << endl;
}
json_value = cJSON_GetObjectItem(json_node, "portNum"); //获取 portNum
if (json_value != NULL && json_value->string != NULL) {
ied->channel[0].port = atoi(json_value->valuestring);//DEV_PortID
if (t) {
ied->channel[0].port = atoi("102");//DEV_PortID
}
cout << "port:" << "--" << atoi(json_value->valuestring) << "--" << ied->channel[0].port << endl;
}
else {
ied->channel[0].port = 0;//DEV_PortID
if (t) {
ied->channel[0].port = atoi("102");//DEV_PortID
}
cout << "default port:" << ied->channel[0].port << endl;
}
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
}
cJSON_Delete(json);
//list循环结束
if (MULTIPLE_NODE_FLAG) {
QString updateFrontSql;//待组装的pgsql语句
updateFrontSql.append(QString("update \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("set \"mp_num\"= %1 ").arg(count_real));
updateFrontSql.append(QString("where \"front_ip\" = '%1' and \"front_inst\"=%2").arg(FRONT_IP).arg(FRONT_INST));
OTLConnect();
int rt = write_to_db(updateFrontSql.toStdString().c_str());
OTLDisconnect();
}
if (count_real < count_cfg)
g_node->n_clients = count_real;
if (count_cfg != count_real)
return APR_EBADF;
cout << "dev init create count:" << count_real;
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//CZY 2023-09-15 pg device
int parse_device_cfg_pg()
{
qDebug() << "parse_device_cfg_pg" << endl;
if (FRONT_INST == 0 || FRONT_IP[0] == '\0') {
MULTIPLE_NODE_FLAG = 0;
cout << "set MULTIPLE_NODE_FLAG:0,because do not have FRONT_INST or FRONT_IP" << endl;
}
char front_type[2];
int mp_num;
if (MULTIPLE_NODE_FLAG) {
QString selectFrontSql;
selectFrontSql.append(QString("select \"front_type\",\"mp_num\" from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where \"front_ip\" = '0.0.0.0' and \"front_inst\"=0"));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
OTLConnect();
otl_stream i2(1, // buffer size
selectFrontSql.toStdString().c_str(),
//SELECT statement
db //connect object
);
//create select stream
while (!i2.eof()) { //while not end-of-data
i2 >> front_type >> mp_num;
break;
//cout << "count=" << f2 << endl;
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
QString addFrontSql;
addFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
addFrontSql.append(QString("values('%1',10000,%2,'%3','01','%4',200) ").arg(FRONT_IP).arg(FRONT_INST).arg(front_type).arg(PROGRAM_VERSION));
addFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
addFrontSql.append(QString("\"front_type\"= '%1',\"front_version\"='%2'").arg(front_type).arg(PROGRAM_VERSION));
cout << addFrontSql.toStdString().c_str() << endl;
OTLConnect();
int rt = write_to_db(addFrontSql.toStdString().c_str());
OTLDisconnect();
}
cout << "mp_num:" << mp_num << " FRONT_INST:" << FRONT_INST << endl;
ied_t* ied;
ied_usr_t* ied_usr;
chnl_usr_t* chnl_usr;
int count_cfg = 0;
int count_real = 0;
QMap<QString, terminal_ext*> terminal_ext_map;
read_terminal_ext_pg(&terminal_ext_map);
//读取数据
try {
OTLConnect();
//int rtState = OTLState();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("meas_pq_dev_tr");
str1.append("\" where tmnl_status='20';");
cout << "pg sql1 is:" << str1 << endl;
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
int f2;
while (!i.eof()) { //while not end-of-data
i >> f2;
//cout << "count=" << f2 << endl;
}
OTLDisconnect();
count_cfg = f2;;//读数据库
cout << "dev_count=" << count_cfg << endl;
}
catch (otl_exception& e)
{
printf("\ndev PostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
std::string strSchame = POSTGRES_SCHEMA;//schame analy
std::string strDevSQL = "select \"terminal_id\",\"terminal_code\",\"org_name\",\"maint_name\",\"station_name\",\"tmnl_ip\",\"tmnl_port\",\"tmnl_factory\",\"tmnl_type\",\"tmnl_status\",\"update_time\" from \"";
strDevSQL.append(strSchame);
strDevSQL.append("\".\"");
strDevSQL.append(POSTGRES_TABLEPREFIX);
strDevSQL.append("meas_pq_dev_tr");
strDevSQL.append("\" where tmnl_status='20'");
if (MULTIPLE_NODE_FLAG && g_front_seg_num == 0) {
strDevSQL.append(" ORDER BY terminal_id OFFSET ");
strDevSQL.append(QString::number((FRONT_INST - 1) * mp_num).toStdString());
strDevSQL.append(" LIMIT ");
strDevSQL.append(QString::number(mp_num).toStdString());
if (mp_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * mp_num;
}
else
{
count_cfg = mp_num;
}
}
else if (MULTIPLE_NODE_FLAG && g_front_seg_num != 0) {
int front_num = (count_cfg / g_front_seg_num) + 1;
strDevSQL.append(" ORDER BY terminal_code OFFSET ");
strDevSQL.append(QString::number((FRONT_INST - 1) * front_num).toStdString());
strDevSQL.append(" LIMIT ");
strDevSQL.append(QString::number(front_num).toStdString());
if (front_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * front_num;
}
else
{
count_cfg = front_num;
}
}
cout << strDevSQL << endl;
g_node->n_clients = count_cfg;
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
//读数据
try {
cout << "read dev information." << endl;
OTLConnect();
//cout << "pg sql2 is:" << str1 << endl;
//int rtState = OTLState();
// 执行长的select语句
otl_stream i(1, // buffer size
strDevSQL.c_str(),
//SELECT statement
db //connect object
);
//create select stream
char terminal_id[64];
char terminal_code[64];
char org_name[64];
char maint_name[64];
char station_name[64];
char tmnl_factory[64];
char tmnl_status[64];
char dev_type[64];
char dev_key[64];
char dev_series[64];
char addr_str[64];
char port_char[64];
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> terminal_id >> terminal_code >> org_name >> maint_name >> station_name >> addr_str >> port_char >> tmnl_factory >> dev_type >> tmnl_status >> timestamp;
//cout << "monitor_id=" << monitor_id << " terminal_code=" << terminal_code << " monitor_name=" << monitor_name << " logical_device_seq=" << logical_device_seq;
//cout << " voltage_level=" << voltage_level << " terminal_connect=" << terminal_connect;
//cout << " timestamp: " << timestamp.year << "-" << timestamp.month << "-" << timestamp.day << " " << timestamp.hour << ":" << timestamp.minute << ":" << timestamp.second << endl;
ied = g_node->clients[count_real++];
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, MAX_CPUNO * sizeof(LD_info_t));
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
ied->cpucount = 0;
if (strlen(terminal_id) != 0) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", terminal_id);//terminal_id
cout << "ied_usr->terminal_id:" << ied_usr->terminal_id << endl;
}
if (terminal_code != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", terminal_code);//terminal_code
cout << "ied_usr->terminal_code:" << ied_usr->terminal_code << endl;
}
if (org_name != NULL) {
apr_snprintf(ied_usr->org_name, sizeof(ied_usr->org_name), "%s", org_name);//org_name
cout << "ied_usr->org_name:" << ied_usr->org_name << endl;
}
if (maint_name != NULL) {
apr_snprintf(ied_usr->maint_name, sizeof(ied_usr->maint_name), "%s", maint_name);//maint_name
cout << "ied_usr->maint_name:" << ied_usr->maint_name << endl;
}
if (station_name != NULL) {
apr_snprintf(ied_usr->station_name, sizeof(ied_usr->station_name), "%s", station_name);//station_name
cout << "ied_usr->station_name:" << ied_usr->station_name << endl;
}
if (tmnl_factory != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", tmnl_factory);//tmnl_factory
cout << "ied_usr->tmnl_factory:" << ied_usr->tmnl_factory << endl;
}
if (tmnl_status != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", tmnl_status);//tmnl_status
cout << "ied_usr->tmnl_status:" << ied_usr->tmnl_status << endl;
}
if (dev_type != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", dev_type);//dev_type
cout << "ied_usr->dev_type:" << ied_usr->dev_type << endl;
}
cout << "code" << ied_usr->terminal_code << endl;
if (terminal_ext_map.contains(QString::fromUtf8(ied_usr->terminal_code))) {
//terminal_ext* ext = terminal_ext_map.value(ied_usr->terminal_code);
terminal_ext* ext = terminal_ext_map.value(QString::fromUtf8(ied_usr->terminal_code));
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ext->terminal_key);//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ext->terminal_identify_code);//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else
{
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;//channel
ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
if (addr_str != NULL) {
ied->channel[0].addr = ntohl(inet_addr(addr_str));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
else
{
ied->channel[0].addr = ntohl(inet_addr("0.0.0.0"));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
if (port_char != NULL) {
int port = 102;
if (stringToInt(port_char, &port)) {
// 转换成功portStr全为数字并且已经转换为int类型的port
ied->channel[0].port = port;//DEV_PortID
cout << "ied_usr->port:" << ied->channel[0].port << endl;//DEV_PortID
}
else {
ied->channel[0].port = 102;//DEV_PortID
cout << "ied_usr->port:" << port_char << ",非合法端口.使用默认端口:" << ied->channel[0].port << endl;//DEV_PortID
}
}
if (timestamp.year != 0) {
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
ied_usr->time = static_cast<long long>(time);
cout << "ied_usr->time:" << ied_usr->time << endl;
}
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
}
OTLDisconnect();
//list循环结束
if (count_real < count_cfg)
g_node->n_clients = count_real;
if (count_cfg != count_real)
return APR_EBADF;
cout << "dev init create count:" << count_real;
return APR_SUCCESS;
}
catch (otl_exception& e)
{
printf("\ndev PostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
}
//CZY 2023-08-30 read line account from web api
int parse_line_cfg_pg()
{
ied_t* ied;
ied_usr_t* ied_usr;
int count_cfg = 0;
int count_real = 0;
LD_info_t line_info;
try {
//int rtState = OTLState();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor");
str1.append("\" where status<>'04' and status<>'05' and \"terminal_code\" in (");
//str1.append("\".\"MEAS_PQ_FRONT_LIST_TR\"");
int dev_no = 0;
cout << "n_clients:" << g_node->n_clients << endl;
if (g_node->n_clients <= 0) {
cout << "no terminal exist " << endl;
return APR_EBADF;
}
for (dev_no = 0; dev_no < g_node->n_clients; dev_no++) {
str1.append("'");
str1.append(((ied_usr_t*)(g_node->clients[dev_no]->usr_ext))->terminal_code);
str1.append("'");
if (dev_no < g_node->n_clients - 1) {
str1 += ",";
}
}
str1.append(")");
cout << "pg sql1 is:" << str1 << endl;
//int rtState = OTLState();
OTLConnect();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
int f2;
while (!i.eof()) { //while not end-of-data
i >> f2;
//cout << "count=" << f2 << endl;
}
OTLDisconnect();
count_cfg = f2;;//读数据库
cout << "line_count=" << count_cfg << endl;
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
//读数据
try {
OTLConnect();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select \"monitor_id\",\"terminal_code\",\"monitor_name\",\"logical_device_seq\",\"voltage_level\",\"terminal_connect\",\"update_time\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor");
str1.append("\" where status<>'04' and status<>'05' and \"terminal_code\" in (");
int dev_no = 0;
for (dev_no = 0; dev_no < g_node->n_clients; dev_no++) {
str1.append("'");
str1.append(((ied_usr_t*)(g_node->clients[dev_no]->usr_ext))->terminal_code);
str1.append("'");
if (dev_no < g_node->n_clients - 1) {
str1 += ",";
}
}
str1.append(")");
cout << "pg sql2 is:" << str1 << endl;
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
char monitor_id[64];
char terminal_code[64];
char monitor_name[64];
char logical_device_seq[64];
char voltage_level[64];
char terminal_connect[64];
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> monitor_id >> terminal_code >> monitor_name >> logical_device_seq >> voltage_level >> terminal_connect >> timestamp;
cout << "monitor_id=" << monitor_id << " terminal_code=" << terminal_code << " monitor_name=" << monitor_name << " logical_device_seq=" << logical_device_seq;
cout << " voltage_level=" << voltage_level << " terminal_connect=" << terminal_connect;
cout << " timestamp: " << timestamp.year << "-" << timestamp.month << "-" << timestamp.day << " " << timestamp.hour << ":" << timestamp.minute << ":" << timestamp.second << endl;
count_real++;
memset(&line_info, 0, sizeof(line_info));
line_info.line_id = count_real;
//cout << "line_id:" << line_info.line_id << endl;
strcpy(line_info.mp_id, monitor_id);
//cout << "mp_id:" << line_info.mp_id << endl;
strcpy(line_info.terminal_code, terminal_code);
//cout << "terminal_code:" << line_info.terminal_code << endl;
if (isCharPtrEmpty(logical_device_seq)) {
line_info.cpuno = 1;
//cout << "logical_device_seq:is null~"<< line_info.cpuno << endl;
}
else {
line_info.cpuno = std::atoi(logical_device_seq);
//cout << "logical_device_seq:"<< logical_device_seq << endl;
}
//cout << "cpuno:" << line_info.cpuno << endl;
strcpy(line_info.voltage_level, voltage_level);
//cout << "voltage_level:" << line_info.voltage_level << endl;
strcpy(line_info.v_wiring_type, terminal_connect);
//cout << "v_wiring_type:" << line_info.v_wiring_type << endl;
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
line_info.time = static_cast<long long>(time);
//cout << "time:" << line_info.time << endl;
strcpy(line_info.name, monitor_name);
//cout << "name:" << line_info.name << endl;
line_info.read_flag = 1;
ied = find_ied_from_dev_code(line_info.terminal_code);
if (ied && ied->usr_ext && line_info.cpuno && line_info.cpuno < 10) {
char str[256];
byte_t cpuno = line_info.cpuno;
//cout << "cpuno:" << line_info.cpuno << endl;
//cout << "byte_t cpuno:" << cpuno-1 << endl;
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->LD_info[cpuno - 1] = line_info;
ied_usr->LD_info[cpuno - 1].ied = ied;
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].rptcount = 0;
//cout << "rptcount:" << ied_usr->LD_info[cpuno - 1].rptcount << endl;
if (cpuno > ied->cpucount) {
//int c = cpuno;
//cout << "cpucount(linecount old):" << (int)(ied->cpucount) << "new:" << c << endl;
ied->cpucount = cpuno;
//cout << "byte_t cpucount:" << ied->cpucount+1 << endl;
}
}
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
if (count_cfg != count_real)
return APR_EBADF;
return APR_SUCCESS;
}
int parse_device_cfg_json_test()
{
qDebug() << "parse_device_cfg_json_test" << endl;
ied_t* ied;
ied_usr_t* ied_usr;
chnl_usr_t* chnl_usr;
int count_cfg = 0;
int count_real = 0;
//读取数据
//string* json_buf;
cJSON* json = NULL;
cJSON* json_value = NULL;
cJSON* json_records = NULL;
cJSON* json_node = NULL;
int dev_num = 0;
QMap<QString, terminal_ext*> terminal_ext_map;
read_terminal_ext_pg(&terminal_ext_map);
try {
//GetWebApiJson(1);
/* if (strDevCJson == "") {
cout << "json select total error" << endl;
return APR_EBADF;
}*/
char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"testcode\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}}],\"searchCount\":true,\"size\":1,\"total\":391}},\"status\":\"000000\"}";
//char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"testcode\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}},{\"assets\":[],\"distribution\":1,\"id\":\"af8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"16M00002128569231\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"af8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"100.232.245.97\"}}],\"searchCount\":true,\"size\":2,\"total\":391}},\"status\":\"000000\"}";
json = cJSON_Parse(json_buf);
//json = cJSON_Parse(strDevCJson.toUtf8().constData()); //json格式序列化
//cout << cJSON_Print(json) << endl;
int total;
if (NULL == json)
{
printf("cJSON_Parse error:%s\n", cJSON_GetErrorPtr());
return APR_EBADF;
}
json_records = cJSON_GetObjectItem(json, "result"); //获取result
json_records = cJSON_GetObjectItem(json_records, "0751002"); //获取0751002
json_value = cJSON_GetObjectItem(json_records, "total"); //获取 total
if (json_value != NULL && json_value != NULL) {
total = json_value->valueint;
}
cout << "dev total:" << total << endl;
cJSON_Delete(json);
//GetWebApiJson(1);
/*if (strDevCJson == "") {
cout << "select dev json error" << endl;
return APR_EBADF;
}*/
//json = cJSON_Parse(strDevCJson.toUtf8().constData()); //json格式序列化
json = cJSON_Parse(json_buf);
json_records = cJSON_GetObjectItem(json, "result"); //获取result
json_records = cJSON_GetObjectItem(json_records, "0751002"); //获取0751002
json_value = cJSON_GetObjectItem(json_records, "size"); //获取 size
if (json_value != NULL && json_value != NULL) {
count_cfg = json_value->valueint;
cout << "count_cfg" << "--" << json_value->valueint << "--" << count_cfg << endl;
}
g_node->n_clients = count_cfg;
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
//多个设备循环
int array_size = 0;
json_records = cJSON_GetObjectItem(json_records, "records"); //获取records
array_size = cJSON_GetArraySize(json_records); //获取数组大小
printf("array_size=%d\n", array_size);
for (int i = 0; i < array_size; i++)
{
json_node = cJSON_GetArrayItem(json_records, i);//array
json_node = cJSON_GetObjectItem(json_node, "resource"); //获取resource
ied = g_node->clients[count_real++];
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, 500 * sizeof(LD_info_t));
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
json_value = cJSON_GetObjectItem(json_node, "astId"); //获取 astId
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", json_value->valuestring);//terminal_id
cout << "terminal_id" << json_value->valuestring << "--" << ied_usr->terminal_id << endl;
}
json_value = cJSON_GetObjectItem(json_node, "equipCode"); //获取 equipCode
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", "testcode");//terminal_code
cout << "terminal_code" << json_value->valuestring << "--" << ied_usr->terminal_code << endl;
}
json_value = cJSON_GetObjectItem(json_node, "city#Name"); //获取 city#Name
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->org_name, sizeof(ied_usr->org_name), "%s", json_value->valuestring);//org_name
cout << "org_name" << json_value->valuestring << "--" << ied_usr->org_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "maintOrg#Name"); //获取 maintOrg#Name
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->maint_name, sizeof(ied_usr->maint_name), "%s", json_value->valuestring);//maint_name
cout << "maint_name" << json_value->valuestring << "--" << ied_usr->maint_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "station#Name"); //获取 station#Name
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->station_name, sizeof(ied_usr->station_name), "%s", json_value->valuestring);//station_name
cout << "station_name" << json_value->valuestring << "--" << ied_usr->station_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "manufacturer#Name"); //获取 manufacturer#Name
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", json_value->valuestring);//tmnl_factory
cout << "tmnl_factory" << json_value->valuestring << "--" << ied_usr->tmnl_factory << endl;
}
json_value = cJSON_GetObjectItem(json_node, "deployState"); //获取 deployState
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", json_value->valuestring);//tmnl_status
cout << "tmnl_status" << json_value->valuestring << "--" << ied_usr->tmnl_status << endl;
}
//json_value = cJSON_GetObjectItem(json_node, "lastUpdateTime"); //获取 lastUpdateTime
json_value = cJSON_GetObjectItem(json_node, "ctime"); //获取 ctime
if (json_value != NULL && json_value != NULL) {
//ied_usr->time = strtoll(json_value->valuestring, NULL, 10);//time
ied_usr->time = charToLongLong(json_value->valuestring);//time
cout << "time" << json_value->valuestring << "--" << ied_usr->time << endl;
}
json_value = cJSON_GetObjectItem(json_node, "model"); //获取 model
if (json_value != NULL && json_value != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", json_value->valuestring);//DEV_Type
cout << "dev_type:" << json_value->valuestring << "--" << ied_usr->dev_type << endl;
}
int t = 1;
if (t) {
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "!qaz@wsx3edc4rfv");//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "Pqs&cn870299");//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else {
cout << "code" << ied_usr->terminal_code << endl;
if (terminal_ext_map.contains(QString::fromUtf8(ied_usr->terminal_code))) {
//terminal_ext* ext = terminal_ext_map.value(ied_usr->terminal_code);
terminal_ext* ext = terminal_ext_map.value(QString::fromUtf8(ied_usr->terminal_code));
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ext->terminal_identify_code);//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ext->terminal_key);//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else
{
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
}
ied_usr->dev_flag = 0;//DEV_DevFlag
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;//channel
cout << "channel_type:" << ied->channel[0].channel_type << endl;
ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
json_value = cJSON_GetObjectItem(json_node, "ipAddress"); //获取 ipAddress
if (json_value != NULL && json_value != NULL) {
if (i == 0) {
ied->channel[0].addr = ntohl(inet_addr("192.168.1.212"));//DEV_IP
strncpy(ied->channel[0].addr_str, "192.168.1.212", LONGNAME - 1);//DEV_IP
}
else {
ied->channel[0].addr = ntohl(inet_addr(json_value->valuestring));//DEV_IP
strncpy(ied->channel[0].addr_str, json_value->valuestring, LONGNAME - 1);//DEV_IP
}
cout << "addr:" << json_value->valuestring << "--" << ied->channel[0].addr << "--" << ied->channel[0].addr_str << endl;
}
json_value = cJSON_GetObjectItem(json_node, "portNum"); //获取 portNum
if (json_value != NULL && json_value != NULL) {
//ied->channel[0].port = atoi(json_value->valuestring);//DEV_PortID
ied->channel[0].port = atoi("102");//DEV_PortID
cout << "port:" << "--" << atoi(json_value->valuestring) << "--" << ied->channel[0].port << endl;
}
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
}
cJSON_Delete(json);
//list循环结束
if (count_real < count_cfg)
g_node->n_clients = count_real;
if (count_cfg != count_real)
return APR_EBADF;
cout << "dev init create count:" << count_real;
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
int parse_line_cfg_pg_test()
{
ied_t* ied;
ied_usr_t* ied_usr;
int count_cfg = 0;
int count_real = 0;
LD_info_t line_info;
try {
OTLConnect();
//int rtState = OTLState();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor\"");
cout << "pg sq1 is:" << str1 << endl;
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
db //connect object
);
//create select stream
int f2;
while (!i.eof()) { //while not end-of-data
i >> f2;
//cout << "count=" << f2 << endl;
}
OTLDisconnect();
count_cfg = f2;;//读数据库
cout << "line_count=" << count_cfg << endl;
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
//读数据
try {
OTLConnect();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select \"monitor_id\",\"terminal_code\",\"monitor_name\",\"logical_device_seq\",\"voltage_level\",\"terminal_connect\",\"update_time\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor\"");
//cout << "pg sql2 is:" << str1 << endl;
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
char monitor_id[64];
char terminal_code[64];
char monitor_name[64];
char logical_device_seq[64];
char voltage_level[64];
char terminal_connect[64];
otl_datetime timestamp;
int cpuno_count = 1;
while (!i.eof()) { //while not end-of-data
i >> monitor_id >> terminal_code >> monitor_name >> logical_device_seq >> voltage_level >> terminal_connect >> timestamp;
//cout << "monitor_id=" << monitor_id << " terminal_code=" << terminal_code << " monitor_name=" << monitor_name << " logical_device_seq=" << logical_device_seq;
//cout << " voltage_level=" << voltage_level << " terminal_connect=" << terminal_connect;
//cout << " timestamp: " << timestamp.year << "-" << timestamp.month << "-" << timestamp.day << " " << timestamp.hour << ":" << timestamp.minute << ":" << timestamp.second << endl;
count_real++;
memset(&line_info, 0, sizeof(line_info));
line_info.line_id = count_real;
//cout << "line_id:" << line_info.line_id << endl;
strcpy(line_info.mp_id, monitor_id);
//cout << "mp_id:" << line_info.mp_id << endl;
strcpy(line_info.terminal_code, "testcode");
//cout << "terminal_code:" << line_info.terminal_code << endl;
if (isCharPtrEmpty(logical_device_seq)) {
line_info.cpuno = 1;
//cout << "logical_device_seq:is null~"<< line_info.cpuno << endl;
}
else {
line_info.cpuno = std::atoi(logical_device_seq);
//cout << "logical_device_seq:"<< logical_device_seq << endl;
}
//cout << "cpuno:" << line_info.cpuno << endl;
strcpy(line_info.voltage_level, voltage_level);
//cout << "voltage_level:" << line_info.voltage_level << endl;
strcpy(line_info.v_wiring_type, terminal_connect);
//cout << "v_wiring_type:" << line_info.v_wiring_type << endl;
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
line_info.time = static_cast<long long>(time);
//cout << "time:" << line_info.time << endl;
strcpy(line_info.name, monitor_name);
//cout << "name:" << line_info.name << endl;
ied = find_ied_from_dev_code("testcode");
if (ied && ied->usr_ext && line_info.cpuno) {
char str[256];
byte_t cpuno = cpuno_count;
//cout << "cpuno:" << line_info.cpuno << endl;
//cout << "byte_t cpuno:" << cpuno-1 << endl;
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->LD_info[cpuno - 1] = line_info;
ied_usr->LD_info[cpuno - 1].ied = ied;
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].rptcount = 0;
//cout << "rptcount:" << ied_usr->LD_info[cpuno - 1].rptcount << endl;
if (cpuno > ied->cpucount) {
int c = cpuno;
ied->cpucount = cpuno;
cout << "byte_t cpucount:" << ied->cpucount + 1 << endl;
}
}
cpuno_count++;
if (cpuno_count > 150) {
break;
}
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
if (count_cfg != count_real)
return APR_EBADF;
return APR_SUCCESS;
}
void dev_account_add() {
}
void dev_account_delete() {
}
void dev_account_update() {
}
void line_account_add() {
}
void line_account_delete(int update_flag) {
}
void line_account_update(int update_flag) {
}
int create_temp_device_cfg_json(QMap<QString, ied_t*>& dev_map)
{
qDebug() << "parse_device_cfg_json" << endl;
if (FRONT_INST == 0 || FRONT_IP[0] == '\0') {
MULTIPLE_NODE_FLAG = 0;
cout << "set MULTIPLE_NODE_FLAG:0,because do not have FRONT_INST or FRONT_IP" << endl;
}
char front_type[2];
int mp_num;
if (MULTIPLE_NODE_FLAG) {
//std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(POSTGRES_SCHEMA);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("meas_pq_front_list_tr");
str1.append("\" where \"front_ip\" = '");
str1.append(FRONT_IP);
str1.append("' and \"front_inst\" = ");
std::string str3 = QString::number(FRONT_INST).toStdString();
str1.append(str3);
str1.append(";");
try {
OTLConnect();
otl_stream i1(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
int front_count;
while (!i1.eof()) { //while not end-of-data
i1 >> front_count;
//cout << "count=" << f2 << endl;
}
cout << "count=" << front_count << endl;
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
QString selectFrontSql;
selectFrontSql.append(QString("select \"front_type\",\"mp_num\" from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where \"front_ip\" = '0.0.0.0' and \"front_inst\"=0"));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
OTLConnect();
otl_stream i2(1, // buffer size
selectFrontSql.toStdString().c_str(),
//SELECT statement
db //connect object
);
//create select stream
while (!i2.eof()) { //while not end-of-data
i2 >> front_type >> mp_num;
break;
//cout << "count=" << f2 << endl;
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
}
cout << "mp_num:" << mp_num << " FRONT_INST:" << FRONT_INST << endl;
ied_t* ied;
ied_usr_t* ied_usr;
chnl_usr_t* chnl_usr;
int count_cfg = 0;
int count_real = 0;
//读取数据
//string* json_buf;
cJSON* json = NULL;
cJSON* json_value = NULL;
cJSON* json_records = NULL;
cJSON* json_node = NULL;
int dev_num = 0;
QMap<QString, terminal_ext*> terminal_ext_map;
read_terminal_ext_pg(&terminal_ext_map);
try {
int total;
GetWebApiJson(1, 1, CITY_FLAG);
if (strDevCJson == "") {
cout << "json select total error" << endl;
return APR_EBADF;
}
//char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"16M00000128569231\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}}],\"searchCount\":true,\"size\":1,\"total\":391}},\"status\":\"000000\"}";
/* char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"16M00000128569231\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}},{\"assets\":[],\"distribution\":1,\"id\":\"af8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"PQS-883\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.232.245.101\",\"equipCode\":\"16M00002128569231\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"af8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"100.232.245.97\"}}],\"searchCount\":true,\"size\":2,\"total\":391}},\"status\":\"000000\"}";
json = cJSON_Parse(json_buf);*/
//char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"E8300\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.161.208.227\",\"equipCode\":\"22M00000299758903\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"20102\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}},{\"assets\":[],\"distribution\":1,\"id\":\"af8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"signalInputForm\":\"02\",\"source#Name\":\"设备增加-基本建设\",\"source\":\"01\",\"currsigInputChanqutity\":\"1\",\"astOrg#Name\":\"国网湖南省电力公司\",\"astOrg\":\"02DC9D994CE579E4E053661EDF0AFC25\",\"cabinetType\":\"05\",\"ctime\":\"2022-02-19 00:00:00\",\"model\":\"E8300\",\"station#Name\":\"110kV宝塔变电站\",\"equipmentOwner\":\"E94A0732B2FB5AA1E0430901E80A21E9\",\"manufactureNum\":\"202596\",\"ipAddress\":\"10.161.208.237\",\"equipCode\":\"22M00000299800679\",\"subnetMask\":\"255.255.255.224\",\"astId\":\"af8080817efe6c21017f1064ab7c0c7e\",\"macAddress\":\"00B78D00DC23\",\"astNum\":\"200102118916\",\"signalInputForm#Name\":\"数字信号\",\"maintOrg#Name\":\"张家界供电公司检修公司\",\"name\":\"110kV 珍宝线504电能质量监测装置\",\"deviceLevel\":\"01\",\"projectNum\":\"GGXM20220219BT\",\"projectName\":\"电能质量监测装置\",\"operateDate\":\"2021-11-19 00:00:00\",\"deployState\":\"20\",\"hardDiskCapacity\":\"64\",\"city\":\"02DC9D994EED79E4E053661EDF0AFC25\",\"timeSynchronization\":\"02\",\"astNature\":\"03\",\"manufacturer\":\"041696\",\"astOrgName\":\"国网湖南省电力公司\",\"voltsigInputChanqutity\":\"1\",\"cabinetType#Name\":\"紧凑型金属封闭式\",\"runDevName\":\"504\",\"devPowerVoltage\":\"220\",\"station\":\"531b04dd7c8a5f84214ff783280150531a67987189\",\"manufactureDate\":\"2020-12-19 00:00:00\",\"astNature#Name\":\"省(直辖市、自治区)公司\",\"portNum\":\"10022\",\"maintGroup#Name\":\"变电运维二班\",\"maintGroup\":\"02DC9D994F3A79E4E053661EDF0AFC25\",\"manufacturer#Name\":\"南京灿能电力自动化股份有限公司\",\"detectDate\":\"2021-02-19 00:00:00\",\"city#Name\":\"国网张家界供电公司\",\"deployState#Name\":\"在运\",\"equipmentOwner#Name\":\"\",\"deviceLevel#Name\":\"A类\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"100.232.245.97\"}}],\"searchCount\":true,\"size\":2,\"total\":391}},\"status\":\"000000\"}";
//json = cJSON_Parse(json_buf);
//char json_buf[] = "{\"errors\":\"成功\",\"message\":\"成功\",\"result\":{\"0751002\":{\"current\":1,\"orders\":[],\"pages\":391,\"records\":[{\"assets\":[],\"distribution\":1,\"id\":\"ff8080817efe6c21017f1064ab7c0c7e\",\"modelId\":\"0751002Z\",\"resource\":{\"deviceKind\":\"0751002\",\"maintOrg\":\"02DC9D994F2879E4E053661EDF0AFC25\",\"cabinet\":\"4dcc03dbc58a5f84225130303b01514dcba0cd1be5\",\"gateway\":\"10.232.245.97\"}}],\"searchCount\":true,\"size\":1,\"total\":391}},\"status\":\"000000\"}";
json = cJSON_Parse(strDevCJson.toUtf8().constData()); //json格式序列化
//cout << cJSON_Print(json) << endl;
if (NULL == json)
{
printf("cJSON_Parse error:%s\n", cJSON_GetErrorPtr());
return APR_EBADF;
}
json_records = cJSON_GetObjectItem(json, "result"); //获取result
json_records = cJSON_GetObjectItem(json_records, "0751002"); //获取0751002
json_value = cJSON_GetObjectItem(json_records, "total"); //获取 total
if (json_value != NULL) {
total = json_value->valueint;
}
cJSON_Delete(json);
if (MULTIPLE_NODE_FLAG && g_front_seg_num == 0) {
if (strcmp(front_type, "01") == 0) {
GetWebApiJson(mp_num, FRONT_INST, CITY_FLAG);
}
else
{
GetWebApiJson(mp_num, FRONT_INST, CITY_FLAG);
}
}
else if (MULTIPLE_NODE_FLAG && g_front_seg_num != 0) {
int front_num = (total / g_front_seg_num) + 1;
GetWebApiJson(front_num, FRONT_INST, CITY_FLAG);
}
else {
/* cout << "dev total:" << total << endl;
if (total > 300) {
total = 300;
cout << "update dev total:" << total << endl;
}*/
GetWebApiJson(total, 1, CITY_FLAG);
}
if (strDevCJson == "") {
cout << "select dev json error" << endl;
return APR_EBADF;
}
json = cJSON_Parse(strDevCJson.toUtf8().constData()); //json格式序列化
//json = cJSON_Parse(json_buf);
json_records = cJSON_GetObjectItem(json, "result"); //获取result
json_records = cJSON_GetObjectItem(json_records, "0751002"); //获取0751002
json_value = cJSON_GetObjectItem(json_records, "size"); //获取 size
//多个设备循环
int array_size = 0;
json_records = cJSON_GetObjectItem(json_records, "records"); //获取records
array_size = cJSON_GetArraySize(json_records); //获取数组大小
/*count_cfg = array_size;
cout << "count_cfg" << "--" << count_cfg << endl;
g_node->n_clients = count_cfg;
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));*/
printf("array_size=%d\n", array_size);
for (int i = 0; i < array_size; i++)
{
json_node = cJSON_GetArrayItem(json_records, i);//array
json_node = cJSON_GetObjectItem(json_node, "resource"); //获取resource
ied = (ied_t*)apr_pcalloc(g_temp_dev_pool, sizeof(ied_t));
count_real++;
ied_usr = (ied_usr_t*)apr_pcalloc(g_temp_dev_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_temp_dev_pool, MAX_CPUNO * sizeof(LD_info_t));
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_temp_dev_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
json_value = cJSON_GetObjectItem(json_node, "astId"); //获取 astId
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", json_value->valuestring);//terminal_id
cout << "terminal_id:" << json_value->valuestring << "--" << ied_usr->terminal_id << endl;
}
else {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", "");//terminal_id
cout << "default terminal_id:" << ied_usr->terminal_id << endl;
}
json_value = cJSON_GetObjectItem(json_node, "equipCode"); //获取 equipCode
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", json_value->valuestring);//terminal_code
cout << "terminal_code:" << json_value->valuestring << "--" << ied_usr->terminal_code << endl;
}
else {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", "");//terminal_code
cout << "default terminal_code:" << ied_usr->terminal_code << endl;
}
json_value = cJSON_GetObjectItem(json_node, "city#Name"); //获取 city#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->org_name, sizeof(ied_usr->org_name), "%s", json_value->valuestring);//org_name
cout << "org_name:" << json_value->valuestring << "--" << ied_usr->org_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "maintOrg#Name"); //获取 maintOrg#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->maint_name, sizeof(ied_usr->maint_name), "%s", json_value->valuestring);//maint_name
cout << "maint_name:" << json_value->valuestring << "--" << ied_usr->maint_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "station#Name"); //获取 station#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->station_name, sizeof(ied_usr->station_name), "%s", json_value->valuestring);//station_name
cout << "station_name:" << json_value->valuestring << "--" << ied_usr->station_name << endl;
}
json_value = cJSON_GetObjectItem(json_node, "manufacturer#Name"); //获取 manufacturer#Name
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", json_value->valuestring);//tmnl_factory
cout << "tmnl_factory:" << json_value->valuestring << "--" << ied_usr->tmnl_factory << endl;
}
json_value = cJSON_GetObjectItem(json_node, "deployState"); //获取 deployState
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", json_value->valuestring);//tmnl_status
cout << "tmnl_status:" << json_value->valuestring << "--" << ied_usr->tmnl_status << endl;
}
else {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", "10");//tmnl_status
cout << "default tmnl_status:" << ied_usr->tmnl_status << endl;
}
//json_value = cJSON_GetObjectItem(json_node, "lastUpdateTime"); //获取 lastUpdateTime
json_value = cJSON_GetObjectItem(json_node, "ctime"); //获取 ctime
if (json_value != NULL && json_value->string != NULL) {
//ied_usr->time = strtoll(json_value->valuestring, NULL, 10);//time
ied_usr->time = charToLongLong(json_value->valuestring);//time
cout << "time:" << ied_usr->time << endl;
}
json_value = cJSON_GetObjectItem(json_node, "model"); //获取 model
if (json_value != NULL && json_value->string != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", json_value->valuestring);//DEV_Type
cout << "dev_type:" << json_value->valuestring << "--" << ied_usr->dev_type << endl;
}
else {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", "no-type");//DEV_Type
cout << "default dev_type:" << ied_usr->dev_type << endl;
}
int t = 1;
if (t) {
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "!qaz@wsx3edc4rfv");//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "Pqs&cn870299");//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else {
cout << "code:" << ied_usr->terminal_code << endl;
if (terminal_ext_map.contains(QString::fromUtf8(ied_usr->terminal_code))) {
//terminal_ext* ext = terminal_ext_map.value(ied_usr->terminal_code);
terminal_ext* ext = terminal_ext_map.value(QString::fromUtf8(ied_usr->terminal_code));
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ext->terminal_key);//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ext->terminal_identify_code);//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else
{
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
}
ied_usr->dev_flag = 0;//DEV_DevFlag
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;//channel
cout << "channel_type:" << ied->channel[0].channel_type << endl;
ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
json_value = cJSON_GetObjectItem(json_node, "ipAddress"); //获取 ipAddress
if (json_value != NULL && json_value->string != NULL) {
if (t && i == 0) {
ied->channel[0].addr = ntohl(inet_addr("172.40.251.35"));//DEV_IP
strncpy(ied->channel[0].addr_str, "172.40.251.35", LONGNAME - 1);//DEV_IP
}
else {
ied->channel[0].addr = ntohl(inet_addr(json_value->valuestring));//DEV_IP
strncpy(ied->channel[0].addr_str, json_value->valuestring, LONGNAME - 1);//DEV_IP
}
cout << "addr:" << json_value->valuestring << "--" << ied->channel[0].addr << "--" << ied->channel[0].addr_str << endl;
}
else {
ied->channel[0].addr = ntohl(inet_addr("0.0.0.1"));//DEV_IP
strncpy(ied->channel[0].addr_str, "0.0.0.1", LONGNAME - 1);//DEV_IP
//}
cout << "default addr:" << ied->channel[0].addr_str << endl;
}
json_value = cJSON_GetObjectItem(json_node, "portNum"); //获取 portNum
if (json_value != NULL && json_value->string != NULL) {
ied->channel[0].port = atoi(json_value->valuestring);//DEV_PortID
if (t) {
ied->channel[0].port = atoi("102");//DEV_PortID
}
cout << "port:" << "--" << atoi(json_value->valuestring) << "--" << ied->channel[0].port << endl;
}
else {
ied->channel[0].port = 0;//DEV_PortID
if (t) {
ied->channel[0].port = atoi("102");//DEV_PortID
}
cout << "default port:" << ied->channel[0].port << endl;
}
dev_map.insert(QString::fromUtf8(ied_usr->terminal_code), ied);
}
cJSON_Delete(json);
//list循环结束
cout << "temp dev qmap init create count:" << count_real;
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
int create_temp_line_cfg_pg(QMap<QString, ied_t*>& dev_map)
{
ied_t* ied;
ied_usr_t* ied_usr;
int count_cfg = 0;
int count_real = 0;
LD_info_t line_info;
try {
//int rtState = OTLState();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor");
str1.append("\" where \"terminal_code\" in (");
//str1.append("\".\"MEAS_PQ_FRONT_LIST_TR\"");
QMap<QString, ied_t*>::const_iterator cit;
for (cit = dev_map.constBegin(); cit != dev_map.constEnd();) {
QString key = cit.key();
str1.append("'");
str1.append(key.toStdString());
str1.append("'");
if (++cit != dev_map.constEnd()) {
str1 += ",";
}
}
str1.append(")");
cout << "dev line pg sql1 is:" << str1 << endl;
//int rtState = OTLState();
OTLConnect();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
int f2;
while (!i.eof()) { //while not end-of-data
i >> f2;
//cout << "count=" << f2 << endl;
}
OTLDisconnect();
count_cfg = f2;;//读数据库
cout << "line_count=" << count_cfg << endl;
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
//读数据
try {
OTLConnect();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select \"monitor_id\",\"terminal_code\",\"monitor_name\",\"logical_device_seq\",\"voltage_level\",\"terminal_connect\",\"update_time\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor");
str1.append("\" where \"terminal_code\" in (");
QMap<QString, ied_t*>::const_iterator cit;
for (cit = dev_map.constBegin(); cit != dev_map.constEnd();) {
QString key = cit.key();
str1.append("'");
str1.append(key.toStdString());
str1.append("'");
if (++cit != dev_map.constEnd()) {
str1 += ",";
}
}
str1.append(")");
cout << "qmap line pg sql2 is:" << str1 << endl;
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
char monitor_id[64];
char terminal_code[64];
char monitor_name[64];
char logical_device_seq[64];
char voltage_level[64];
char terminal_connect[64];
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> monitor_id >> terminal_code >> monitor_name >> logical_device_seq >> voltage_level >> terminal_connect >> timestamp;
//cout << "monitor_id=" << monitor_id << " terminal_code=" << terminal_code << " monitor_name=" << monitor_name << " logical_device_seq=" << logical_device_seq;
//cout << " voltage_level=" << voltage_level << " terminal_connect=" << terminal_connect;
//cout << " timestamp: " << timestamp.year << "-" << timestamp.month << "-" << timestamp.day << " " << timestamp.hour << ":" << timestamp.minute << ":" << timestamp.second << endl;
count_real++;
memset(&line_info, 0, sizeof(line_info));
line_info.line_id = count_real;
//cout << "line_id:" << line_info.line_id << endl;
strcpy(line_info.mp_id, monitor_id);
//cout << "mp_id:" << line_info.mp_id << endl;
strcpy(line_info.terminal_code, terminal_code);
//cout << "terminal_code:" << line_info.terminal_code << endl;
if (isCharPtrEmpty(logical_device_seq)) {
line_info.cpuno = 1;
//cout << "logical_device_seq:is null~"<< line_info.cpuno << endl;
}
else {
line_info.cpuno = std::atoi(logical_device_seq);
//cout << "logical_device_seq:"<< logical_device_seq << endl;
}
//cout << "cpuno:" << line_info.cpuno << endl;
strcpy(line_info.voltage_level, voltage_level);
//cout << "voltage_level:" << line_info.voltage_level << endl;
strcpy(line_info.v_wiring_type, terminal_connect);
//cout << "v_wiring_type:" << line_info.v_wiring_type << endl;
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
line_info.time = static_cast<long long>(time);
//cout << "time:" << line_info.time << endl;
strcpy(line_info.name, monitor_name);
//cout << "name:" << line_info.name << endl;
ied = dev_map.value(QString::fromUtf8(line_info.terminal_code));
//ied = find_ied_from_dev_code(line_info.terminal_code);
if (ied && ied->usr_ext && line_info.cpuno && line_info.cpuno < 10) {
char str[256];
byte_t cpuno = line_info.cpuno;
//cout << "cpuno:" << line_info.cpuno << endl;
//cout << "byte_t cpuno:" << cpuno-1 << endl;
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->LD_info[cpuno - 1] = line_info;
ied_usr->LD_info[cpuno - 1].ied = ied;
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_temp_dev_pool, str);
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_temp_dev_pool);
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_temp_dev_pool);
ied_usr->LD_info[cpuno - 1].rptcount = 0;
//cout << "rptcount:" << ied_usr->LD_info[cpuno - 1].rptcount << endl;
if (cpuno > ied->cpucount) {
//int c = cpuno;
//cout << "cpucount(linecount old):" << (int)(ied->cpucount) << "new:" << c << endl;
ied->cpucount = cpuno;
//cout << "byte_t cpucount:" << ied->cpucount+1 << endl;
}
}
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
if (count_cfg != count_real)
return APR_EBADF;
return APR_SUCCESS;
}
void g_node_add_dev() {
int count_cfg = g_node->n_clients;
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
}
//CZY 2023-08-25
int compare_line_account(ied_usr_t* run_ied_usr, ied_usr_t* temp_ied_usrs, int run_cpucount, int temp_cpucount) {
int run_cpuno, temp_cpuno;
for (run_cpuno = 0; run_cpuno < run_cpucount; run_cpuno++) {
int delete_flag = 1;
for (temp_cpuno = 0; temp_cpuno < temp_cpucount; temp_cpuno++) {
if (run_ied_usr->LD_info[run_cpuno].mp_id == temp_ied_usrs->LD_info[temp_cpuno].mp_id) {//exist same mp_id(update,keep)
if (run_ied_usr->LD_info[run_cpuno].time < temp_ied_usrs->LD_info[temp_cpuno].time) {//line_update
run_ied_usr->LD_info[run_cpuno].update_flag = 4;
temp_ied_usrs->LD_info[temp_cpuno].update_flag = 4;
}
else {//line_keep
run_ied_usr->LD_info[run_cpuno].update_flag = 0;
temp_ied_usrs->LD_info[temp_cpuno].update_flag = 0;
}
delete_flag = 0;
break;
}
}
if (delete_flag == 1) {//line_delete
run_ied_usr->LD_info[run_cpuno].update_flag = 2;
}
}
for (temp_cpuno = 0; temp_cpuno < temp_cpucount; temp_cpuno++) {
int add_flag = 1;
for (run_cpuno = 0; run_cpuno < run_cpucount; run_cpuno++) {
if (run_ied_usr->LD_info[run_cpuno].mp_id == temp_ied_usrs->LD_info[temp_cpuno].mp_id) {//exist same mp_id
add_flag = 0;
break;
}
}
if (add_flag == 1) {//line_add
temp_ied_usrs->LD_info[temp_cpuno].update_flag = 8;
}
}
return 0;
}
//CZY 2023-08-22 compare account
int compare_node_account(node_t* run_g_node, node_t* temp_g_node, int* add_count)
{
if (run_g_node == NULL) {
return 1;
}
if (temp_g_node == NULL) {
return 2;
}
int i, j;
for (i = 0; i < run_g_node->n_clients; i++) {
ied_usr_t* run_ied_usr = (ied_usr_t*)run_g_node->clients[i]->usr_ext;
run_ied_usr->update_flag = 0;
int delete_flag = 1;
for (j = 0; j < temp_g_node->n_clients; j++) {
ied_usr_t* temp_ied_usr = (ied_usr_t*)temp_g_node->clients[j]->usr_ext;
if (run_ied_usr->terminal_id == temp_ied_usr->terminal_id) {//exist same terminal_id(update,delete,keep)
if (temp_ied_usr->time > run_ied_usr->time)//dev_update or delete
{
if (strcmp(temp_ied_usr->tmnl_status, "20") != 0 && strcmp(run_ied_usr->tmnl_status, "20") == 0) {//dev_delete
temp_ied_usr->update_flag = 2;
run_ied_usr->update_flag = 2;
int cpuno;
for (cpuno = 0; cpuno < run_g_node->clients[i]->cpucount; cpuno++) {//line_delete
run_ied_usr->LD_info[cpuno].update_flag = 2;
}
}
else {//dev_update
run_ied_usr->update_flag = 4;
temp_ied_usr->update_flag = 4;
int cpuno;
//for (cpuno = 0; cpuno < temp_g_node->clients[j]->cpucount; cpuno++) {//line_update
// temp_ied_usr->LD_info[cpuno].update_flag = 8;
//}
int f = compare_line_account(run_ied_usr, temp_ied_usr, run_g_node->clients[i]->cpucount, temp_g_node->clients[j]->cpucount);//line_compare
}
}
else {//dev_keep
int f = compare_line_account(run_ied_usr, temp_ied_usr, run_g_node->clients[i]->cpucount, temp_g_node->clients[j]->cpucount);//line_compare
}
delete_flag = 0;
break;
}
}
if (delete_flag == 1) {//dev_delete
run_ied_usr->update_flag = 2;
}
}
for (i = 0; i < temp_g_node->n_clients; i++) {
ied_usr_t* temp_ied_usr = (ied_usr_t*)temp_g_node->clients[i]->usr_ext;
if (temp_ied_usr->update_flag == 2) {
continue;
}
int add_flag = 1;
for (j = 0; j < run_g_node->n_clients; j++) {
ied_usr_t* run_ied_usr = (ied_usr_t*)run_g_node->clients[j]->usr_ext;
if (temp_ied_usr->terminal_id == run_ied_usr->terminal_id) {
add_flag = 0;
break;
}
}
if (add_flag == 1) {//dev_add
temp_ied_usr->update_flag = 8;
int cpuno;
for (cpuno = 0; cpuno < temp_g_node->clients[i]->cpucount; cpuno++) {//line_add
temp_ied_usr->LD_info[cpuno].update_flag = 8;
*add_count += 1;
}
}
}
return 0;
}
//
void handle_line_account(ied_usr_t* run_ied_usr, ied_usr_t* temp_ied_usrs, int run_cpucount, int temp_cpucount) {
int run_cpuno, temp_cpuno;
for (run_cpuno = 0; run_cpuno < run_cpucount; run_cpuno++) {
if (run_ied_usr->LD_info[run_cpuno].update_flag = 0) {
}
else if (run_ied_usr->LD_info[run_cpuno].update_flag = 2) {
line_account_delete(run_ied_usr->update_flag);
}
else if (run_ied_usr->LD_info[run_cpuno].update_flag = 4) {
line_account_update(run_ied_usr->update_flag);
}
}
for (temp_cpuno = 0; temp_cpuno < temp_cpucount; temp_cpuno++) {
if (temp_ied_usrs->LD_info[run_cpuno].update_flag = 8) {
line_account_add();
}
}
}
// CZY 2023-09-12 handle account
void handle_node_account(node_t* run_g_node, node_t* temp_g_node, int dev_count) {
int i;
for (i = 0; i < run_g_node->n_clients; i++) {
ied_usr_t* run_ied_usr = (ied_usr_t*)run_g_node->clients[i]->usr_ext;
if (run_ied_usr->update_flag == 0) {
}
else if (run_ied_usr->update_flag == 2) {
dev_account_delete();
}
else if (run_ied_usr->update_flag == 4) {
dev_account_update();
}
}
//增加dev的数量
for (i = 0; i < temp_g_node->n_clients; i++) {
ied_usr_t* temp_ied_usr = (ied_usr_t*)temp_g_node->clients[i]->usr_ext;
if (temp_ied_usr->update_flag == 8) {
dev_account_add();
}
}
}
//CZY 2023-08-25
void create_temp_g_node(node_t* temp_g_node) {
/*create_temp_device_cfg_json(temp_g_node);
create_temp_line_cfg_pg(temp_g_node);
int* add_count = 0;
compare_node_account(g_node, temp_g_node, add_count);*/
}
void dev_update() {
QMap<QString, ied_t*> dev_map;
//create_temp_device_cfg_json(dev_map);
}
#endif
int GetServerIndexFromDB() //获取前置服务器序号
{
register int fd, interface;
const int MAXINTERFACES = 100;
struct ifreq buf[MAXINTERFACES];
struct arpreq arp;
struct ifconf ifc;
char mac[32] = "";
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
ifc.ifc_len = sizeof buf;
ifc.ifc_buf = (caddr_t)buf;
if (!ioctl(fd, SIOCGIFCONF, (char*)&ifc)) {
interface = ifc.ifc_len / sizeof(struct ifreq);
printf("\ninterface num is interface= %d\n", interface);
while (interface-- > 0) {
printf("net device %s\n", buf[interface].ifr_name);
/*确保网卡是否支持混杂模式 Jugde whether the net card status is promisc */
if (!(ioctl(fd, SIOCGIFFLAGS, (char*)&buf[interface]))) {
if (buf[interface].ifr_flags & IFF_PROMISC) {
printf("the interface is PROMISC \n");
}
}
else {
char str[256] = "";
sprintf(str, "cpm: ioctl device %s", buf[interface].ifr_name);
perror(str);
}
/*判断网卡状态是否打开 Judge whether the net card status is up */
if (buf[interface].ifr_flags & IFF_UP) {
printf("the interface status is UP\n");
}
else {
printf("the interface status is DOWN\n");
}
/*获取网卡IP地址 Get IP of the net card */
if (!(ioctl(fd, SIOCGIFADDR, (char*)&buf[interface]))) {
printf("IP address is: %s\n", inet_ntoa(((struct sockaddr_in*)(&buf[interface].ifr_addr))->sin_addr));
}
else {
char str[256] = "";
sprintf(str, "cpm: ioctl device %s", buf[interface].ifr_name);
perror(str);
}
/*获取网卡的HW地址 Get HW ADDRESS of the net card */
if (!(ioctl(fd, SIOCGIFHWADDR, (char*)&buf[interface]))) {
printf("HW address is: ");
sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned char)buf[interface].ifr_hwaddr.sa_data[0],
(unsigned char)buf[interface].ifr_hwaddr.sa_data[1],
(unsigned char)buf[interface].ifr_hwaddr.sa_data[2],
(unsigned char)buf[interface].ifr_hwaddr.sa_data[3],
(unsigned char)buf[interface].ifr_hwaddr.sa_data[4],
(unsigned char)buf[interface].ifr_hwaddr.sa_data[5]);
printf("%s\n\n", mac);
}
else {
char str[256];
sprintf(str, "cpm: ioctl device %s", buf[interface].ifr_name);
perror(str);
}
}
}
else
perror("cpm: ioctl");
}
else
perror("cpm: socket");
close(fd);
return 0;
}
/////////////////////////////////////////////////////////CZY
void parse_one_rpt_log_ini(int idx, QStringList* rpt_cfg_strlist, QStringList* log_cfg_strlist, char* type)
{
char* tmp;
tmp = Get_xmlpath(type);
if (tmp == NULL) {
//zw修改 2023 - 8 - 15 将触发报告的解析移至XML 原配置RptLogCfg.ini取消
if (strcmp(subdir, "cfg_stat_data") == 0)
{
QString devtype;
devtype.append(type);
QString devtype2;
devtype2.append("HL-6810");
qDebug() << "cfg_stat_data";
QString xml_dir = QString("../") + QString("etc/"); //Linux下调试路径
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(xml_dir + QString("JiangSu_Config.xml"));
if (!file.open(QIODevice::ReadOnly | QFile::Text)) //以只读方式打开xml
{
qDebug() << "Read RPT Error1";
return;
}
if (!doc.setContent(&file)) //将文件内容读到doc中
{
qDebug() << "Read RPT Error2";
file.close();
return;
}
file.close();
QDomNode firstNode = doc.firstChild(); //根节点"JSConfigTemplate"
QDomElement docElem = doc.documentElement(); //返回根节点元素
QDomNode n = docElem.firstChild(); //获得doc的第一个节点即"Topic"
while (!n.isNull()) //如果Topic节点不为空
{
if (n.isElement())
{
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName(); //
if ("ReportMap" == strTag)//zw修改 2023 - 8 - 15 增加判断 将触发报告的解析移至XML 原配置RptLogCfg.ini取消
{
qDebug() << "ReportStat";
QDomNodeList list = e.childNodes(); //获得元素的所有子节点的列表
for (int i = 0; i < list.count(); i++) //遍历 DataType列表
{
QDomNode node = list.at(i); //node1 <DataType>
if (node.isElement())
{
QString strTag2 = node.toElement().tagName(); //DataType节点
if ("ReportStat" == strTag2)
{
QDomNodeList list2 = node.childNodes(); //获得元素DataType的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) //遍历 Monitor列表
{
QDomNode node2 = list2.at(i2); //node2 <Monitor>
if (node2.isElement())
{
rpt_cfg_strlist->append(node2.toElement().attribute("ReportControl"));
qDebug() << "devtype:" << devtype << node2.toElement().attribute("ReportControl").toAscii().data();
}
}
}
}
}
}
}
n = n.nextSibling();
}
QString log_cfg_str = "LLN0$LG$lcStatisticData,dsStatisticData,PQM1,0,600000,1,0,0,0";
log_cfg_strlist->append(log_cfg_str);
}
if (strcmp(subdir, "cfg_soe_comtrade") == 0)
{
qDebug() << "cfg_soe_comtrade";
QString xml_dir = QString("../") + QString("etc/"); //Linux下调试路径
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(xml_dir + QString("JiangSu_Config.xml"));
if (!file.open(QIODevice::ReadOnly | QFile::Text)) //以只读方式打开xml
{
qDebug() << "Read RPT Error1";
return;
}
if (!doc.setContent(&file)) //将文件内容读到doc中
{
qDebug() << "Read RPT Error2";
file.close();
return;
}
file.close();
QDomNode firstNode = doc.firstChild(); //根节点"JSConfigTemplate"
QDomElement docElem = doc.documentElement(); //返回根节点元素
QDomNode n = docElem.firstChild(); //获得doc的第一个节点即"Topic"
while (!n.isNull()) //如果Topic节点不为空
{
if (n.isElement())
{
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName(); //
if ("ReportMap" == strTag)//zw修改 2023 - 8 - 15 增加判断 将触发报告的解析移至XML 原配置RptLogCfg.ini取消
{
qDebug() << "ReportEvent";
QDomNodeList list = e.childNodes(); //获得元素的所有子节点的列表
for (int i = 0; i < list.count(); i++) //遍历 DataType列表
{
QDomNode node = list.at(i); //node1 <DataType>
if (node.isElement())
{
QString strTag2 = node.toElement().tagName(); //DataType节点
if ("ReportEvent" == strTag2)
{
QDomNodeList list2 = node.childNodes(); //获得元素DataType的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) //遍历 Monitor列表
{
QDomNode node2 = list2.at(i2); //node2 <Monitor>
if (node2.isElement())
{
rpt_cfg_strlist->append(node2.toElement().attribute("ReportControl"));
qDebug() << node2.toElement().attribute("ReportControl").toAscii().data();
}
}
}
}
}
}
}
n = n.nextSibling();
}
QString log_cfg_str = "LLN0$LG$lcStatisticData,dsStatisticData,PQM1,0,600000,1,0,0,0";
log_cfg_strlist->append(log_cfg_str);
}
if (strcmp(subdir, "cfg_his_data") == 0 || strcmp(subdir, "cfg_newhis_data") == 0 || strcmp(subdir, "cfg_recallhis_data") == 0 || strcmp(subdir, "cfg_recallall_data") == 0)
{
QString log_cfg_str = "LLN0$LG$lcStatisticData,dsStatisticData,PQM1,0,600000,1,0,0,0";
log_cfg_strlist->append(log_cfg_str);
}
}
else
{
QString tmppath;
tmppath.append("/FeProject/dat/").append(tmp).append(".xml");
qDebug() << tmppath;
//lnk20241126调试用
std::cout << "rptcfgfile:" << tmppath.toStdString() << std::endl;
//zw修改 2023 - 8 - 15 将触发报告的解析移至XML 原配置RptLogCfg.ini取消
if (strcmp(subdir, "cfg_stat_data") == 0)
{
qDebug() << "cfg_stat_data";
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(tmppath);
if (!file.open(QIODevice::ReadOnly | QFile::Text)) //以只读方式打开xml
{
qDebug() << "Read RPT Error1";
//lnk20241126调试用
std::cout << "Read RPT Error1" << std::endl;
return;
}
if (!doc.setContent(&file)) //将文件内容读到doc中
{
qDebug() << "Read RPT Error2";
//lnk20241126调试用
std::cout << "Read RPT Error2" << std::endl;
file.close();
return;
}
file.close();
QDomNode firstNode = doc.firstChild(); //根节点"JSConfigTemplate"
QDomElement docElem = doc.documentElement(); //返回根节点元素
QDomNode n = docElem.firstChild(); //获得doc的第一个节点即"Topic"
while (!n.isNull()) //如果Topic节点不为空
{
if (n.isElement())
{
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName(); //
if ("ReportMap" == strTag)//zw修改 2023 - 8 - 15 增加判断 将触发报告的解析移至XML 原配置RptLogCfg.ini取消
{
qDebug() << "ReportStat";
QDomNodeList list = e.childNodes(); //获得元素的所有子节点的列表
for (int i = 0; i < list.count(); i++) //遍历 DataType列表
{
QDomNode node = list.at(i); //node1 <DataType>
if (node.isElement())
{
QString strTag2 = node.toElement().tagName(); //DataType节点
if ("ReportStat" == strTag2)
{
QDomNodeList list2 = node.childNodes(); //获得元素DataType的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) //遍历 Monitor列表
{
QDomNode node2 = list2.at(i2); //node2 <Monitor>
if (node2.isElement())
{
rpt_cfg_strlist->append(node2.toElement().attribute("ReportControl"));
qDebug() << node2.toElement().attribute("ReportControl").toAscii().data();
}
}
}
}
}
}
}
n = n.nextSibling();
}
QString log_cfg_str = "LLN0$LG$lcStatisticData,dsStatisticData,PQM1,0,600000,1,0,0,0";
log_cfg_strlist->append(log_cfg_str);
}
//lnk添加实时数据20241125
if (strcmp(subdir, "cfg_3s_data") == 0)
{
qDebug() << "cfg_3s_data";
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(tmppath);
if (!file.open(QIODevice::ReadOnly | QFile::Text)) //以只读方式打开xml
{
qDebug() << "Read RPT Error1";
return;
}
if (!doc.setContent(&file)) //将文件内容读到doc中
{
qDebug() << "Read RPT Error2";
file.close();
return;
}
file.close();
QDomNode firstNode = doc.firstChild(); //根节点"JSConfigTemplate"
QDomElement docElem = doc.documentElement(); //返回根节点元素
QDomNode n = docElem.firstChild(); //获得doc的第一个节点即"Topic"
while (!n.isNull()) //如果Topic节点不为空
{
if (n.isElement())
{
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName(); //
if ("ReportMap" == strTag)//zw修改 2023 - 8 - 15 增加判断 将触发报告的解析移至XML 原配置RptLogCfg.ini取消
{
qDebug() << "ReportReal";
QDomNodeList list = e.childNodes(); //获得元素的所有子节点的列表
for (int i = 0; i < list.count(); i++) //遍历 DataType列表
{
QDomNode node = list.at(i); //node1 <DataType>
if (node.isElement())
{
QString strTag2 = node.toElement().tagName(); //DataType节点
if ("ReportReal" == strTag2)
{
QDomNodeList list2 = node.childNodes(); //获得元素DataType的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) //遍历 Monitor列表
{
QDomNode node2 = list2.at(i2); //node2 <Monitor>
if (node2.isElement())
{
rpt_cfg_strlist->append(node2.toElement().attribute("ReportControl"));
qDebug() << node2.toElement().attribute("ReportControl").toAscii().data();
}
}
}
}
}
}
}
n = n.nextSibling();
}
//QString log_cfg_str = "LLN0$LG$lcStatisticData,dsStatisticData,PQM1,0,600000,1,0,0,0";
//log_cfg_strlist->append(log_cfg_str);
}
if (strcmp(subdir, "cfg_soe_comtrade") == 0)
{
qDebug() << "cfg_soe_comtrade";
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(tmppath);
if (!file.open(QIODevice::ReadOnly | QFile::Text)) //以只读方式打开xml
{
qDebug() << "Read RPT Error1";
return;
}
if (!doc.setContent(&file)) //将文件内容读到doc中
{
qDebug() << "Read RPT Error2";
file.close();
return;
}
file.close();
QDomNode firstNode = doc.firstChild(); //根节点"JSConfigTemplate"
QDomElement docElem = doc.documentElement(); //返回根节点元素
QDomNode n = docElem.firstChild(); //获得doc的第一个节点即"Topic"
while (!n.isNull()) //如果Topic节点不为空
{
if (n.isElement())
{
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName(); //
if ("ReportMap" == strTag)//zw修改 2023 - 8 - 15 增加判断 将触发报告的解析移至XML 原配置RptLogCfg.ini取消
{
qDebug() << "ReportEvent";
QDomNodeList list = e.childNodes(); //获得元素的所有子节点的列表
for (int i = 0; i < list.count(); i++) //遍历 DataType列表
{
QDomNode node = list.at(i); //node1 <DataType>
if (node.isElement())
{
QString strTag2 = node.toElement().tagName(); //DataType节点
if ("ReportEvent" == strTag2)
{
QDomNodeList list2 = node.childNodes(); //获得元素DataType的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) //遍历 Monitor列表
{
QDomNode node2 = list2.at(i2); //node2 <Monitor>
if (node2.isElement())
{
rpt_cfg_strlist->append(node2.toElement().attribute("ReportControl"));
qDebug() << node2.toElement().attribute("ReportControl").toAscii().data();
}
}
}
}
}
}
}
n = n.nextSibling();
}
QString log_cfg_str = "LLN0$LG$lcStatisticData,dsStatisticData,PQM1,0,600000,1,0,0,0";
log_cfg_strlist->append(log_cfg_str);
}
if (strcmp(subdir, "cfg_his_data") == 0 || strcmp(subdir, "cfg_newhis_data") == 0 || strcmp(subdir, "cfg_recallhis_data") == 0 || strcmp(subdir, "cfg_recallall_data") == 0)
{
QString log_cfg_str = "LLN0$LG$lcStatisticData,dsStatisticData,PQM1,0,600000,1,0,0,0";
log_cfg_strlist->append(log_cfg_str);
}
delete[] tmp;
}
}
int parse_rpt_log_ini()
{
const int MAX_DEV_FLAG = 10;
bool not_loaded[MAX_DEV_FLAG];
//QStringList rpt_cfg_strlists[MAX_DEV_FLAG];
//QStringList log_cfg_strlists[MAX_DEV_FLAG];
QMap<QString, QStringList*> rpt_cfg_strlists;
QMap<QString, QStringList*> log_cfg_strlists;
int iedno, cpuno;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
char buf[256];
/*for (int i = 0; i < MAX_DEV_FLAG; ++i)
not_loaded[i] = true;*/
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
ied = g_node->clients[iedno];
ied_usr = GET_IEDEXT_ADDR(ied);
QString type;
type.append(ied_usr->dev_type);
if (!rpt_cfg_strlists.contains(type))
{
QStringList* rpt_temp = new QStringList();
QStringList* log_temp = new QStringList();
rpt_cfg_strlists.insert(type, rpt_temp);
log_cfg_strlists.insert(type, log_temp);
parse_one_rpt_log_ini(ied_usr->dev_flag, rpt_cfg_strlists[type], log_cfg_strlists[type], ied_usr->dev_type);
}
/*if (not_loaded[ied_usr->dev_flag]) {
parse_one_rpt_log_ini(ied_usr->dev_flag, rpt_cfg_strlists[ied_usr->dev_flag], log_cfg_strlists[ied_usr->dev_flag], ied_usr->dev_type);
not_loaded[ied_usr->dev_flag] = false;
}*/
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
LD_info = &(ied_usr->LD_info[cpuno]);
char str[256];
char* tmp = Get_IED(ied_usr->dev_type);
qDebug() << tmp << endl;
apr_snprintf(str, sizeof(str), tmp, cpuno + 1);
ied_usr->LD_info[cpuno].LD_name = apr_pstrdup(g_init_pool, str);//domin
delete[] tmp;
init_rptctrl_by_count(LD_info, rpt_cfg_strlists[type]->size());
for (int i = 0; i < rpt_cfg_strlists[type]->size(); ++i) {
apr_snprintf(buf, sizeof(buf), "%s", rpt_cfg_strlists[type]->at(i).toAscii().constData());
fill_rptctrl_by_cfg(LD_info, i, buf);
}
init_logctrl_by_count(LD_info, log_cfg_strlists[type]->size());
for (int i = 0; i < log_cfg_strlists[type]->size(); ++i) {
apr_snprintf(buf, sizeof(buf), "%s", log_cfg_strlists[type]->at(i).toAscii().constData());
char* tmp = Get_LDevice(ied_usr->dev_type);
fill_logctrl_by_cfg(LD_info, i, buf, tmp);
delete[] tmp;
}
}
}
//报告控制块和日志控制块处理结束后清理容器
for (QMap<QString, QStringList*>::iterator it1 = log_cfg_strlists.begin(); it1 != log_cfg_strlists.end(); ++it1)
{
delete it1.value();
}
for (QMap<QString, QStringList*>::iterator it2 = rpt_cfg_strlists.begin(); it2 != rpt_cfg_strlists.end(); ++it2)
{
delete it2.value();
}
rpt_cfg_strlists.clear();
log_cfg_strlists.clear();
return APR_SUCCESS;
}
int parse_json_cfg()
{
QString cfg_dir = QString("../") + QString("etc/");
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(cfg_dir + JSON_CONFIG_FN_old);
if (!file.open(QIODevice::ReadOnly))
return APR_EBADPATH; //以只读方式打开
if (!doc.setContent(&file)) {
file.close();
return APR_EBADF;
}
//将文件内容读到doc中
QDomElement docElem = doc.documentElement(); //返回根元素
QDomNode n = docElem.firstChild(); //返回根节点的第一个子节点
while (!n.isNull()) { //如果节点不为空
if (n.isElement()) { //如果节点是元素
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName();
QString topic = e.attribute("name");
if (strTag == "Topic" && (topic == "HISDATA" || topic == "RTDATA")) {
QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表 e<Topic>
for (int i = 0; i < list.count(); i++) { //遍历该列表
QDomNode node = list.at(i);
if (node.isElement()) {
QString strTag2 = node.toElement().tagName();
QString data_type = node.toElement().attribute("value");
if (strTag2 == "DataType") { //node <DataType>
QDomNodeList list2 = node.childNodes(); //获得元素node的所有子节点的列表
for (int i2 = 0; i2 < list2.count(); i2++) { //遍历该列表
QDomNode node2 = list2.at(i2); ////node2 <Monitor>
if (node2.isElement()) {
QString strTag3 = node2.toElement().tagName();
///////////////////////////
if (strTag3 == "Monitor") {
QDomNodeList list3 = node2.childNodes(); //获得元素node的所有子节点的列表
for (int i3 = 0; i3 < list3.count(); i3++) { //遍历该列表
QDomNode node3 = list3.at(i3); //node3 <Item>
if (node3.isElement()) {
QString strTag4 = node3.toElement().tagName();
//**////**////**////**////**////**////**////**////**////**////**//
if (strTag4 == "Item") {
QString item = node3.toElement().attribute("name");
QDomNodeList list4 = node3.childNodes(); //获得元素node的所有子节点的列表
for (int i4 = 0; i4 < list4.count(); i4++) { //遍历该列表
QDomNode node4 = list4.at(i4); //node4 <Sequence>
if (node4.isElement()) {
QString strTag5 = node4.toElement().tagName();
//////////*********************////////////////////
if (strTag5 == "Sequence") {
uint sequence = node4.toElement().attribute("value").toUInt();
QDomNodeList list5 = node4.childNodes(); //获得元素node的所有子节点的列表
for (int i5 = 0; i5 < list5.count(); i5++) { //遍历该列表
QDomNode node5 = list5.at(i5); //node5 <Value>
if (node5.isElement()) {
QDomElement e_Value = node5.toElement(); //将其转换为元素
QString strTag6 = e_Value.tagName();
//<Value name="G_DELTA_V" desc="电压偏差95值" type="6" DO="MMXU4$MX$PhVDev" DA="phs*$cVal$mag$f" Coefficient="0.01" />
if (strTag6 == "Value") {
QString name_str = e_Value.attribute("name");
QString DO_str = e_Value.attribute("DO");
QString DA_str = e_Value.attribute("DA");
uint mask = 1;
for (int j = 0; j <= 3; j++) {
if (mask & sequence)
qDebug() << topic << " " << data_type << " " << item << " Phs=" << j << " " << name_str << " " << DO_str << DA_str;
mask *= 2;
}
//todo ,to read the attribute of Value
}
}
}
}
//////////*********************////////////////////
}
}
}
//**////**////**////**////**////**////**////**////**////**////**//
}
}
}
////////////////////////////////
}
}// for(int i2=0; i2<list2.count(); i2++)
} //else if ( strTag == "DataType" )
}
}
}
else if (strTag == "Topic" && (topic == "RTDATASOE")) { //"实时SOE事件"
//todo
}
}
n = n.nextSibling(); //下一个兄弟节点
}
return APR_SUCCESS;
}
//台账更新部分///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
std::string LEDGER_UPDATE_DIR = "../etc/ledgerupdate/";
std::list<std::string> find_xml_belong_to_this_process()
{
char prefix[20]; // 假设最多需要20个字符根据实际需要调整
sprintf(prefix, "%d_%d", g_node_id, g_front_seg_index); // 将g_node_id和g_front_seg_index格式化为字符串
DIR *dir = opendir(LEDGER_UPDATE_DIR.c_str()); // 打开目录
struct dirent *entry;
std::list<std::string> found_files; // 用于存储找到的所有匹配文件名
if (dir == NULL) {
std::cout << "Failed to open directory: " << LEDGER_UPDATE_DIR << std::endl;
return found_files; // 返回空的list
}
//std::cout << "we should find file with prefix:" << prefix << std::endl;
// 遍历目录中的所有文件
while ((entry = readdir(dir)) != NULL) {
std::string filename = entry->d_name;
// 排除 "." 和 ".." 目录
if (filename == "." || filename == "..") {
continue;
}
std::cout << "find" << filename << "in" << LEDGER_UPDATE_DIR << std::endl;
//std::cout << "filename.find(prefix):" << filename.find(prefix) << std::endl;
//std::cout << "filename.substr(filename.find_last_of('.') + 1)" << filename.substr(filename.find_last_of('.') + 1) << std::endl;
// 判断文件名是否以 prefix 开头且扩展名是 .xml
if (filename.find(prefix) == 0 && filename.substr(filename.find_last_of('.') + 1) == "xml") {
std::string full_path = LEDGER_UPDATE_DIR + filename;
found_files.push_back(full_path); // 将完整路径加入容器
}
}
closedir(dir); // 关闭目录
return found_files; // 返回所有找到的文件名
}
// 提取标签中的值的通用函数
std::string extract_value(const std::string& data, const std::string& tag) {
size_t start_pos = data.find("<" + tag + ">");
if (start_pos == std::string::npos) return "";
size_t end_pos = data.find("</" + tag + ">", start_pos);
if (end_pos == std::string::npos) return "";
return data.substr(start_pos + tag.length() + 2, end_pos - start_pos - tag.length() - 2);
}
// 根据 str_tag 将 terminal 添加到对应的数组
void add_terminal_to_trigger_update(trigger_update_xml_t* trigger_update_xml, const std::string& str_tag, const terminal& work_terminal) {
if (str_tag == "add") {
std::cout << "new ledger!!!!"<<std::endl;
if (trigger_update_xml->new_update_num < MAX_UPDATEA_NUM) {
trigger_update_xml->new_updates[trigger_update_xml->new_update_num] = work_terminal;
trigger_update_xml->new_update_num++; // 更新新终端的数量
} else {
std::cerr << "Exceeded MAX_UPDATEA_NUM limit for new updates!" << std::endl;
}
}
else if (str_tag == "modify") {
std::cout << "modify ledger!!!"<<std::endl;
if (trigger_update_xml->modify_update_num < MAX_UPDATEA_NUM) {
trigger_update_xml->modify_updates[trigger_update_xml->modify_update_num] = work_terminal;
trigger_update_xml->modify_update_num++; // 更新修改终端的数量
} else {
std::cerr << "Exceeded MAX_UPDATEA_NUM limit for modify updates!" << std::endl;
}
}
else {
std::cerr << "Unknown tag: " << str_tag << std::endl;
}
}
// 解析 XML 数据并提取 terminal 信息
void parse_terminal_from_data(trigger_update_xml_t* trigger_update_xml, const std::string& str_tag, const std::string& data) {
terminal work_terminal = {}; // 创建新的 terminal 对象
// 提取各个字段
strcpy(work_terminal.terminal_id, extract_value(data, "id").c_str());
strcpy(work_terminal.terminal_code, extract_value(data, "terminalCode").c_str());
strcpy(work_terminal.org_name, extract_value(data, "orgName").c_str());
strcpy(work_terminal.maint_name, extract_value(data, "maintName").c_str());
strcpy(work_terminal.station_name, extract_value(data, "stationName").c_str());
strcpy(work_terminal.tmnl_factory, extract_value(data, "manufacturer").c_str());
strcpy(work_terminal.tmnl_status, extract_value(data, "status").c_str());
strcpy(work_terminal.dev_type, extract_value(data, "devType").c_str());
strcpy(work_terminal.dev_key, extract_value(data, "devKey").c_str());
strcpy(work_terminal.dev_series, extract_value(data, "series").c_str());
strcpy(work_terminal.addr_str, extract_value(data, "ip").c_str());
strcpy(work_terminal.port, extract_value(data, "port").c_str());
strcpy(work_terminal.timestamp, extract_value(data, "updateTime").c_str());
size_t monitor_pos = 0;
size_t monitor_count = 0;
// 查找每个 monitorData最多处理 10 个
while ((monitor_pos = data.find("<monitorData", monitor_pos)) != std::string::npos && monitor_count < 10) {
monitor work_monitor = {}; // 创建新的 monitor 对象
// 找到当前 monitorData 的结束位置
size_t monitor_end_pos = data.find("</monitorData", monitor_pos);
std::string monitor_data = data.substr(monitor_pos, monitor_end_pos - monitor_pos);
// 提取各个字段并填充到 work_monitor 中
std::string monitor_id = extract_value(monitor_data, "id");
std::string monitor_name = extract_value(monitor_data, "name");
std::string voltage_level = extract_value(monitor_data, "voltageLevel");
std::string terminal_connect = extract_value(monitor_data, "ptType");
std::string line_no = extract_value(monitor_data, "lineNo");
std::string timestamp = extract_value(monitor_data, "timestamp");
std::string terminal_code = extract_value(monitor_data, "terminal_code");
std::string status = extract_value(monitor_data, "status");
// 将提取的数据复制到 work_monitor 中,若没有数据则复制 "N/A"
strcpy(work_monitor.monitor_id, monitor_id.empty() ? "N/A" : monitor_id.c_str());
strcpy(work_monitor.monitor_name, monitor_name.empty() ? "N/A" : monitor_name.c_str());
strcpy(work_monitor.voltage_level, voltage_level.empty() ? "N/A" : voltage_level.c_str());
strcpy(work_monitor.terminal_connect, terminal_connect.empty() ? "N/A" : terminal_connect.c_str());
strcpy(work_monitor.logical_device_seq, line_no.empty() ? "N/A" : line_no.c_str());
strcpy(work_monitor.timestamp, timestamp.empty() ? "N/A" : timestamp.c_str());
strcpy(work_monitor.terminal_code, terminal_code.empty() ? "N/A" : terminal_code.c_str());
strcpy(work_monitor.status, status.empty() ? "N/A" : status.c_str());
// 将提取的 monitor 数据存入 work_terminal.line[monitor_count]
work_terminal.line[monitor_count] = work_monitor;
monitor_count++; // 增加 monitor 的计数
monitor_pos = monitor_end_pos; // 移动 monitor_pos 到下一个 <monitorData> 的位置
}
// 根据 str_tag 将 terminal 添加到相应的数组
add_terminal_to_trigger_update(trigger_update_xml, str_tag, work_terminal);
}
void parse_ledger_update(trigger_update_xml_t* trigger_update_xml, const std::string& strTag, const std::string& data)
{
std::cout << "record one xml.."<<std::endl;
// 根据 strTag 做不同处理
if (strTag == "add" || strTag == "modify") {
// 填充终端信息
parse_terminal_from_data(trigger_update_xml, strTag, data);
}else if (strTag == "delete") {
terminal delete_terminal;
memset(&delete_terminal, 0, sizeof(delete_terminal));
if (strTag == "delete") {
// 填充终端信息
strcpy(delete_terminal.terminal_id, extract_value(data, "id").c_str());
// 将删除信息写入 delete_updates
std::cout << "delete ledger!!!!!"<<std::endl;
if (trigger_update_xml->delete_update_num < MAX_UPDATEA_NUM) {
trigger_update_xml->delete_updates[trigger_update_xml->delete_update_num] = delete_terminal;
trigger_update_xml->delete_update_num++; // 增加计数
}
}
} else {
std::cerr << "Unsupported strTag: " << strTag << std::endl;
}
}
int load_ledger_update_from_xml(trigger_update_xml_t* trigger_update_xml, const std::string& xml_fn)
{
std::cout << "start to load one xml.."<<std::endl;
std::ifstream file(xml_fn.c_str()); // 打开XML文件
if (!file.is_open()) {
std::cerr << "Failed to open file: " << xml_fn << std::endl;
return -1;
}
std::string line;
std::stringstream file_content;
// 读取文件内容
while (std::getline(file, line)) {
file_content << line << "\n";
}
file.close();
std::string content = file_content.str();
// 查找 <ledger_update> 标签
size_t ledger_pos = content.find("<ledger_update>");
if (ledger_pos == std::string::npos) {
std::cerr << "ledger_update tag not found!" << std::endl;
return -1;
}
// 查找 <add>, <delete>, <modify> 标签
size_t add_pos = content.find("<add>", ledger_pos);
size_t delete_pos = content.find("<delete>", ledger_pos);
size_t modify_pos = content.find("<modify>", ledger_pos);
// 确定哪个标签存在,并获取相应的位置
size_t target_pos = std::string::npos;
std::string target_tag;
if (add_pos != std::string::npos) {
target_pos = add_pos;
target_tag = "add";
} else if (delete_pos != std::string::npos) {
target_pos = delete_pos;
target_tag = "delete";
} else if (modify_pos != std::string::npos) {
target_pos = modify_pos;
target_tag = "modify";
}
//没找到正确的标签退出处理
if (target_pos == std::string::npos) {
std::cerr << "No <add>, <delete>, or <modify> tag found!" << std::endl;
return -1;
}
// 查找目标标签的结束位置
size_t end_pos = content.find("</" + target_tag + ">", target_pos);
if (end_pos == std::string::npos) {
std::cerr << "Closing </" + target_tag + "> tag not found!" << std::endl;
return -1;
}
// 提取目标标签的内容
std::string target_content = content.substr(target_pos + target_tag.length() + 2, end_pos - (target_pos + target_tag.length() + 2));
// 解析 <data> 和其中的内容
size_t data_pos = 0;
while ((data_pos = target_content.find("<terminalData>", data_pos)) != std::string::npos) {
size_t data_end_pos = target_content.find("</terminalData>", data_pos);
if (data_end_pos == std::string::npos) {
std::cerr << "Closing </terminalData> tag not found!" << std::endl;
return -1;
}
std::string data_content = target_content.substr(data_pos + 14, data_end_pos - (data_pos + 14));
std::cout << "ledger data_content is " << data_content <<std::endl;
// 调用parse_ledger_update处理台账的内容
parse_ledger_update(trigger_update_xml, target_tag, data_content);
// 移动到下一个<terminalData>标签,目前每个文件只有一个台账
data_pos = data_end_pos + 15;
}
std::cout << "load one xml finish"<<std::endl;
return 0; // 成功返回
}
int parse_ledger_update_xml(trigger_update_xml_t* trigger_update_xml)
{
//printf("begin ledger update xml...\n");
std::list<std::string> result = find_xml_belong_to_this_process();
if (!result.empty()) {
std::cout << "Found XML files:" << std::endl;
for (std::list<std::string>::iterator it = result.begin(); it != result.end(); ++it) {
const std::string& filename = *it;
std::cout << filename << std::endl;
//解析每个文件,提取终端,判断终端是否满足更新条件
apr_sleep(apr_time_from_sec(1) / 10);
//加载一个文件的内容到数据结构
if (!load_ledger_update_from_xml(trigger_update_xml, filename)) {
std::cout << "read /etc/ledgerupdate/" << filename << " success..." << std::endl;
}
//处理过的文件删除掉
if (std::remove(filename.c_str()) != 0) {
std::cerr << "Failed to remove file: " << filename << " Error: " << strerror(errno) << std::endl;
return APR_EGENERAL;
}
else{
std::cout << "remove file: " << filename << " success..." << std::endl;
}
}
}
else {
//std::cout << "No matching XML files found." << std::endl;
return APR_EGENERAL;
}
//有数据返回成功,后续进行处理
//printf("Modify Update Count: %d\n", trigger_update_xml->modify_update_num);
//printf("Delete Update Count: %d\n", trigger_update_xml->delete_update_num);
//printf("New Update Count: %d\n", trigger_update_xml->new_update_num);
if(trigger_update_xml->modify_update_num || trigger_update_xml->delete_update_num || trigger_update_xml->new_update_num){
printf("ledger update xml have data...\n");
return APR_SUCCESS;
}
else{//无数据返回失败,后续不处理
printf("ledger update xml no data...\n");
return APR_EGENERAL;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//实时触发部分/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QString THREE_SECS_WEBSERVICE_DIR = QString("../etc/trigger3s/");
QString get_3s_trig_fn()
{
QDir directory(THREE_SECS_WEBSERVICE_DIR);
QStringList filters = QStringList() << "*.xml";
QStringList fileNames = directory.entryList(filters, QDir::Files, QDir::Time/*|QDir::Reversed*/);
if (fileNames.size() > 0)
return fileNames.at(0);
else
return "";
}
///////////////////////////////////////////////////////////////
int getValueFromElemAttrStr(QString str)
{
if (str == "true")
return 1;
else if (str == "false")
return 0;
else
return -1;
}
//lnk20241125添加打印调试用/////////////////////////////////////////////////////////////////////////////////////////////////
// 打印 trigger_t 结构体的函数
void print_trigger(const trigger_t& trigger) {
printf(" dev_idx: %d, line_id: %d, real_data: %d, soe_data: %d, limit: %d, count: %d\n",
trigger.dev_idx, trigger.line_id, trigger.real_data, trigger.soe_data, trigger.limit, trigger.count);
}
// 打印 trigger_3s_xml_t 结构体的函数
void print_trigger_3s_xml(const trigger_3s_xml_t& trigger_3s_xml) {
printf("Work Trigger Count: %d\n", trigger_3s_xml.work_trigger_num);
for (int i = 0; i < trigger_3s_xml.work_trigger_num; ++i) {
printf(" Work Trigger [%d]:\n", i + 1);
print_trigger(trigger_3s_xml.work_triggers[i]);
}
printf("New Trigger Count: %d\n", trigger_3s_xml.new_trigger_num);
for (int i = 0; i < trigger_3s_xml.new_trigger_num; ++i) {
printf(" New Trigger [%d]:\n", i + 1);
print_trigger(trigger_3s_xml.new_triggers[i]);
}
printf("Delete Trigger Count: %d\n", trigger_3s_xml.delete_trigger_num);
for (int i = 0; i < trigger_3s_xml.delete_trigger_num; ++i) {
printf(" Delete Trigger [%d]:\n", i + 1);
print_trigger(trigger_3s_xml.delete_triggers[i]);
}
printf("Modify Trigger Count: %d\n", trigger_3s_xml.modify_trigger_num);
for (int i = 0; i < trigger_3s_xml.modify_trigger_num; ++i) {
printf(" Modify Trigger [%d]:\n", i + 1);
print_trigger(trigger_3s_xml.modify_triggers[i]);
}
}
//实时触发文件处理部分//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void parse_3s_trigger(trigger_3s_xml_t* trigger_3s_xml, QString parentTag, QDomElement& trigger_e)
{
QString e_atr("");
trigger_t trigger;
trigger.dev_idx = trigger_e.attribute("DevSeries").toInt();
trigger.line_id = trigger_e.attribute("Line").toInt();
e_atr = trigger_e.attribute("RealData").toLower();
trigger.real_data = getValueFromElemAttrStr(e_atr);
e_atr = trigger_e.attribute("SOEData").toLower();
trigger.soe_data = getValueFromElemAttrStr(e_atr);
trigger.limit = trigger_e.attribute("Limit").toInt();
trigger.count = trigger_e.attribute("Count").toInt();
//qDebug()<<parentTag << "-> " << dev_idx<<" "<<line_id<<" "<<real_data<<" "<<soe_data <<" " << limit<<" " << count;
if (parentTag == "Work") {
trigger_3s_xml->work_triggers[trigger_3s_xml->work_trigger_num++] = trigger;
}
else if (parentTag == "New") {
trigger_3s_xml->new_triggers[trigger_3s_xml->new_trigger_num++] = trigger;
}
else if (parentTag == "Delete") {
trigger_3s_xml->delete_triggers[trigger_3s_xml->delete_trigger_num++] = trigger;
}
else if (parentTag == "Modify") {
trigger_3s_xml->modify_triggers[trigger_3s_xml->modify_trigger_num++] = trigger;
}
//调试用lnk20241125
print_trigger_3s_xml(*trigger_3s_xml);
}
int load_3s_data_from_xml(trigger_3s_xml_t* trigger_3s_xml, QString xml_fn)
{
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(xml_fn);
if (!file.open(QIODevice::ReadOnly))
return APR_EBADPATH; //以只读方式打开
bool ret = doc.setContent(&file);
file.close();
if (!ret)
return APR_EBADF;
//将文件内容读到doc中
QDomElement docElem = doc.documentElement(); //返回根元素
QDomNode n = docElem.firstChild(); //返回根节点的第一个子节点
while (!n.isNull()) { //如果节点不为空
if (n.isElement()) { //如果节点是元素
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName();
if (strTag == "Work" || strTag == "New" || strTag == "Delete" || strTag == "Modify") {
QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表
for (int i = 0; i < list.count(); i++) { //遍历该列表
QDomNode node = list.at(i);
if (node.isElement()) {
QDomElement trigger_e = node.toElement();
QString strTag2 = trigger_e.tagName();
if (strTag2 == "Trigger") {
parse_3s_trigger(trigger_3s_xml, strTag, trigger_e);
} //else if ( strTag == "Trigger" )
}
}
}
}
n = n.nextSibling(); //下一个兄弟节点
}
return APR_SUCCESS;
}
QString BAK_WEBSERVICE_3S_TRIG_COMMAND_XML_FN = THREE_SECS_WEBSERVICE_DIR + "bak_3s_trig_command.txt";
int parse_3s_xml(trigger_3s_xml_t* trigger_3s_xml)
{
printf("begin 3s xml...\n");
memset(trigger_3s_xml, 0, sizeof(trigger_3s_xml_t));
//这个文件是用来记录正在进行中的实时触发
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/");
load_3s_data_from_xml(trigger_3s_xml, (cfg_dir + THREE_SECS_CONFIG_FN)); //加载/Feproject/etc/Trigger3S.xml
QString the_webservice_xml_fn = get_3s_trig_fn();// ../etc/trigger3s/目录下的最新的xml文件这个文件是用来打开实时触发的开关
printf("the_webservice_xml_fn.size():%d\n",the_webservice_xml_fn.size());
if (the_webservice_xml_fn.size() > 4) {//文件名大于4说明找到文件
apr_sleep(apr_time_from_sec(1) / 10);
the_webservice_xml_fn = THREE_SECS_WEBSERVICE_DIR + the_webservice_xml_fn;
load_3s_data_from_xml(trigger_3s_xml, the_webservice_xml_fn);
QFile::remove(BAK_WEBSERVICE_3S_TRIG_COMMAND_XML_FN);
QFile::rename(the_webservice_xml_fn, BAK_WEBSERVICE_3S_TRIG_COMMAND_XML_FN);
printf("/etc/trigger3s/*.xml success...\n");
return APR_SUCCESS;
}
printf("3s xml fail...\n");
return APR_EGENERAL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//3s触发记录写入文件
void append_triggers(QDomDocument& doc, QDomElement& root, QString parentTag, trigger_t* trigger, int trigger_num)
{
QString str;
QDomElement funcItem = doc.createElement(parentTag);
root.appendChild(funcItem);
for (int i = 0; i < trigger_num; i++) {
if (trigger[i].dev_idx == INVALID_DEV_IDX)
continue;
if (trigger[i].real_data == 0 && trigger[i].soe_data == 0)
continue;
QDomElement triggerItem = doc.createElement("Trigger");
triggerItem.setAttribute("DevSeries", trigger[i].dev_idx);
triggerItem.setAttribute("Line", trigger[i].line_id);
str = trigger[i].real_data ? "true" : "false";
triggerItem.setAttribute("RealData", str);
str = trigger[i].soe_data ? "true" : "false";
triggerItem.setAttribute("SOEData", str);
triggerItem.setAttribute("Limit", trigger[i].limit);
triggerItem.setAttribute("Count", trigger[i].count);
funcItem.appendChild(triggerItem);
}
}
int create_3s_xml(trigger_3s_xml_t* trigger_3s_xml)
{
QDomDocument doc;
doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"gb2312\""));
QDomElement root = doc.createElement("Trigger3S");
doc.appendChild(root);
append_triggers(doc, root, "Work", trigger_3s_xml->work_triggers, trigger_3s_xml->work_trigger_num);
append_triggers(doc, root, "New", trigger_3s_xml->new_triggers, 0);
append_triggers(doc, root, "Delete", trigger_3s_xml->delete_triggers, 0);
append_triggers(doc, root, "Modify", trigger_3s_xml->modify_triggers, 0);
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/");
QFile file(cfg_dir + THREE_SECS_CONFIG_FN /*+".bak.xml"*/);
if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)) {
return -1;
}
QTextStream out(&file);
out.setCodec("gb2312");
doc.save(out, 4);
file.close();
return APR_SUCCESS;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数功能:从指定的 .cfg 配置文件中提取起始时间和触发时间,并将其转化为毫秒级时间戳。
// 输入参数:
// - comtrade_fn输入的文件名作为参考用于定位对应的 .cfg 配置文件。
// 输出参数:
// - start_tm返回的起始时间戳单位毫秒
// - trig_tm返回的触发时间戳单位毫秒
// 返回值:
// - 返回 APR_SUCCESS 表示成功,返回 APR_EBADF 表示文件错误。
int extract_timestamp_from_cfg_file(char* comtrade_fn, long long* start_tm, long long* trig_tm)
{
// 获取文件名信息,路径和文件名提取
QFileInfo fi(QString::fromAscii(comtrade_fn));
QString fn = fi.fileName();
QString cfgFileName_temp = QString("../comtrade/") + fn; // 拼接.cfg文件的路径
// 检查文件是否以 ".cfg" 或 ".CFG" 结尾
if (!cfgFileName_temp.endsWith(".cfg", Qt::CaseInsensitive) && !cfgFileName_temp.endsWith(".CFG", Qt::CaseInsensitive))
return APR_EBADF; // 如果文件名不符合要求,返回文件错误
// 打开配置文件
QFile cfgFile_temp(cfgFileName_temp);
if (!cfgFile_temp.exists()) { // 如果文件不存在
qDebug() << QString("Cannot find corresponding .cfg file: %1").arg(cfgFileName_temp);
cfgFile_temp.close();
return APR_EBADF;
}
else if (!cfgFile_temp.open(QFile::ReadOnly | QFile::Text)) { // 如果文件无法打开
qDebug() << QString("Cannot open file %1:\n%2.").arg(cfgFileName_temp).arg(cfgFile_temp.errorString());
return APR_EBADF;
}
else {
QStringList datContentList_temp;
QTextStream in_temp(&cfgFile_temp); // 创建文本流读取文件
// 忽略 GBK 编码相关的代码(被注释掉了)
QString start_time_str(""); // 用于存储起始时间字符串
QString trigger_time_str(""); // 用于存储触发时间字符串
// 按行读取配置文件内容
while (!in_temp.atEnd()) {
QString line_temp = in_temp.readLine().trimmed(); // 读取并去除空白字符
QString upper_line_temp = line_temp.toUpper(); // 转换为大写字符
// 如果读取到 "ASCII" 或 "BINARY" 字符串,则停止处理
if ((upper_line_temp == QString("ASCII")) || (upper_line_temp == QString("BINARY")))
break;
else {
// 如果没有,更新起始时间和触发时间
start_time_str = trigger_time_str;
trigger_time_str = line_temp;
}
}
// 如果提取到的 start_time_str 长度大于3则去掉最后3个字符通常是毫秒部分
if (start_time_str.size() > 3)
start_time_str = start_time_str.left(start_time_str.size() - 3);
// 将 start_time_str 转换为 QDateTime 对象,并转换为自纪元以来的毫秒数
QDateTime start_time_dt = QDateTime::fromString(start_time_str, "dd/MM/yyyy,hh:mm:ss.zzz");
*start_tm = start_time_dt.toMSecsSinceEpoch(); // 转换为毫秒时间戳并赋值给 start_tm
// 同样处理触发时间去掉最后3个字符并转换为时间戳
if (trigger_time_str.size() > 3)
trigger_time_str = trigger_time_str.left(trigger_time_str.size() - 3);
QDateTime trigger_time_dt = QDateTime::fromString(trigger_time_str, "dd/MM/yyyy,hh:mm:ss.zzz");
*trig_tm = trigger_time_dt.toMSecsSinceEpoch(); // 转换为毫秒时间戳并赋值给 trig_tm
cfgFile_temp.close(); // 关闭文件
}
return APR_SUCCESS; // 成功返回
}
#if 0
int extract_timestamp_from_cfg_file(char* comtrade_fn, long long* start_tm, long long* trig_tm)
{
QFileInfo fi(QString::fromAscii(comtrade_fn));
QString fn = fi.fileName();
QString cfgFileName_temp = QString("../comtrade/") + fn;
if (!cfgFileName_temp.endsWith(".cfg", Qt::CaseInsensitive) && !cfgFileName_temp.endsWith(".CFG", Qt::CaseInsensitive))//fn_str.endsWith(".cfg", Qt::CaseInsensitive) || fn_str.endsWith(".CFG", Qt::CaseInsensitive)
return APR_EBADF;
QFile cfgFile_temp(cfgFileName_temp);
if (!cfgFile_temp.exists()) {
qDebug() << QString("Cannot find corresponding .cfg file: %1").arg(cfgFileName_temp);
cfgFile_temp.close();
return APR_EBADF;
}
else if (!cfgFile_temp.open(QFile::ReadOnly | QFile::Text)) {
qDebug() << QString("Cannot open file %1:\n%2.").arg(cfgFileName_temp).arg(cfgFile_temp.errorString());
return APR_EBADF;
}
else {
QStringList datContentList_temp;
QTextStream in_temp(&cfgFile_temp);
/*QTextCodec *codec_temp=QTextCodec::codecForName("gbk");
in_temp.setCodec(codec_temp);*/
QString start_time_str("");
QString trigger_time_str("");
while (!in_temp.atEnd()) {
QString line_temp = in_temp.readLine().trimmed();
QString upper_line_temp = line_temp.toUpper();
if ((upper_line_temp == QString("ASCII")) || (upper_line_temp == QString("BINARY")))
break;
else {
start_time_str = trigger_time_str;
trigger_time_str = line_temp;
}
}
//11/05/2018,15:28:53.343000
if (start_time_str.size() > 3)
start_time_str = start_time_str.left(start_time_str.size() - 3);
QDateTime start_time_dt = QDateTime::fromString(start_time_str, "dd/MM/yyyy,hh:mm:ss.zzz");
*start_tm = start_time_dt.toMSecsSinceEpoch();
if (trigger_time_str.size() > 3)
trigger_time_str = trigger_time_str.left(trigger_time_str.size() - 3);
QDateTime trigger_time_dt = QDateTime::fromString(trigger_time_str, "dd/MM/yyyy,hh:mm:ss.zzz");
*trig_tm = trigger_time_dt.toMSecsSinceEpoch();
cfgFile_temp.close();
}
return APR_SUCCESS;
}
#endif
//录波部分///////////////////////////////////////////////////////////////////////////////
//WW 2023-11-01 增加录波段号采用int类型匹配
int parse_file_names_by_fltnum(int fltnum, char* domname, char** filenames, int filenum, int* cfg_idx, int* dat_idx, char* file_base_name, char* file_yyyymm)
{
int j;
printf(">>>>>>>>>>>>>>>>>>pares_file_names file list match fltnum=%d", fltnum);
*cfg_idx = -1;
*dat_idx = -1;
for (j = 0; j < filenum; ++j) {
char fileNameTemp[64];
strcpy(fileNameTemp, filenames[j]); //临时存放 装置录波文件名
printf(" %s ", fileNameTemp);
if (strstr(fileNameTemp, domname) == NULL) //例:域名:"PQMonitor_PQM1" 不是 装置录波文件名:"PQMonitor_PQM1_000001_20191121_154534_689.CFG/.DAT/.HDR"的子串
continue;
char* p = strtok(fileNameTemp, "_"); //PQMonitor
p = strtok(NULL, "_"); //PQM1
p = strtok(NULL, "_"); //000001
int nFltNum = atoi(p); //将字符转换成整型
if (nFltNum == fltnum) {
QString fn_str = QString::fromAscii(filenames[j]);
if (fn_str.endsWith(".cfg", Qt::CaseInsensitive) || fn_str.endsWith(".CFG", Qt::CaseInsensitive)) {
//PQMonitor_PQM4_000349_20180531_113701_618.CFG
*cfg_idx = j;
QFileInfo fi(fn_str);
QString fn = fi.baseName();
strcpy(file_base_name, fn.toAscii().data());
QString remain_str = fn_str.split(QString::fromAscii(p)).at(1);
QString yyyymm_str = remain_str.mid(1, 6);
strcpy(file_yyyymm, yyyymm_str.toAscii().data());
}
else if (fn_str.endsWith(".dat", Qt::CaseInsensitive) || fn_str.endsWith(".DAT", Qt::CaseInsensitive))
*dat_idx = j;
}
if (*cfg_idx != -1 && *dat_idx != -1)//两个文件都已经找到
break;
}
printf("\n<<<<<<<<<<<<<<<<<<<<<pares_file_names file list match end cfg_inx=%d dat_idx=%d \n", *cfg_idx, *dat_idx);
if ((*cfg_idx) >= 0 && (*dat_idx) >= 0)
return APR_SUCCESS;
else
return APR_EBADF;
}
//WW2023-11-01 end
int parse_file_names(char* file_match_str, char** filenames, int filenum, int* cfg_idx, int* dat_idx, char* file_base_name, char* file_yyyymm)
{
int j;
*cfg_idx = -1;
*dat_idx = -1;
for (j = 0; j < filenum; ++j) {
if (strstr(filenames[j], file_match_str) != NULL) {
QString fn_str = QString::fromAscii(filenames[j]);
if (fn_str.endsWith(".cfg", Qt::CaseInsensitive)) {
//PQMonitor_PQM4_000349_20180531_113701_618.CFG
*cfg_idx = j;
QFileInfo fi(fn_str);
QString fn = fi.baseName();
strcpy(file_base_name, fn.toAscii().data());
QString remain_str = fn_str.split(QString::fromAscii(file_match_str)).at(1);
QString yyyymm_str = remain_str.mid(1, 6);
strcpy(file_yyyymm, yyyymm_str.toAscii().data());
}
else if (fn_str.endsWith(".dat", Qt::CaseInsensitive))
*dat_idx = j;
}
}
if ((*cfg_idx) >= 0 && (*dat_idx) >= 0)
return APR_SUCCESS;
else
return APR_EBADF;
}
//补招部分////////////////////////////////////////////////////////////////////////////////
void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& recall_e, char* id)
{
recall_t recall;
/*QString ied;
ied.append(recall_e.attribute("MonitorID"));
QByteArray byteArray = ied.toLocal8Bit();
char* charArray = new char[byteArray.size()];
memcpy(charArray, byteArray.data(), byteArray.size());
charArray[byteArray.size()] = '\0';*/
recall.line_id = id;
QDateTime start_dt = QDateTime::fromString(recall_e.attribute("StartTime"), "yyyy-MM-dd hh:mm:ss");
recall.start_time = start_dt.toMSecsSinceEpoch() / 1000;
QDateTime end_dt = QDateTime::fromString(recall_e.attribute("EndTime"), "yyyy-MM-dd hh:mm:ss");
recall.end_time = end_dt.toMSecsSinceEpoch() / 1000;
recall.need_steady = recall_e.attribute("STEADY").toInt();
recall.need_voltage = recall_e.attribute("VOLTAGE").toInt();
qDebug() << parentTag << "-> " << " " << recall.line_id << " " << recall.need_steady << " " << recall.need_voltage
<< " " << recall.start_time << " " << recall.end_time;
if (parentTag == "Work") {
recall_xml->work_recalls[recall_xml->work_recall_num++] = recall;
}
else if (parentTag == "New") {
recall_xml->new_recalls[recall_xml->new_recall_num++] = recall;
}
}
int delete_recall_xml(char* id)
{
// ied_t *ied;
// ied_usr_t *ied_usr;
// LD_info_t line_info;
// int dev_idx_in_line = 0;
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/recall");
QString file_name = QString(subdir) + QString("_") + QString(QString::number(g_front_seg_index, 10)) + QString("_") + QString(id) + QString("_") + QString("*") + QString("_Recall.xml");
//指定文件夹名
QDir dir(cfg_dir);
if (!dir.exists()) {
qDebug() << "folder does not exist!";
return false;
}
//指定文件后缀名,可指定多种类型
//qDebug() << qstrRecallPath;
QStringList filter(file_name);
//指定查找类型和排序,按最新的修改时间获取
QStringList files = dir.entryList(filter, QDir::Files | QDir::Readable | QDir::NoDotAndDotDot, QDir::Name | QDir::Time);
for (int i = 0; i < files.size(); i++) {//清空读取文件
QString qstrRecallPath = cfg_dir + QString("/") + files[i];
QFile::remove(qstrRecallPath);
}
return APR_SUCCESS;
}
int parse_recall_xml(recall_xml_t* recall_xml, char* id)
{
// ied_t *ied;
// ied_usr_t *ied_usr;
// LD_info_t line_info;
// int dev_idx_in_line = 0;
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/recall");
QString file_name = QString(subdir) + QString("_") + QString(QString::number(g_front_seg_index, 10)) + QString("_") + QString(id) + QString("_") + QString("*") + QString("_Recall.xml");
//lnk20241225这里文件名
//指定文件夹名
QDir dir(cfg_dir);
if (!dir.exists()) {
qDebug() << "folder does not exist!";
return false;
}
//指定文件后缀名,可指定多种类型
//qDebug() << qstrRecallPath;
QStringList filter(file_name);
//指定查找类型和排序,按最新的修改时间获取
QStringList files = dir.entryList(filter, QDir::Files | QDir::Readable | QDir::NoDotAndDotDot, QDir::Name | QDir::Time);
for (int i = 0; i < files.size(); i++) {
QString qstrRecallPath = cfg_dir + QString("/") + files[i];
qDebug() << qstrRecallPath;
QDomDocument doc; //新建QDomDocument类对象它代表一个XML文档
QFile file(qstrRecallPath);
if (!file.open(QIODevice::ReadOnly))
{
qDebug() << "file.open error";
continue; //以只读方式打开
}
bool ret = doc.setContent(&file);
file.close();
if (!ret)
{
qDebug() << "doc.setContent error";
continue;
}
//将文件内容读到doc中
QDomElement docElem = doc.documentElement(); //返回根元素
QDomNode n = docElem.firstChild(); //返回根节点的第一个子节点
while (!n.isNull()) { //如果节点不为空
if (n.isElement()) { //如果节点是元素
QDomElement e = n.toElement(); //将其转换为元素
QString strTag = e.tagName();
if (strTag == "Work" || strTag == "New") {
QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表
for (int i = 0; i < list.count(); i++) { //遍历该列表
QDomNode node = list.at(i);
if (node.isElement()) {
QDomElement recall_e = node.toElement();
QString strTag2 = recall_e.tagName();
if (strTag2 == "Recall") {
parse_recall(recall_xml, strTag, recall_e, id);
} //else if ( strTag == "Trigger" )
}
}
}
}
n = n.nextSibling(); //下一个兄弟节点
}
}
//for (int i = 0; i < files.size(); i++) {//清空读取文件
// QString qstrRecallPath = cfg_dir + QString("/") + files[i];
// QFile::remove(qstrRecallPath);
//}
return APR_SUCCESS;
}
void process_recall_config(recall_xml_t* recall_xml)
{
int i, j;
recall_t* recall;
recall_t* recall_work;
int recall_num;
int need_write_file;
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
need_write_file = FALSE;
recall = recall_xml->new_recalls;
recall_num = recall_xml->new_recall_num;
for (i = 0; i < recall_num; i++) {
recall_xml->work_recalls[recall_xml->work_recall_num++] = recall[i];
need_write_file = TRUE;
}
recall = recall_xml->work_recalls;
recall_num = recall_xml->work_recall_num;
if (recall_num > 0) {
LD_info_t* LD_info = find_LD_info_only_from_mp_id(recall[0].line_id);
printf("\n recall[0].line_id == %s \n", recall[0].line_id);
printf("\n recall[0].start_time == %d \n", recall[0].start_time);
if (LD_info == NULL || LD_info->read_flag == 0) {
printf("\n recall[0].line_id == NULL \n");
printf("\n Find LD_info == null \n");
}
else {
printf("\n Find LD_info != null \n");
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) {
if (LD_info->autorecallcount != 0) {
for (int j = 0; j < LD_info->autorecallcount; j++) {
delete LD_info->autorecall[j];
}
delete LD_info->autorecall;
LD_info->autorecallcount = 0;
}
LD_info->autorecallcount = recall_num;
LD_info->autorecall = new autorecall_t * [recall_num];
for (int j = 0; j < recall_num; j++) {
printf("\n %d ===== %d\n", recall[j].start_time, recall[j].end_time);
LD_info->autorecall[j] = new autorecall_t[1];
LD_info->autorecall[j]->start = recall[j].start_time;
LD_info->autorecall[j]->end = recall[j].end_time;
//lnk20241030补充补招稳态暂态标志每个文件都有很多条时间记录
LD_info->autorecall[j]->need_steady = recall[j].need_steady;
LD_info->autorecall[j]->need_steady = recall[j].need_voltage;
}
LD_info->autorecallflag = 0;
}
}
}
}
int remove_recall_xml()
{
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/");
QString filename(cfg_dir + RECALL_CONFIG_FN);
return QFile::remove(filename);
}
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////WW 20230819 增加数据库连接函数
int OTLConnect() //OTL连接Oracle数据库
{
try {
otl_connect::otl_initialize(); //初始化OTL连接库的环境的静态函数
//db.rlogon(g_strOTLConnect.c_str()); //连接数据库Oracle(用户名/密码)
//db.rlogon("postgres", "dnzl@#001", "pgsql", 0);
//db.rlogon("postgres", "1234567", "pgsql", 0);
//db.rlogon("postgres", "bmdev@123", "pgsql", 0);
db.rlogon(POSTGRES_USERNAME, POSTGRES_PASSWORD, POSTGRES_DNSNAME, 0);
printf("\nPostgreSL\"%s\"connect succ\n", g_strOTLConnect.c_str());
}
catch (otl_exception& e)
{
//printf("\nPostgreSL\"%s\"failed,ERROR code= %d, msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
if (e.code != 32031)
printf("\nPostgreSL\"%s\"failed,ERROR code= %d, msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
return 0;
}
int OTLDisconnect() //OTL断开Oracle数据库
{
try {
db.logoff();
printf("\nPostgreSL\"%s\"disconnect\n\n", g_strOTLConnect.c_str());
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"disconnect failed,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
return 0;
}
int OTLTestSelect() //OTL连接Oracle数据库
{
try {
OTLConnect();
//int rtState = OTLState();
otl_stream i(1, // buffer size
"select \"MODEL_ID\" from \"gaussdb\".\"MEAS_PQ_ICD_MODEL_TR\"",
//SELECT statement
db //connect object
);
//create select stream
char f2[64];
while (!i.eof()) { //while not end-of-data
i >> f2;
qDebug() << " MODEL_ID =" << f2 << endl;
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
return 0;
}
int OTLState() //OTL连接Oracle数据库状态
{
try {
otl_datetime tm;
std::string strSql = "select sysdate from dual";
//std::string strSql = "select * from pgsql_test_gy";
otl_stream i(1, strSql.c_str(), db);
if (!i.eof()) {
i >> tm;
QString qstrYear = QString("%1").arg(tm.year, 4, 10, QLatin1Char('0'));
QString qstrMonth = QString("%1").arg(tm.month, 2, 10, QLatin1Char('0'));
int iYear = qstrYear.toInt();
int iMonth = qstrMonth.toInt();
QString qCurrentYear = QDateTime::currentDateTime().toString("yyyy");
QString qCurrentMonth = QDateTime::currentDateTime().toString("MM");
if (!qstrYear.isEmpty() && !qstrMonth.isEmpty()) {
if ((iYear >= 1970) || (iMonth >= 1))
return 0;
else {
printf("qstrYear= %siYear= %dqCurrentYear= %s且qstrMonth= %siMonth= %dqCurrentMonth= %s不等需检查数据库OTL连接\n", qstrYear.toAscii().data(), iYear, qCurrentYear.toAscii().data(), qstrMonth.toAscii().data(), iMonth, qCurrentMonth.toAscii().data());
return -1;
}
}
else {
printf("Sql查询系统日期qstrYear= %s或qstrMonth= %s为空需检查数据库OTL连接\n", qstrYear.toAscii().data(), qstrMonth.toAscii().data());
return -1;
}
printf(">>>Sql查询系统日期qstrYear= %sqCurrentYear= %sqstrMonth= %sqCurrentMonth= %s \n", qstrYear.toAscii().data(), qCurrentYear.toAscii().data(), qstrMonth.toAscii().data(), qCurrentMonth.toAscii().data());
}
}
catch (otl_exception& e)
{
printf("Sql查询系统日期时间失败ERROR code= %d, msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
return 0;
}
int OTLDbconnected() {
cout << "db.connect is :" << db.connected << endl;
return db.connected;
}
////////////////////////////////////////////////////////////////////////////////数据库部分
int write_to_db(const char* sqlstm) //写数据库
{
try {
apr_sleep(apr_time_from_sec(1) / 1000);
otl_stream i(1, sqlstm, db);
i.flush();
i.close();
db.commit();
printf(">>>当前写数据库Sql= %s\n", sqlstm);
}
catch (otl_exception& e)
{
if (e.code != 1)
{
printf("写数据库失败code= %dmsg= %sSql= %s\n", e.code, e.msg, sqlstm);
OTLConnect();
}
return e.code;
}
return 0;
}
void WebSocketThread::run()
{
//if (g_node_id != THREE_SECS_DATA_BASE_NODE_ID)
// return;
printf("WebSocketThread::run() is called ...... \n");
struct sockaddr_in client_sockaddr;
memset(&client_sockaddr, 0, sizeof(client_sockaddr));
socklen_t address_len = 0;
while (1) {
address_len = sizeof(struct sockaddr_in);
int client_socket = accept(server_socket, (struct sockaddr*)&client_sockaddr, &address_len);
if (client_socket == -1)
{
printf("accept client %s:%d failed,error msg=%s\n\a", inet_ntoa(client_sockaddr.sin_addr), htons(client_sockaddr.sin_port), strerror(errno));
continue;
}
printf("\naccept client %s:%d succesaddress_len= %dclient_socket= %d\n", inet_ntoa(client_sockaddr.sin_addr), htons(client_sockaddr.sin_port), address_len, client_socket);
char buffer[256];
int iRet = 0;
while (1) {
memset(buffer, 0, sizeof(buffer));
int recvLength = recv(client_socket, buffer, sizeof(buffer), 0);
if (recvLength > 0)
{
iRet = HandleReceiveMessage(client_socket, buffer);
//if (0 != iRet)
// iRet = SendMessageToWeb(client_socket, iRet);
break;
}
else
{
if (errno == EINTR)
continue;
printf("end socket client %d(%s:%d) msg,disconnetc Socket client\n", client_socket, inet_ntoa(client_sockaddr.sin_addr), htons(client_sockaddr.sin_port));
break;
}
}
close(client_socket);
printf("close socket client %d(%s:%d) \n", client_socket, inet_ntoa(client_sockaddr.sin_addr), htons(client_sockaddr.sin_port));
msleep(1);
}
close(server_socket);
return;
}
string MatchErrorMessage(int errorCode) //根据错误码匹配错误消息
{
string strErrorMessage = "";
switch (errorCode)
{
case 0:
strErrorMessage = "success"; //"成功"
break;
default:
strErrorMessage = "error"; //"错误";
break;
//case 10002:
// strErrorMessage = "Incorrect message length structure"; //"报文长度结构错误";
// break;
//case 10003:
// strErrorMessage = "JSON string parsing error"; //"JSON字符串解析出错";
// break;
//case 10004:
// strErrorMessage = "Socket handling error"; //"socket处理出现异常";
// break;
//case 10005:
// strErrorMessage = "The device corresponding to ID was not found"; //"ID对应的装置未找到";
// break;
//case 10006:
// strErrorMessage = "The monitoring point corresponding to ID has not been found"; //"ID对应的监测点未找到";
// break;
//case 10007:
// strErrorMessage = "Wrong parameter passed in"; //"传入的参数异常";
// break;
//case 10008:
// strErrorMessage = "The same type of operation is being performed"; //"有同一类型的操作正在执行";
// break;
//case 10009:
// strErrorMessage = "The device turned off the corresponding function"; //"装置关闭了对应功能";
// break;
//case 10010:
// strErrorMessage = "The TYPE parameter passed in is exceptional"; //"传入的TYPE参数异常";
// break;
//default:
// strErrorMessage = "An unknown error"; //"未知错误";
// break;
}
return strErrorMessage;
}
int SendMessageToWeb(int socketClient, int iErrorCode) //向Web Socket客户端发送消息
{
string strSendJson = "";
char cTemp[8];
string strErrorCode = "";
sprintf(cTemp, "%06d", iErrorCode);
strErrorCode = cTemp;
char sendBuffer[256];
int sendLength = 0;
string strErrorMessage = MatchErrorMessage(iErrorCode);
//if (2 == Log_Enable)
// printf("错误码:%d匹配到的消息%s\n", iErrorCode, strErrorMessage.c_str());
strSendJson = "{\"errors\":\"" + strErrorMessage + "\",\"status\":\"" + strErrorCode + "\"}";
strcpy(sendBuffer, strSendJson.c_str());
sendLength = send(socketClient, strSendJson.c_str(), strSendJson.length() + 1, 0);
if (-1 == sendLength)
{
printf("服务端向客户端%d发送[%d]消息错误,错误消息:%s\n", socketClient, iErrorCode, strSendJson.c_str());
return -1;
}
//if (1 == Log_Enable)
// printf("服务端向客户端%d发送[%d]消息:%s\n", socketClient, iErrorCode, sendBuffer);
return sendLength;
}
int ExecuteWebCommand(LD_info_t* LD_info, int iType) //执行Web Socket命令消息
{
try
{
//if (1 == Log_Enable)
// printf(">>>线路%d\"%s\"iType= %dreal_data= %ssoe_data= %slimit= %dcount= %d\n", LD_info->line_id, LD_info->name,
// iType, 0 == LD_info->real_data ? "False" : "True", 0 == LD_info->soe_data ? "False" : "True", 20, LD_info->count);
if (0 == iType || 1 == iType)
{
LD_info->count = 0;
if (0 == iType)
{
LD_info->real_data = 1;
LD_info->soe_data = 1;
//if (1 == Log_Enable)
// printf(">>>触发%d\"%s\"iType= %dreal_data= %ssoe_data= %slimit= %dcount= %d\n", LD_info->line_id, LD_info->name,
// iType, 0 == LD_info->real_data ? "False" : "True", 0 == LD_info->soe_data ? "False" : "True", 20, LD_info->count);
}
else
{
//LD_info->heart_beat = 1;
//if (1 == Log_Enable)
// printf(">>>持续%d\"%s\"iType= %dreal_data= %ssoe_data= %slimit= %dcount= %d\n", LD_info->line_id, LD_info->name,
// iType, 0 == LD_info->real_data ? "False" : "True", 0 == LD_info->soe_data ? "False" : "True", 20, LD_info->count);
}
}
if (2 == iType)
{
LD_info->real_data = 0;
LD_info->soe_data = 0;
//if (1 == Log_Enable)
// printf(">>>停止%d\"%s\"iType= %dreal_data= %ssoe_data= %slimit= %dcount= %d\n", LD_info->line_id, LD_info->name,
// iType, 0 == LD_info->real_data ? "False" : "True", 0 == LD_info->soe_data ? "False" : "True", 20, LD_info->count);
}
}
catch (exception& e)
{
printf("触发/停止线路%d\"%s\"失败,原因:%s\n", LD_info->line_id, LD_info->name, e.what());
return 10004;
}
return 10000;
}
void Get_Recall_Time_Char(char* start_time, char* end_time, QList<RecallInfo>& recallinfo_list_hour) //数据完整性补招判断
{
QDateTime start_dt = QDateTime::fromString(start_time, "yyyy-MM-dd HH:mm:ss");
QDateTime end_dt = QDateTime::fromString(end_time, "yyyy-MM-dd HH:mm:ss");
long long starttime = start_dt.toMSecsSinceEpoch() / 1000; //补招起始时间
long long endtime = end_dt.toMSecsSinceEpoch() / 1000; //补招结束时间
QList<long long> timestamp_list; //数据库完整性记录时间点
QList<RecallInfo> recallinfo_list; //待补招队列
//QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
RecallInfo info;
info.starttime = starttime;
info.endtime = endtime;
recallinfo_list.append(info);
for (int i = 0; i < recallinfo_list.size(); i++)
{
//printf("\n %lld ----- %11d\n", recallinfo_list[i].starttime, recallinfo_list[i].endtime);
long long duration = recallinfo_list[i].endtime - recallinfo_list[i].starttime;
long long max_interval = 3600;
for (long long j = 0; j <= duration; j += max_interval)
{
if (j + max_interval > duration) {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].endtime;
RecallInfo info;
info.starttime = start;
info.endtime = end;
recallinfo_list_hour.append(info);
}
else {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].starttime + j + max_interval;
RecallInfo info;
info.starttime = start;
info.endtime = end - 1;
recallinfo_list_hour.append(info);
}
}
}
}
int HandleReceiveMessage(int socketClient, char buffer[256]) //接收并处理Web Socket客户端发来的信息
{
int iErrorCode = 000000;
try
{
QString qstrBuffer = QString(QLatin1String(buffer));
printf("来自ffe客户端%d消息qstrBur= %s\n", socketClient, qstrBuffer.toAscii().data());
cJSON* json_root = cJSON_Parse(qstrBuffer.toUtf8().constData()); //json格式序列化
if (json_root == NULL) {
return 10000;
}
QString qstrCode = NULL;//记录指令
cJSON* json_code = NULL;
cJSON* json_param = NULL;
cJSON* json_program_param = NULL;
cJSON* json_recall_param = NULL;
cJSON* json_wave_param = NULL;
cJSON* json_update_time = NULL;
cJSON* json_node = NULL;
QString update_time;
QList<QString> wave_param;
ProgramParam program_param;
json_code = cJSON_GetObjectItem(json_root, "code"); //获取code
if (json_code != NULL) {
qstrCode = json_code->valuestring;
}
else {
return 10000;
}
json_param = cJSON_GetObjectItem(json_root, "param"); //获取param
if (json_param == NULL) {
return 10000;
}
if (qstrCode == "dev_update" || qstrCode == "model_update" || qstrCode == "program_update") {
//设备更新记录更新时间
json_update_time = cJSON_GetObjectItem(json_param, "update_time"); //获取update_time
if (json_update_time != NULL) {
update_time = json_update_time->valuestring;
}
}
else if (qstrCode == "manual_wave") {
//手动录波:功能未完成
json_wave_param = cJSON_GetObjectItem(json_param, "wave_param"); //获取wave_param
int array_size = cJSON_GetArraySize(json_wave_param); //获取数组大小
int i;
for (i = 0; i < array_size; i++)
{
json_node = cJSON_GetArrayItem(json_wave_param, i);//array
if (json_node != NULL) {
wave_param.append(json_node->valuestring);
}
}
}
else if (qstrCode == "model_update") {
//程序参数:终端列表和程序文件
json_program_param = cJSON_GetObjectItem(json_param, "program_param"); //获取program_param
cJSON* json_temp = NULL;
json_temp = cJSON_GetObjectItem(json_program_param, "terminal_list"); //获取
int array_size = cJSON_GetArraySize(json_temp); //获取数组大小
int i;
for (i = 0; i < array_size; i++)
{
json_node = cJSON_GetArrayItem(json_temp, i);//array
if (json_node != NULL) {
program_param.terminal_list.append(json_node->valuestring);
}
}
json_node = cJSON_GetObjectItem(json_program_param, "file_name"); //获取file_name
if (json_node != NULL) {
program_param.file_name = json_node->valuestring;
}
}
else if (qstrCode == "manual_recall") {//手动补招的指令
//补招参数
json_recall_param = cJSON_GetObjectItem(json_param, "recall_param"); //获取recall_param
cJSON* json_temp = NULL;
int array_size = cJSON_GetArraySize(json_recall_param); //获取数组大小
int i;
QList<RecallInfo> recallinfo_list_hour;
char start_time[64];
char end_time[64];
QString mp_id;
for (i = 0; i < array_size; i++)
{
json_temp = cJSON_GetArrayItem(json_recall_param, i);//array
if (json_temp != NULL) {
json_node = cJSON_GetObjectItem(json_temp, "mp_id"); //获取mp_id
if (json_node != NULL) {
mp_id = QString::fromUtf8(json_node->valuestring);
}
if (i == 0) {
json_node = cJSON_GetObjectItem(json_temp, "start"); //获取start
if (json_node != NULL) {
apr_snprintf(start_time, sizeof(start_time), "%s", json_node->valuestring);//start_time
}
json_node = cJSON_GetObjectItem(json_temp, "end"); //获取end
if (json_node != NULL) {
apr_snprintf(end_time, sizeof(end_time), "%s", json_node->valuestring);//end_time
}
Get_Recall_Time_Char(start_time, end_time, recallinfo_list_hour);
}
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
CJournalRecall jr;
jr.MonitorID = mp_id;
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);//默认都是11的十进制转化
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
}
cJSON_Delete(json_root);
SendMessageToWeb(socketClient, 000000);//响应web
}
catch (exception& e)
{
printf("处理客户端:%d发送的消息错误原因%s\n", socketClient, e.what());
return 10004;
}
return 000000;
}
//// 判断时间差是否超过十分钟
//bool IsTimeDifferenceGreaterThanTenMinutes(apr_time_t time1, apr_time_t time2) {
// // 计算时间差
// apr_int64_t timeDiff = apr_time_diff(time1, time2);
//
// // 转换为分钟
// apr_int64_t minutes = apr_time_sec(timeDiff) / 60;
//
// // 判断时间差是否大于十分钟
// return (minutes > 10);
//}
void Get_Recall_Time(char* time, QList<RecallInfo>& recallinfo_list_hour);
void Cout_account_information() {
ied_t* ied = NULL;
int iedno;
LD_info_t* LD_info = NULL;
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
ied = g_node->clients[iedno];
if (ied) {
LD_info_t* LD_info = NULL;
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);
int cpuno;
QString text;//待组装的pgsql语句
text.append(QString("terminal_code: \"%1\" ,ip:\"%2\" ,port:\"%3\" ,cpucount:\"%4\" ").arg(ied_usr->terminal_code).arg(ied->channel[0].addr_str).arg(ied->channel[0].port).arg(ied->cpucount));
add_comm_log(const_cast<char*>(text.toLocal8Bit().constData()));
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
LD_info = &(ied_usr->LD_info[cpuno]);
QString text2;//待组装的pgsql语句
text2.append(QString("mp_id: \"%1\" terminal_code:\"%2\" ").arg(LD_info->mp_id).arg(LD_info->terminal_code));
add_comm_log(const_cast<char*>(text2.toLocal8Bit().constData()));
}
}
}
}
//将时间戳转qstring
QString timestampToYYYYMMDD(long long timestamp) {
// 将long long时间戳转换为QDateTime
QDateTime dateTime = QDateTime::fromMSecsSinceEpoch(timestamp * 1000);
// 提取日期部分并格式化为YYYYMMDD
// 格式化QDateTime对象为QString精确到小时
QString formattedDateTime = dateTime.toString("yyyyMMddHH");
return formattedDateTime;
}
bool containsDash(const char* str, size_t len) {
for (size_t i = 0; i < len; ++i) {
if (str[i] == '-') {
return true; // 找到'-'字符返回true
}
}
return false; // 没有找到'-'字符返回false
}
bool CheckPG_To_Recall(long long start, long long end, char* Monitorid)
{
QDateTime deltime_Qtime = QDateTime::fromTime_t(start);
QDateTime deltime_Qtime_end = QDateTime::fromTime_t(end);
QString tmp_chr1 = deltime_Qtime.toString("yyyy-MM-dd"); //当前天
QString start_chr1 = deltime_Qtime.toString("yyyy-MM-dd hh:mm:ss"); //当前天
QString end_chr1 = deltime_Qtime_end.toString("yyyy-MM-dd hh:mm:ss"); //当前天
int timespan = 3;//默认时间间隔
try {
int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
//printf("\nPostgreSL 1 %s \n", POSTGRES_SCHEMA);
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "select \"exp_num\",\"act_num\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(tmp_chr1.toAscii().data());
str1.append("' AND \"monitor_id\" = '");
str1.append(Monitorid);
str1.append("'");
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
double exp_num;
double act_num;
while (!i.eof()) { //while not end-of-data
i >> exp_num >> act_num;
timespan = 1440 / exp_num;
printf("\n %f %f %d \n", exp_num, act_num, timespan);
}
//OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
try {
long long starttime = start; //补招起始时间
long long endtime = starttime + 3599; //补招结束时间
QList<long long> timestamp_list; //数据库完整性记录时间点
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
/*OTLConnect();*/
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "SELECT unnest(value_time) AS timestamp_value FROM \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(tmp_chr1.toAscii().data());
str1.append("' AND \"monitor_id\" = '");
str1.append(Monitorid);
str1.append("' ORDER BY timestamp_value");
std::string str4 = "select b1.timestamp_value from (";
str4.append(str1);
str4.append(") b1 where b1.timestamp_value >= '");
str4.append(start_chr1.toAscii().data());
str4.append("' and b1.timestamp_value <= '");
str4.append(end_chr1.toAscii().data());
str4.append("'");
otl_stream i(1, // buffer size
str4.c_str(),
//SELECT statement
db //connect object
);
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> timestamp;
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t timestamp = std::mktime(&timeinfo);
long long stamp = static_cast<long long>(timestamp);
timestamp_list.append(stamp);
}
//OTLDisconnect();
if (timestamp_list.size() <= (60 / timespan) * 0.97) //完整性数据表无数据
{
printf("\n return ture %d %f\n", timestamp_list.size(), (60 / timespan) * 0.97);
return true;
}
else
{
printf("\n return false %d %f\n", timestamp_list.size(), (60 / timespan) * 0.97);
return false;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
printf("\n>>>error quit!!\n");
return true;
}
//2024-10-21 lnk定时任务替换web接口
#if 0
void OnTimerThread::run()
{
msleep(10000);
printf("OnTimerThread::run() is called ...... \n");
static int delectflag = 1;//定时日志清理标记
bool account_update = true;
bool asd = true;
apr_time_t previousTime = apr_time_now();//
apr_time_exp_t localTime;
apr_time_exp_gmt(&localTime, previousTime);
cout << "Local Time: "
<< localTime.tm_year + 1900 << "-" << localTime.tm_mon + 1 << "-" << localTime.tm_mday << " "
<< localTime.tm_hour << ":" << localTime.tm_min << ":" << localTime.tm_sec
<< endl;
QMap<QString, bool> dic_task_block;
// 向QMap中添加键值对
dic_task_block.insert("account", false);
dic_task_block.insert("recruit ", false);
dic_task_block.insert("log", false);
dic_task_block.insert("multi_node", false);
int ip_count = 0;
int telnet_count = 0;
// 查找键值对
if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {
init_ping_telnet(ip_count, telnet_count);
Cout_account_information();
}
if (g_onlyIP[0] != 0)
{
printf("g_onlyIP[0]=!0 ontimer--%s--\n", g_onlyIP);
add_comm_log(const_cast<char*>("g_onlyIP[0]=!0,g_onlyIP is --%s--", g_onlyIP));
}
else {
printf("g_onlyIP[0] == 0!");
}
int pgflag = 0;
int pgmin = 0;
int mp_num_hour = 0;
int recall_flag1 = 1;
//char recalllllll[256] = "0923000982";
//CheckPG_To_Recall(1705168800, 1705168800 + 3599, recalllllll);
while (1)
{
/*cout << "ip_count:" << ip_count << " telnet_count:" << telnet_count << endl;
msleep(1000);*/
//进入线程时间
previousTime = apr_time_now();
apr_time_exp_gmt(&localTime, previousTime);
//apr_time_t elapsedTime = currentTime - previousTime;
//apr_time_as_msec(elapsedTime);
//cout << "front num:" << FRONT_MP_NUM << endl;
if (strcmp(subdir, "cfg_stat_data") == 0 || strcmp(subdir, "cfg_newhis_data") == 0) {//台账更新,多节点,通讯
//读取上次台账更新时间
//判断间隔执行
if (false) {
//执行台账任务;
}
//记录现在时间
//
//判断执行此任务时间段内是否有 任务被堵塞
if (MULTIPLE_NODE_FLAG && pgflag) {
if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
QString updateFrontSql;//待组装的pgsql语句
updateFrontSql.append(QString("update \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("set \"mp_num\"= %1,front_version='%2' ").arg(FRONT_MP_NUM).arg(PROGRAM_VERSION));
updateFrontSql.append(QString("where \"front_ip\" = '%1' and \"front_inst\"=%2;").arg(FRONT_IP).arg(FRONT_INST));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁
}
pgflag = 0;
}
else if (MULTIPLE_NODE_FLAG && pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
if (mp_num_hour != localTime.tm_hour) {
std::string mp_num_str = "";
mp_num_str.append("connected device count:");
mp_num_str.append(QString::number(FRONT_MP_NUM).toStdString());
mp_num_str.append(",g_node clients:");
mp_num_str.append(QString::number(g_node->n_clients).toStdString());
add_comm_log(const_cast<char*>(mp_num_str.c_str()));
mp_num_hour = localTime.tm_hour;
}
//2023-10-17 zw新增 定期obs oss和sql数据库记录删除
if (delectflag == 1 && localTime.tm_hour == 16)
{
delectflag = 0;
//time_t timestamp = apr_time_as_time_t(previousTime);
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
if (FILE_FLAG == 1) //阿里云 oss 文件删除
{
//PutOSS("comtrade/not def/20231111/temp2.log", "/FeProject/dat/9D3AAA2BDCE430BA7E3E1302F132B880.xml");
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
long long deltime = stamp - (60 * 60 * 24 * 30);//减去30天
QDateTime deltime_Qtime = QDateTime::fromTime_t(deltime);
QString tmp_chr1 = deltime_Qtime.toString("yyyyMMdd");
QString Oss_Del_Path = NULL;
Oss_Del_Path.append("comtrade/");
Oss_Del_Path.append(LD_info->mp_id).append("/");
Oss_Del_Path.append(tmp_chr1).append("/");
//cout << Oss_Del_Path.toAscii().data() << endl;
DelOSS(Oss_Del_Path.toAscii().data());
cpuno++;
}
i++;
}
//PutOSS("comtrade/not def/20231111/temp.log","/FeProject/dat/6A5C8A2A7BBC1A61D9EC3F1AE2A25A03.xml");
//PutOSS("comtrade/not def/20231111/temp2.log", "/FeProject/dat/6A5C8A2A7BBC1A61D9EC3F1AE2A25A03.xml");
//PutOSS("comtrade/not def/20231111/temp3.log", "/FeProject/dat/6A5C8A2A7BBC1A61D9EC3F1AE2A25A03.xml");
//DelOSS("comtrade/not def/20231111/temp3.log");
}
else if (FILE_FLAG == 2)//华为云 obs 文件删除
{
//OBSFile("/FeProject/dat/67BC249C13B5EC819CF4DF0307DB71C5.xml", "comtrade/not def/20231111/temp3.log", "putObject");
//OBSFile_del("comtrade/not def/20231111/temp3.log", "deleteObject");
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
long long deltime = stamp - (60 * 60 * 24 * 30);//减去30天
QDateTime deltime_Qtime = QDateTime::fromTime_t(deltime);
QString tmp_chr1 = deltime_Qtime.toString("yyyyMMdd");
QString Oss_Del_Path = NULL;
Oss_Del_Path.append("comtrade/");
Oss_Del_Path.append(LD_info->mp_id).append("/");
Oss_Del_Path.append(tmp_chr1).append("/");
//cout << Oss_Del_Path.toAscii().data() << endl;
OBSFile_del(Oss_Del_Path.toAscii().data(), "deleteObject");
cpuno++;
}
i++;
}
}
//pgsql删除记录
long long deltime = stamp - (60 * 60 * 24 * 30);//减去30天
QDateTime deltime_Qtime = QDateTime::fromTime_t(deltime);
QString tmp_chr1 = deltime_Qtime.toString("yyyy-MM-dd");
QString pgsql0;
pgsql0.append(QString("DELETE FROM \"%1\".\"%2meas_pq_comm_status_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql1;
pgsql1.append(QString("DELETE FROM \"%1\".\"%2meas_pq_comm_error_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql2;
pgsql2.append(QString("DELETE FROM \"%1\".\"%2meas_pq_measpoint_rationality_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql3;
pgsql3.append(QString("DELETE FROM \"%1\".\"%2meas_pq_measpoint_intact_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql4;
pgsql4.append(QString("DELETE FROM \"%1\".\"%2meas_pq_measpoint_match_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(pgsql0);
Sql_data_list.append(pgsql1);
Sql_data_list.append(pgsql2);
Sql_data_list.append(pgsql3);
Sql_data_list.append(pgsql4);
Sql_data_list_mutex.unlock(); //解锁
}
if (delectflag == 0 && localTime.tm_hour != 16)
{
delectflag = 1;
}
//2023-10-17 zw新增 定期obs oss和sql数据库记录删除 end
}
if (strcmp(subdir, "cfg_newhis_data") == 0) {//上海定时招装置日志
static int hour_time = 0;
if (localTime.tm_hour != hour_time) {
hour_time = localTime.tm_hour;
printf(">>>cfg_newhis_data is run!!!\n");
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
long long start = stamp - (stamp % 3600) - 3600 - 3600;//开始时间 当前整点值往前推两小时
long long end = start + 3599;//结束时间
QList<RecallInfo> recallinfo_list_hour;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end;
recallinfo_list_hour.append(info);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED) {
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
if (LD_info->logcount <= 0 || LD_info->read_flag == 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
i++;
}
}
}
if (strcmp(subdir, "cfg_recallall_data") == 0)
{
static int recall_xml_time = 0;
if (localTime.tm_min != recall_xml_time)
{
recall_xml_time = localTime.tm_min;
//补招开始与截止时间
static long long recall_start_time = 0;
static long long recall_end_time = 0;
static int flag = 0;
if (recall_start_time == 0 && recall_end_time == 0) {//无缓存数据
//查询一条 -1状态(代补招)的记录
char front_ip[42];
cout << "start select:" << endl;
QString selectFrontSql;
selectFrontSql.append(QString("select \"front_ip\" from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where front_inst=%1 and \"front_status\" = '-1' LIMIT 1;").arg(g_front_seg_index));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
otl_stream i(1, // buffer size
selectFrontSql.toStdString().c_str(),
db //connect object
);
//create select stream
while (!i.eof()) { //while not end-of-data
i >> front_ip;
break;
//cout << "count=" << f2 << endl;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
continue;
}
if (containsDash(front_ip, 21)) {
//插入更新记录
QString insertFrontSql;
insertFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
insertFrontSql.append(QString("values('%1',10000,%2,'03','-1','%3',200) ").arg(front_ip).arg(g_front_seg_index).arg(PROGRAM_VERSION));
insertFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
insertFrontSql.append(QString("\"front_status\"= '%1'").arg("-2"));
cout << insertFrontSql.toStdString().c_str() << endl;
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(insertFrontSql);
Sql_data_list_mutex.unlock(); //解锁
//缓存数据
cout << "front_ip=" << front_ip << endl;
QString startDate, endDate;
// 分割字符串
startDate = QString::fromAscii(front_ip).left(10); // 取前10个字符作为开始日期
qDebug() << "startDate=" << startDate << endl;
endDate = QString::fromAscii(front_ip + 11).left(10); // 从第10个字符开始取8个字符作为结束日期
qDebug() << "endDate=" << endDate << endl;
QDateTime start_dt = QDateTime::fromString(startDate, "yyyyMMddHH");
qDebug() << "start_dt=" << start_dt << endl;
recall_start_time = start_dt.toMSecsSinceEpoch() / 1000;
qDebug() << "recall_start_time=" << recall_start_time << endl;
QDateTime end_dt = QDateTime::fromString(endDate, "yyyyMMddHH");
qDebug() << "end_dt=" << end_dt << endl;
recall_end_time = end_dt.toMSecsSinceEpoch() / 1000;
qDebug() << "recall_end_time=" << recall_end_time << endl;
}
flag = 0;
}
else if (recall_start_time != 0 && recall_end_time != 0) {//有缓存数据
// 将时间戳转换为YYYYMMDD格式
QString date1 = timestampToYYYYMMDD(recall_start_time);
QString date2 = timestampToYYYYMMDD(recall_end_time);
// 拼接两个日期,并用'-'分隔
QString dateRange = date1 + "-" + date2;
qDebug() << "dateRange=" << dateRange << endl;
char front_status[4];
QString selectFrontSql;
selectFrontSql.append(QString("select front_status from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where front_inst=%1 and \"front_ip\" = '%2'").arg(g_front_seg_index).arg(dateRange));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
otl_stream i(1, // buffer size
selectFrontSql.toStdString().c_str(),
db //connect object
);
//create select stream
while (!i.eof()) { //while not end-of-data
i >> front_status;
break;
//cout << "count=" << f2 << endl;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
continue;
}
qDebug() << "front_status=" << front_status << endl;
//再次判断是否为执行中状态
if (strcmp(front_status, "-1") == 0) {
//状态为-1 重新插入更新记录
QString updateFrontSql;
updateFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("values('%1',10000,%2,'03','-1','%3',200) ").arg(dateRange).arg(g_front_seg_index).arg(PROGRAM_VERSION));
updateFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
updateFrontSql.append(QString("\"front_status\"= '%1'").arg("-2"));
cout << updateFrontSql.toStdString().c_str() << endl;
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁
flag = 0;
}
else if (strcmp(front_status, "-2") == 0)
{//状态为-2 补招
flag = 1;
}
else {
flag = 0;
recall_end_time = 0;
recall_start_time = 0;
}
}
if (recall_start_time != 0 && recall_end_time != 0 && flag == 1)
{
qDebug() << "start recall time=" << recall_start_time << endl;
qDebug() << "end recall time=" << recall_end_time << endl;
long long starttime = recall_start_time; //补招起始时间
long long endtime = recall_end_time; //补招结束时间
flag = 0;
recall_start_time = 0;
recall_end_time = 0;
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
RecallInfo info;
info.starttime = starttime;
info.endtime = endtime;
recallinfo_list.append(info);
for (int i = 0; i < recallinfo_list.size(); i++)
{
//printf("\n %lld ----- %11d\n", recallinfo_list[i].starttime, recallinfo_list[i].endtime);
long long duration = recallinfo_list[i].endtime - recallinfo_list[i].starttime;
long long max_interval = 3600;
for (long long j = 0; j <= duration; j += max_interval)
{
if (j + max_interval > duration) {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].endtime;
RecallInfo info;
info.starttime = start;
info.endtime = end;
recallinfo_list_hour.append(info);
}
else {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].starttime + j + max_interval;
RecallInfo info;
info.starttime = start;
info.endtime = end - 1;
recallinfo_list_hour.append(info);
}
}
}
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED)
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
printf("/home/pq mpid=%s %d\n", LD_info->mp_id, LD_info->read_flag);
if (LD_info->logcount <= 0 || LD_info->read_flag == 0) {
continue;
}
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
g_StatisticLackList_list_mutex.lock();
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
//替换成web接口 2024-10-21 lnk
// if (CheckPG_To_Recall(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
// printf("CheckPG_To_Recall == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
if (CheckPG_To_Recall_web(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
printf("CheckPG_To_Recall_web == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
continue;
}
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList.push_back(jr);
}
g_StatisticLackList_list_mutex.unlock();
}
}
i++;
}
}
}
}
if (strcmp(subdir, "cfg_his_data") == 0)
{
if (pgflag) {
if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
QString updateFrontSql;
updateFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("values('his',10000,1,'02','01','%1',200) ").arg(PROGRAM_VERSION));
updateFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
updateFrontSql.append(QString("\"mp_num\"= '%1',front_version='%2'").arg(FRONT_MP_NUM).arg(PROGRAM_VERSION));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁
}
pgflag = 0;
}
else if (pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
static int cfg_his_data_hour_time = 0;
if (localTime.tm_hour != cfg_his_data_hour_time) {
cfg_his_data_hour_time = localTime.tm_hour;
printf(">>>cfg_his_data is run!!!\n");
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
long long start = stamp - (stamp % 3600) - 3600 - 3600;//开始时间 当前整点值往前推两小时
long long end = start + 3599;//结束时间
QList<RecallInfo> recallinfo_list_hour;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end;
recallinfo_list_hour.append(info);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED) {
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
if (LD_info->logcount <= 0 || LD_info->read_flag == 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
//替换成web接口 2024-10-21 lnk
//if (CheckPG_To_Recall(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
//printf("CheckPG_To_Recall == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
if (CheckPG_To_Recall_web(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
printf("CheckPG_To_Recall_web == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
continue;
}
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
i++;
}
}
}
if (strcmp(subdir, "cfg_recallhis_data") == 0)
{
if (pgflag) {
if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
QString updateFrontSql;
updateFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("values('recallhis',10000,1,'02','01','%1',200) ").arg(PROGRAM_VERSION));
updateFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
updateFrontSql.append(QString("\"mp_num\"= '%1',front_version='%2'").arg(FRONT_MP_NUM).arg(PROGRAM_VERSION));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁
}
pgflag = 0;
}
else if (pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
}
//g_node_id == HIS_DATA_BASE_NODE_ID &&
//printf("/home/pq hour=%d\n", localTime.tm_hour);
if (0 && g_node_id == HIS_DATA_BASE_NODE_ID && (localTime.tm_hour <= 12 || localTime.tm_hour >= 20) && recall_flag1 == 1) {
recall_flag1 = 0;
QString MyKafkaIniFilename = QString("../etc/") + QString("mykafka.ini"); //+QString::fromAscii(subdir)
QSettings settings(MyKafkaIniFilename, QSettings::IniFormat);
QString dateString = settings.value("Recall/select_day").toString();
QList<RecallInfo> recallinfo_list_hour;
QByteArray byteArray = dateString.toUtf8(); // 使用 UTF-8 编码
char* charArray = byteArray.data();
Get_Recall_Time(charArray, recallinfo_list_hour);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
if (LD_info->logcount <= 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
if (LD_info->autorecallcount != 0) {
for (int j = 0; j < LD_info->autorecallcount; j++) {
delete LD_info->autorecall[j];
}
delete LD_info->autorecall;
LD_info->autorecallcount = 0;
}
LD_info->autorecallflag = 0;
LD_info->autorecallcount = recallinfo_list_hour.size();
LD_info->autorecall = new autorecall_t * [recallinfo_list_hour.size()];
printf("/home/pq recall mpid=%s\n", LD_info->mp_id);
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
printf("\n %lld ===== %11d\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime);
LD_info->autorecall[j] = new autorecall_t[1];
LD_info->autorecall[j]->start = recallinfo_list_hour[j].starttime;
LD_info->autorecall[j]->end = recallinfo_list_hour[j].endtime;
}
}
cpuno++;
}
i++;
}
QDate date = QDate::fromString(dateString, "yyyy-MM-dd");
date.addDays(-1); // 一天
settings.setValue("Recall/select_day", date.toString("yyyy-MM-dd")); // 重新写入日期字符串
}
if (localTime.tm_hour > 12 && localTime.tm_hour < 20 && recall_flag1 == 0) {
recall_flag1 = 1;
}
msleep(1000);
}
printf(">>>OnTimerThread::run() is end!!!\n");
}
#endif
//不使用的代码lnk20241206
#if 0
/////////////////////////////////////////CZY 2023-09-04
/// <summary>
/// 拼接请求入参json
/// </summary>
/// <param name="json_roots"></param>
/// <param name="json_root"></param>
/// <param name="json_params"></param>
/// <param name="json_filters"></param>
/// <param name="perpage"></param>
/// <param name="page"></param>
/// <param name="flag">是否删选青浦地市</param>
void AppendCJson(cJSON* json_roots, cJSON* json_root, cJSON* json_params, cJSON* json_filters, int perpage, int page, int flag) {
//[]层
//cJSON_AddItemToArray(json_roots, json_root);
//第一层
cJSON_AddItemToObject(json_root, "distribution", cJSON_CreateString("1"));
cJSON_AddItemToObject(json_root, "id", cJSON_CreateString(""));
cJSON_AddItemToObject(json_root, "modelId", cJSON_CreateString(""));
cJSON_AddItemToObject(json_root, "params", json_params);
cJSON_AddItemToObject(json_root, "psrType", cJSON_CreateString("0751002"));
//params层
cJSON_AddItemToObject(json_params, "current", cJSON_CreateNumber(1));
cJSON_AddItemToObject(json_params, "fields", cJSON_CreateString("astId"));
cJSON_AddItemToObject(json_params, "filters", json_filters);
cJSON_AddItemToObject(json_params, "orderBy", cJSON_CreateString("astId desc"));
cJSON_AddItemToObject(json_params, "page", cJSON_CreateNumber(page));
cJSON_AddItemToObject(json_params, "perpage", cJSON_CreateNumber(perpage));
cJSON_AddItemToObject(json_params, "size", cJSON_CreateNumber(1));
//filters数组层
cJSON* json_filter = cJSON_CreateObject();
cJSON_AddItemToArray(json_filters, json_filter);
//filter层
cJSON_AddItemToObject(json_filter, "compare", cJSON_CreateString("="));
cJSON_AddItemToObject(json_filter, "fieldName", cJSON_CreateString("deployState"));
cJSON_AddItemToObject(json_filter, "fieldValue", cJSON_CreateString("20"));
if (g_onlyIP[0] != 0) {//单连
//filters数组层
cJSON* json_filter_ip = cJSON_CreateObject();
cJSON_AddItemToArray(json_filters, json_filter_ip);
//json_filter_ip层
cJSON_AddItemToObject(json_filter_ip, "compare", cJSON_CreateString("="));
cJSON_AddItemToObject(json_filter_ip, "fieldName", cJSON_CreateString("ipAddress"));
cJSON_AddItemToObject(json_filter_ip, "fieldValue", cJSON_CreateString(g_onlyIP));
}
if (flag == 1)
{
//filters数组层
cJSON* json_filter_city = cJSON_CreateObject();
cJSON_AddItemToArray(json_filters, json_filter_city);
//json_filter_city层
cJSON_AddItemToObject(json_filter_city, "compare", cJSON_CreateString("="));
cJSON_AddItemToObject(json_filter_city, "fieldName", cJSON_CreateString("city"));
cJSON_AddItemToObject(json_filter_city, "fieldValue", cJSON_CreateString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFSP09"));
}
else if (flag == 2) {
//json_filter_city数组层
cJSON* json_filter_city = cJSON_CreateObject();
cJSON_AddItemToArray(json_filters, json_filter_city);
//json_filter_city层
cJSON_AddItemToObject(json_filter_city, "compare", cJSON_CreateString("!="));
cJSON_AddItemToObject(json_filter_city, "fieldName", cJSON_CreateString("city"));
cJSON_AddItemToObject(json_filter_city, "fieldValue", cJSON_CreateString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFSP09"));
}
}
void GetCJson(const char* ptr) {
//cout << ">>>GetDevice in reply" << (char*)ptr;
strDevCJson = "";
cJSON* json = cJSON_Parse((char*)ptr); //json格式序列化
cJSON* json_node;
if (json == NULL) {
printf("cJSON pares error %s\n", cJSON_GetErrorPtr());
}
else {
json_node = cJSON_GetObjectItem(json, "status"); //获取result
if (json_node == NULL || json_node->valuestring == NULL || json_node->valuestring == "/0" || json_node->valuestring == "" || strcmp(json_node->valuestring, "000000") != 0) {
printf("status error %s\n", cJSON_GetErrorPtr());
}
else {
cout << ">>>create strDevCJson success";
strDevCJson = QString::fromUtf8((char*)ptr);
}
}
cJSON_Delete(json);
}
//////////////////////////////////
////////////////////////////////////////////WW 2023-08-19 end
//////////////////////////////////////////
//WW 2023-08-26 增加webap调用 流程上先获取token然后用token调用API
//http://172.40.237.145:30010/psr-auth/oauth/accessToken
//鉴权信息:
//client_id : 2a78ecf0074111ed806c7a5cabbedfb4
// client_secret : 58nOklQlP0SGEuXbrd0wgcVO7HX7IODAgvzHiCm + mAgWSadcX0we2wffjyTUYGsK
// grant_type : credentials
//get请求和post请求数据响应函数
size_t req_reply(void* ptr, size_t size, size_t nmemb, void* stream)
{
//在注释的里面可以打印请求流cookie的信息
string* str = (string*)stream;
(*str).append((char*)ptr, size * nmemb);
return size * nmemb;
}
//get请求和post请求数据响应函数
void req_reply_token(const char* ptr)
{
//在注释的里面可以打印请求流cookie的信息
printf(">>>GetToken in reply %s\n", ptr);
cJSON* msg = cJSON_Parse(ptr);
if (msg == NULL)
{
printf("cJSON pares error %s\n", cJSON_GetErrorPtr());
}
else
{
cJSON* json_status = cJSON_GetObjectItem(msg, "status");
cJSON* json_error = cJSON_GetObjectItem(msg, "error");
if (json_error == NULL)
{
cJSON* json_result = cJSON_GetObjectItem(msg, "result");
cJSON* json_accesstoken = cJSON_GetObjectItem(msg, "access_token");
strToken = QString::fromAscii(json_accesstoken->valuestring);
}
cJSON_Delete(msg);
}
}
void GetToken(const string strUrl, const string strclientid, const string strclientsecret)//获取Token
{
// curl初始化
CURL* curl = curl_easy_init();
// curl返回值
CURLcode res;
if (curl)
{
// set params
//设置curl的请求头
struct curl_slist* header_list = NULL;
header_list = curl_slist_append(header_list, "Content-Type:application/x-www-form-urlencoded;");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
//不接收响应头数据0代表不接收 1代表接收
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
//设置请求为post请求
//curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_POST, 1);
//设置请求的URL地址
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
printf("token_url2: %s\n", strUrl.c_str());
//设置post请求的参数
char* pszEncodeAuth = curl_easy_escape(curl, strclientid.c_str(), strclientid.length());
char* pszEncodeSecret = curl_easy_escape(curl, strclientsecret.c_str(), strclientsecret.length());
string strTempBody;
strTempBody.append("client_id=");
strTempBody.append(pszEncodeAuth);
strTempBody.append("&");
strTempBody.append("client_secret=");
strTempBody.append(pszEncodeSecret);
strTempBody.append("&grant_type=");
strTempBody.append(GRANT_TYPE);
printf(">>>TestTokenPost in curl %s \n", strTempBody.c_str());
curl_free(pszEncodeAuth);
curl_free(pszEncodeSecret);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strTempBody.c_str());
//设置ssl验证
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
//CURLOPT_VERBOSE的值为1时会显示详细的调试信息
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
//设置数据接收和写入函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
string resPost0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&resPost0);
//curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)strBody.toAscii().data());
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
//设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
printf(">>>Token Post in curl post\n");
// 开启post请求
res = curl_easy_perform(curl);
// 检查请求是否成功
if (res != CURLE_OK) {
cout << "token curl_easy_perform() failed res code: " << res << endl;
}
else {
cout << ">>>token curl post success res code:" << res << endl;
req_reply_token(resPost0.c_str());
}
curl_slist_free_all(header_list);
}
else
{
printf(">>> token curl init failed");
}
curl_easy_cleanup(curl);
}
void GetDevice(const QString strUrl, const QString strxToken, int perpage, int page, int flag)
{
// curl初始化
CURL* curl = curl_easy_init();
// curl返回值
CURLcode res;
if (curl)
{
//QDateTime askTime = QDateTime::currentDateTime();
//long lTim = askTime.toMSecsSinceEpoch();
//printf(">>>TestDevicePost in curl %ld\n", lTim);
//QString xTime;
//xTime.append(QString("x-date:%l").arg(lTim));
printf(">>>token %s \n", strxToken.toAscii().data());
// set params
//设置curl的请求头
struct curl_slist* header_list = NULL;
header_list = curl_slist_append(header_list, "Content-Type:application/json;");
header_list = curl_slist_append(header_list, strxToken.toAscii().data());
//header_list = curl_slist_append(header_list, xTime.toAscii().data());
//header_list = curl_slist_append(header_list, "x-signature:1234");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
//不接收响应头数据0代表不接收 1代表接收
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
//设置请求为post请求
curl_easy_setopt(curl, CURLOPT_POST, 1);
//设置请求的URL地址
curl_easy_setopt(curl, CURLOPT_URL, strUrl.toAscii().data());
//设置post请求的参数
cJSON* json_roots = cJSON_CreateArray();
cJSON* json_root = cJSON_CreateObject();
cJSON* json_params = cJSON_CreateObject();
cJSON* json_filters = cJSON_CreateArray();
AppendCJson(json_roots, json_root, json_params, json_filters, perpage, page, flag);
char* szjson = cJSON_Print(json_root);
printf(">>>json %s\n", szjson);
//string strjson = szjson;
//char* pszEncodeSecret = curl_easy_escape(curl, strclientsecret.c_str(), strclientsecret.length());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, szjson);
//设置ssl验证
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
//CURLOPT_VERBOSE的值为1时会显示详细的调试信息
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
//设置数据接收和写入函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
string resPost0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&resPost0);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
//设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
printf(">>>Device Post in curl post\n");
// 开启post请求
res = curl_easy_perform(curl);
// 检查请求是否成功
if (res != CURLE_OK) {
cout << "device curl_easy_perform() failed res code: " << res << endl;
}
else {
cout << ">>>dev curl post success res code:" << res << endl;
GetCJson(resPost0.c_str());
}
free(szjson);
curl_slist_free_all(header_list);
cJSON_Delete(json_roots);
}
else
{
printf(">>> token curl init failed");
}
curl_easy_cleanup(curl);
}
void TestToken()//获取电网资源业务中台回复
{
string client_id = "2a78ecf0074111ed806c7a5cabbedfb4";//client_id=
string client_secret = "58nOklQlP0SGEuXbrd0wgcVO7HX7IODAgvzHiCm+mAgWSadcX0we2wffjyTUYGsK";//client_secret=
string token_url = "http://172.40.237.145:30010/psr-auth/oauth/accessToken";
QString device_url = QString("http://172.40.237.145:30010/assetCenter/astQueryServices/listDeviceByFilters");
GetToken(token_url, client_id, client_secret);//获取token
QString xtoken = QString("x-token:") + strToken;
GetDevice(device_url, xtoken, 1, 1, 0);//获取台账
}
void GetWebApiJson(int perpage, int page, int flag)//获取电网资源业务中台回复
{
//string client_id = "2a78ecf0074111ed806c7a5cabbedfb4";//client_id=
//string client_secret = "58nOklQlP0SGEuXbrd0wgcVO7HX7IODAgvzHiCm+mAgWSadcX0we2wffjyTUYGsK";//client_secret=
//string token_url = "http://172.40.237.145:30010/psr-auth/oauth/accessToken";
//QString device_url = QString("http://172.40.237.145:30010/assetCenter/astQueryServices/listDeviceByFilters");
string client_id = CLIENT_ID;//client_id=
string client_secret = CLIENT_SECRET;//client_secret=
string token_url = TOKEN_URL;
QString device_url = QString(DEVICE_URL);
/*cout << "client_id1: " << client_id << ",client_secret1: " << client_secret<<",token_url1: "<< token_url.c_str()<<endl;
cout << "client_id2: " << client_id2 << ",client_secret2: " << client_secret2 << ",token_url2: " << token_url2.c_str() << endl;*/
GetToken(token_url, client_id, client_secret);//获取token
QString xtoken = QString("x-token:") + strToken;
GetDevice(device_url, xtoken, perpage, page, flag);//获取台账
}
void TestJson(char* szJson)
{
string strJson = "{\"access_token\":\"ewasdasdqwdas123123124123123123123.asde234dx2dc.erdser34\",\"errors\":\"\",\"expires_in\":\"7200\",\"refresh_token\":\"vsdfa45sdfseq43aefsfwerfadsfanuuu50\",\"status\":\"000000\"}";
printf(">>>>>cJSON pares 1 %s \n", strJson.c_str());
cJSON* msg = cJSON_Parse(strJson.c_str());
if (msg == NULL)
{
printf("cJSON pares error %s\n", cJSON_GetErrorPtr());
}
else
{
printf(">>>>>cJSON pares 3");
cJSON* json_status = cJSON_GetObjectItem(msg, "status");
cJSON* json_error = cJSON_GetObjectItem(msg, "error");
if (json_error == NULL)
{
printf(">>>>>cJSON pares 4");
cJSON* json_result = cJSON_GetObjectItem(msg, "result");
cJSON* json_accesstoken = cJSON_GetObjectItem(msg, "access_token");
printf(">>>>>cJSON pares 5");
QString strToken1 = QString::fromAscii(json_accesstoken->valuestring);
cJSON_Delete(msg);
printf(">>>>>cJSON pares 6 %s\n ", strToken1.toAscii().data());
}
}
}
#endif
#if 0//WW 2023-08-29测试代码s
//get请求和post请求数据响应函数
size_t req_reply_test(void* ptr, size_t size, size_t nmemb, void* stream)
{
//在注释的里面可以打印请求流cookie的信息
string* str = (string*)stream;
(*str).append((char*)ptr, size * nmemb);
return size * nmemb;
}
//http POST请求
CURLcode curl_post_req(const string& url, const string& postParams, string& response)
{
// curl初始化
CURL* curl = curl_easy_init();
// curl返回值
CURLcode res;
if (curl)
{
printf(">>>TestSMSPost in curl \n");
// set params
//设置curl的请求头
struct curl_slist* header_list = NULL;
header_list = curl_slist_append(header_list, "Content-Type:application/json; charset=UTF-8");
header_list = curl_slist_append(header_list, "Authorization:Basic bmpjbnRlc3Q6bmpjbnBxcw==");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
//不接收响应头数据0代表不接收 1代表接收
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
//设置请求为post请求
curl_easy_setopt(curl, CURLOPT_POST, 1);
//设置请求的URL地址
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
//设置post请求的参数
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postParams.c_str());
//设置ssl验证
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
//CURLOPT_VERBOSE的值为1时会显示详细的调试信息
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
//设置数据接收和写入函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&response);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
//设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 6);
printf(">>>TestSMSPost in curl post\n");
// 开启post请求
res = curl_easy_perform(curl);
curl_slist_free_all(header_list);
}
//释放curl
curl_easy_cleanup(curl);
printf(">>>TestSMSPost in curl end\n");
return res;
}
void TestSMSPost()//WW 测试qt post
{
printf(">>>TestSMSPost Start \n");
string url_post0 = "http://192.168.1.13:10214/oauth/token";
string paramsLogin0 = "grant_type=sms_code&phone=13914774158&smsCode=123456";
string resPost0;
CURLcode res3 = curl_post_req(url_post0, paramsLogin0, resPost0);
printf(">>>TestSMSPost End %s\n", resPost0.c_str());
}
CURLcode curl_post_body_req(const string& url, string& response)
{
// curl初始化
CURL* curl = curl_easy_init();
// curl返回值
CURLcode res;
if (curl)
{
printf(">>>TestBodyPost in curl \n");
// set params
//设置curl的请求头
struct curl_slist* header_list = NULL;
header_list = curl_slist_append(header_list, "Content-Type:application/json;");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
//不接收响应头数据0代表不接收 1代表接收
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
//设置请求为post请求
curl_easy_setopt(curl, CURLOPT_POST, 1);
//设置请求的URL地址
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
//设置post请求的参数
cJSON* json_root = cJSON_CreateObject();
//第一层
cJSON_AddItemToObject(json_root, "sname", cJSON_CreateString("hongawen"));
cJSON_AddItemToObject(json_root, "value", cJSON_CreateNumber(12.5));
char* szjson = cJSON_Print(json_root);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, szjson);
//设置ssl验证
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
//CURLOPT_VERBOSE的值为1时会显示详细的调试信息
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
//设置数据接收和写入函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
string resPost0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&resPost0);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
//设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 1);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1);
printf(">>>TestBodyPost in curl post\n");
// 开启post请求
res = curl_easy_perform(curl);
free(szjson);
cJSON_Delete(json_root);
curl_slist_free_all(header_list);
}
else
{
printf(">>> token curl init failed");
}
curl_easy_cleanup(curl);
}
void TestBodyPost()//WW 测试qt post
{
printf(">>>TestBodyPost Start \n");
string url_post0 = "http://192.168.1.111:8090/enhance/testBody";
string resPost0;
CURLcode res3 = curl_post_body_req(url_post0, resPost0);
printf(">>>TestBodyPost End %s\n", resPost0.c_str());
}
#endif
//WW 2023-08-26 增加webap调用 end
//////////////////////////////////////////
///////zw修改 2023-8-30 xml模型数据库读取
int OTL_Select_xmlModel() //xml模型数据库读取
{
try {
OTLConnect();
//printf("\nPostgreSL 1 %s \n", POSTGRES_SCHEMA);
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "select \"model_id\",\"tmnl_type\",\"tmnl_factory\",\"file_name\",\"update_time\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_icd_model_tr\" ");
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
char MODEL_ID[64];
char TMNL_TYPE[64];
char TMNL_FACTORY[64];
char FILE_NAME[128];
otl_datetime UPDATE_TIME;
//printf("\nPostgreSL 2\n");
//create select stream
while (!i.eof()) { //while not end-of-data
//printf("\nPostgreSL 3\n");
i >> MODEL_ID >> TMNL_TYPE >> TMNL_FACTORY >> FILE_NAME >> UPDATE_TIME;
//QString tempdate = QString("%1-%2-%3 %4:%5:%6").arg(UPDATE_TIME.year, 4, 10, QLatin1Char('0')).arg(UPDATE_TIME.month, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.day, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.hour, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.minute, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.second, 2, 10, QLatin1Char('0'));
//QDateTime dt = QDateTime::fromString(tempdate, "yyyy-MM-dd hh:mm:ss");
Set_xml_databaseinfo(MODEL_ID, TMNL_TYPE, TMNL_FACTORY, FILE_NAME, UPDATE_TIME.year, UPDATE_TIME.month, UPDATE_TIME.day, UPDATE_TIME.hour, UPDATE_TIME.minute, UPDATE_TIME.second);
//cout << "FRONT_IP=" << f2 << endl;
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
return 0;
}
int OTL_Select_DecideRecall(char* time, char* id)//判断是否需要补招
{
int flag = 1;
try {
int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
//printf("\nPostgreSL 1 %s \n", POSTGRES_SCHEMA);
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "select \"exp_num\",\"act_num\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(time);
str1.append("' AND \"monitor_id\" = '");
str1.append(id);
str1.append("'");
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
double exp_num;
double act_num;
while (!i.eof()) { //while not end-of-data
i >> exp_num >> act_num;
if (exp_num * 0.8 <= act_num) {
flag = 0;
}
//printf("\n %f %f %f \n", exp_num, act_num, exp_num * 0.8);
}
//OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
flag = 0;
}
return flag;
}
void OTL_Select_recall(char* time, char* id) //数据完整性补招判断
{
try {
QDateTime dt = QDateTime::fromString(time, "yyyy-MM-dd");
long long starttime = dt.toMSecsSinceEpoch() / 1000; //补招起始时间
long long endtime = starttime + 86399; //补招结束时间
QList<long long> timestamp_list; //数据库完整性记录时间点
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
/*OTLConnect();*/
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "SELECT unnest(value_time) AS timestamp_value FROM \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(time);
str1.append("' AND \"monitor_id\" = '");
str1.append(id);
str1.append("' ORDER BY timestamp_value");
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> timestamp;
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t timestamp = std::mktime(&timeinfo);
long long stamp = static_cast<long long>(timestamp);
timestamp_list.append(stamp);
/*QDateTime dt = QDateTime::fromString(time, "yyyy-MM-dd");
long long timestamp2 = dt.toMSecsSinceEpoch() / 1000;
printf("\n %lld \n", timestamp2);*/
/*QString tempdate = QString("%1-%2-%3 %4:%5:%6").arg(UPDATE_TIME.year, 4, 10, QLatin1Char('0')).arg(UPDATE_TIME.month, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.day, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.hour, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.minute, 2, 10, QLatin1Char('0')).arg(UPDATE_TIME.second, 2, 10, QLatin1Char('0'));
printf("\n %s \n", tempdate.toAscii().data());*/
//QDateTime dt = QDateTime::fromString(tempdate, "yyyy-MM-dd hh:mm:ss");
}
//OTLDisconnect();
if (timestamp_list.size() == 0) //完整性数据表无数据
{
RecallInfo info;
info.starttime = starttime;
info.endtime = endtime;
recallinfo_list.append(info);
}
else if (timestamp_list.size() == 1)//存在1条数据
{
long long temptime = timestamp_list[0];
if (temptime != starttime && temptime != endtime)
{
RecallInfo info1;
info1.starttime = starttime;
info1.endtime = temptime - 1;
RecallInfo info2;
info2.starttime = temptime + 1;
info2.endtime = endtime;
recallinfo_list.append(info1);
recallinfo_list.append(info2);
}
else
{
RecallInfo info;
info.starttime = starttime + 1;
info.endtime = endtime - 1;
recallinfo_list.append(info);
}
}
else //存在多条数据
{
for (int i = 1; i < timestamp_list.size(); i++)
{
if (i == 1)
{
timestamp_list[0];//头数据
timestamp_list[timestamp_list.size() - 1];//尾数据
if (timestamp_list[0] - starttime > 600)
{
RecallInfo info;
info.starttime = starttime + 1;
info.endtime = timestamp_list[0] - 1;
recallinfo_list.append(info);
}
if (endtime - timestamp_list[timestamp_list.size() - 1] > 600)
{
RecallInfo info;
info.starttime = timestamp_list[timestamp_list.size() - 1] + 1;
info.endtime = endtime - 1;
recallinfo_list.append(info);
}
}
long long temptime1 = timestamp_list[i - 1];
long long temptime2 = timestamp_list[i];
if (temptime2 - temptime1 > 600)
{
RecallInfo info;
info.starttime = temptime1 + 1;
info.endtime = temptime2 - 1;
recallinfo_list.append(info);
}
}
}
for (int i = 0; i < recallinfo_list.size(); i++)
{
//printf("\n %lld ----- %11d\n", recallinfo_list[i].starttime, recallinfo_list[i].endtime);
long long duration = recallinfo_list[i].endtime - recallinfo_list[i].starttime;
long long max_interval = 3600;
for (long long j = 0; j <= duration; j += max_interval)
{
if (j + max_interval > duration) {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].endtime;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end - 10;
recallinfo_list_hour.append(info);
}
else {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].starttime + j + max_interval;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end - 10;
recallinfo_list_hour.append(info);
}
}
}
LD_info_t* LD_info = find_LD_info_only_from_mp_id(id);
if (LD_info == NULL || LD_info->read_flag == 0) {
printf("\n Find LD_info == null \n");
}
else {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
//if (recallinfo_list_hour.size() != 0) {
// if (LD_info->autorecallcount != 0) {
// for (int j = 0; j < LD_info->autorecallcount; j++) {
// delete LD_info->autorecall[j];
// }
// delete LD_info->autorecall;
// LD_info->autorecallcount = 0;
// }
// LD_info->autorecallflag = 0;
// LD_info->autorecallcount = recallinfo_list_hour.size();
// LD_info->autorecall = new autorecall_t * [recallinfo_list_hour.size()];
// for (int j = 0; j < recallinfo_list_hour.size(); j++) {
// //printf("\n %lld ===== %11d\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime);
// LD_info->autorecall[j] = new autorecall_t[1];
// LD_info->autorecall[j]->start = recallinfo_list_hour[j].starttime;
// LD_info->autorecall[j]->end = recallinfo_list_hour[j].endtime;
// }
//}
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
}
}
//CZY
void Get_Recall_Time(char* time, QList<RecallInfo>& recallinfo_list_hour) //数据完整性补招判断
{
QDateTime dt = QDateTime::fromString(time, "yyyy-MM-dd");
// 将 QDateTime 对象转换为字符串
QString dateTimeString = dt.toString("yyyy-MM-dd");
printf("\nQDateTime dt is\"%s\" \n", dateTimeString.toStdString().c_str());
long long starttime = dt.toMSecsSinceEpoch() / 1000; //补招起始时间
long long endtime = starttime + 86399; //补招结束时间
QList<long long> timestamp_list; //数据库完整性记录时间点
QList<RecallInfo> recallinfo_list; //待补招队列
//QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
RecallInfo info;
info.starttime = starttime;
info.endtime = endtime;
recallinfo_list.append(info);
for (int i = 0; i < recallinfo_list.size(); i++)
{
//printf("\n %lld ----- %11d\n", recallinfo_list[i].starttime, recallinfo_list[i].endtime);
long long duration = recallinfo_list[i].endtime - recallinfo_list[i].starttime;
long long max_interval = 3600;
for (long long j = 0; j <= duration; j += max_interval)
{
if (j + max_interval > duration) {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].endtime;
RecallInfo info;
info.starttime = start;
info.endtime = end;
recallinfo_list_hour.append(info);
}
else {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].starttime + j + max_interval;
RecallInfo info;
info.starttime = start;
info.endtime = end;
recallinfo_list_hour.append(info);
}
}
}
}
char* getoneday(int num)
{
apr_time_t previousTime = apr_time_now();
long long stamp = static_cast<long long>(previousTime) / 1000000;
long long deltime = stamp - (60 * 60 * 24 * num);//减去1天
QDateTime deltime_Qtime = QDateTime::fromTime_t(deltime);
QString tmp_chr1 = deltime_Qtime.toString("yyyy-MM-dd");
QByteArray byteArray = tmp_chr1.toLocal8Bit();
char* charArray = new char[byteArray.size()];
memcpy(charArray, byteArray.data(), byteArray.size());
charArray[byteArray.size()] = '\0';
return charArray;
}
void deletechar(char* day)
{
delete[] day;
}
/// <summary>
/// 删除过期的xml
/// </summary>
void DeletcRecallXml() {
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/recall");
QString file_name = QString(subdir) + QString("_") + QString("*") + QString("_Recall.xml");
//指定文件夹名
QDir dir(cfg_dir);
if (!dir.exists()) {
qDebug() << "folder does not exist!";
return;
}
QStringList filter(file_name);
//指定查找类型和排序,按最新的修改时间获取
QStringList files = dir.entryList(filter, QDir::Files | QDir::Readable | QDir::NoDotAndDotDot, QDir::Name | QDir::Time);
// 设定过滤的日期和时间
QDateTime saveDaysAgo = QDateTime::currentDateTime().addDays(-2);
for (int i = 0; i < files.size(); i++) {//清空读取文件
QFileInfo fileInfo(dir.filePath(files[i]));
if (fileInfo.lastModified() < saveDaysAgo) {
QFile::remove(fileInfo.absoluteFilePath());
}
}
}
void CreateRecallXml()
{
apr_time_t previousTime = apr_time_now();
long long stamp = static_cast<long long>(previousTime) / 1000000;
QDateTime deltime_Qtime = QDateTime::fromTime_t(stamp);
/*CJournalRecall jr;
jr.MonitorID = QString::number(1100, 10);
jr.StartTime = deltime_Qtime.toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = deltime_Qtime.toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
for (int i = 0;i < 10;i++) {
g_StatisticLackList.push_back(jr);
}*/
g_StatisticLackList_list_mutex.lock();
if (g_StatisticLackList.size() > 0)
{
printf("insert ID_CJournalRecall_Map\n");
QMap<QString, QList<CJournalRecall> > ID_CJournalRecall_Map;
list<CJournalRecall>::iterator sl = g_StatisticLackList.begin();
while (sl != g_StatisticLackList.end())
{
CJournalRecall jr = *sl++;
if (ID_CJournalRecall_Map.contains(jr.MonitorID))
{
ID_CJournalRecall_Map[jr.MonitorID].append(jr);
}
else
{
QList<CJournalRecall> TempList;
TempList.append(jr);
ID_CJournalRecall_Map.insert(jr.MonitorID, TempList);
}
}
for (QMap<QString, QList<CJournalRecall> >::iterator it2 = ID_CJournalRecall_Map.begin(); it2 != ID_CJournalRecall_Map.end(); ++it2)
{
QString key2 = it2.key();
QList<CJournalRecall> value2 = it2.value();
QString cfg_dir = QString("../")/*+QString::fromAscii(subdir)*/ + QString("etc/recall/");
QString qstrRecallPath = cfg_dir + QString(subdir) + QString("_") + QString(QString::number(g_front_seg_index, 10)) + QString("_") + key2 + QString("_") + QString(deltime_Qtime.toString("yyyyMMddhhmmss")) + QString("_Recall.xml");
std::string strRecallPath = qstrRecallPath.toStdString();
QFile file(strRecallPath.c_str());
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
printf("补招查询完成,打开%s失败,无法写入线路补招配置!\n", qstrRecallPath.toAscii().data());
QMap<QString, QList<CJournalRecall> >().swap(ID_CJournalRecall_Map);
return;
}
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("RecallList");
writer.writeStartElement("Work");
writer.writeEndElement();
writer.writeStartElement("New");
while (!value2.isEmpty())
{
CJournalRecall jr = value2.takeFirst();
writer.writeStartElement("Recall");
writer.writeAttribute("MonitorID", jr.MonitorID);
writer.writeAttribute("StartTime", jr.StartTime);
writer.writeAttribute("EndTime", jr.EndTime);
writer.writeAttribute("STEADY", jr.STEADY);
writer.writeAttribute("VOLTAGE", jr.VOLTAGE);
writer.writeEndElement();
}
writer.writeEndElement();
writer.writeEndElement();
writer.writeEndDocument();
file.close();
}
QMap<QString, QList<CJournalRecall> >().swap(ID_CJournalRecall_Map);
}
g_StatisticLackList.clear();
g_StatisticLackList_list_mutex.unlock();
}
///////zw修改 2023-8-30 end
/*/////////////////////////////////////////////////////////lnk2024-10-11移除sql的测试代码/////////////////////////////////////////////////////////////*/
std::string intToString(int number) {
if (number == 0) return "0";
std::string str;
bool isNegative = number < 0;
if (isNegative) number = -number;
while (number > 0) {
str.insert(str.begin(), '0' + (number % 10));
number /= 10;
}
if (isNegative) str.insert(str.begin(), '-');
return str;
}
otl_datetime parseTimestamp(const std::string timestampStr) {
otl_datetime timestamp;
// 定义年、月、日、时、分、秒变量
int year, month, day, hour, minute, second;
// 使用字符串流进行解析
std::istringstream ss(timestampStr);
char discard; // 用于丢弃分隔符
// 解析字符串
ss >> year >> discard >> month >> discard >> day >> hour >> discard >> minute >> discard >> second;
// 将解析的值赋给 otl_datetime
timestamp.year = year;
timestamp.month = month;
timestamp.day = day;
timestamp.hour = hour;
timestamp.minute = minute;
timestamp.second = second;
return timestamp;
}
size_t req_reply_web(void* ptr, size_t size, size_t nmemb, void* stream)
{
string* str = (string*)stream;
(*str).append((char*)ptr, size * nmemb);
return size * nmemb;
}
void SendWebAPI_web(const string strUrl, const char* code, char** ptr)
{
// curl初始化
CURL* curl = curl_easy_init();
// curl返回值
CURLcode res;
if (curl)
{
char url[100];
sprintf(url, "%s?%s", strUrl.c_str(), code);
printf(">>>json %s\n", url);
// 设置URL
curl_easy_setopt(curl, CURLOPT_URL, url);
//设置数据接收和写入函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply_web);
//数据接收
string resPost0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&resPost0);
//设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
//设置header
curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 开启post请求
res = curl_easy_perform(curl);
// 检查请求是否成功
if (res != CURLE_OK) {
printf("web failed res code: ");
}
else {
printf(">>> web return str:%s \n", resPost0.c_str());
*ptr = (char*)malloc(strlen(resPost0.c_str()) + 1); // 分配足够的内存空间
if (*ptr != NULL) {
strcpy(*ptr, resPost0.c_str());
}
else {
printf("Memory allocation failed!\n");
}
}
}
else
{
printf(">>> web curl init failed");
}
curl_easy_cleanup(curl);
}
//20241206不使用的代码lnk
#if 0
//终端识别码密钥web接口
int parse_device_web_test_ext(QMap<QString, terminal_ext*>* terminal_ext_map,const std::vector<std::string>& codes)
{
std::cout << "parse_device_web_test_ext" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
if(function == "info"){
code = std::string("code1=pg_ext&code2=read&code3=info");
}
char* terminal_code=NULL;
char* terminal_identify_code=NULL;
char* terminal_key=NULL;
char* ptr=NULL;
terminal_ext* ext;
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "terminal_code"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (terminal_code != NULL) {
// 如果已经分配了内存,则释放内存
free(terminal_code);
}
terminal_code = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(terminal_code, json_value->valuestring);
std::cout << "terminal_code:" << terminal_code <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "terminal_identify_code"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (terminal_identify_code != NULL) {
// 如果已经分配了内存,则释放内存
free(terminal_identify_code);
}
terminal_identify_code = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(terminal_identify_code, json_value->valuestring);
std::cout << "terminal_identify_code:" << terminal_identify_code <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "terminal_key"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (terminal_key != NULL) {
// 如果已经分配了内存,则释放内存
free(terminal_key);
}
terminal_key = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(terminal_key, json_value->valuestring);
std::cout << "terminal_key:" << terminal_key <<std::endl;
}
/*遍历一条记录一条 */
if (!terminal_ext_map->contains(terminal_code)) {
ext = new terminal_ext();
terminal_ext_map->insert(terminal_code, ext);
apr_snprintf(ext->terminal_identify_code, sizeof(ext->terminal_identify_code), "%s", terminal_identify_code);//terminal_code
apr_snprintf(ext->terminal_key, sizeof(ext->terminal_key), "%s", terminal_key);//terminal_code
}
else
{
qDebug() << terminal_code << endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//模型web接口
int parse_model_web_test(QMap<QString, icd_model*>* icd_model_map,const std::vector<std::string>& codes)
{
std::cout << "parse_model_web_test" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
if(function == "info"){
code = std::string("code1=model&code2=read&code3=info");
}
char* model_id=NULL;
char* tmnl_type=NULL;
char* tmnl_factory=NULL;
char* file_name=NULL;
char* timestamp=NULL;
char* ptr=NULL;
icd_model* model;
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "model_id"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (model_id != NULL) {
// 如果已经分配了内存,则释放内存
free(model_id);
}
model_id = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(model_id, json_value->valuestring);
std::cout << "model_id:" << model_id <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "tmnl_type"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (tmnl_type != NULL) {
// 如果已经分配了内存,则释放内存
free(tmnl_type);
}
tmnl_type = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(tmnl_type, json_value->valuestring);
std::cout << "tmnl_type:" << tmnl_type <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "tmnl_factory"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (tmnl_factory != NULL) {
// 如果已经分配了内存,则释放内存
free(tmnl_factory);
}
tmnl_factory = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(tmnl_factory, json_value->valuestring);
std::cout << "tmnl_factory:" << tmnl_factory <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "file_name"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (file_name != NULL) {
// 如果已经分配了内存,则释放内存
free(file_name);
}
file_name = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(file_name, json_value->valuestring);
std::cout << "file_name:" << file_name <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "timestamp"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (timestamp != NULL) {
// 如果已经分配了内存,则释放内存
free(timestamp);
}
timestamp = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(timestamp, json_value->valuestring);
std::cout << "timestamp:" << timestamp <<std::endl;
}
/*遍历一条记录一条 */
if (!icd_model_map->contains(model_id)) {
model = new icd_model();
icd_model_map->insert(model_id, model);
apr_snprintf(model->model_id, sizeof(model->model_id), "%s", model_id);//org_name
apr_snprintf(model->tmnl_type, sizeof(model->tmnl_type), "%s", tmnl_type);//maint_name
apr_snprintf(model->tmnl_factory, sizeof(model->tmnl_factory), "%s", tmnl_factory);//station_name
apr_snprintf(model->file_name, sizeof(model->file_name), "%s", file_name);//addr_str
apr_snprintf(model->timestamp, sizeof(model->timestamp), "%s", timestamp);//timestamp
}
else
{
qDebug() << model_id << endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//监测点台账web接口
int parse_line_web_test(QMap<QString, ledger_monitor*>* ledger_monitor_map,const std::vector<std::string>& codes)
{
std::cout << "parse_line_web_test" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
if(function == "info"){
code = std::string("code1=line&code2=read&code3=info");
}
else if(function == "count_cfg"){
//code = std::string("code1=line&code2=read&code3=count_cfg"); //读取台账表的记录总数
}
char* ptr=NULL;
char* monitor_id=NULL;
char* terminal_code=NULL;
char* monitor_name=NULL;
char* logical_device_seq=NULL;
char* voltage_level=NULL;
char* terminal_connect=NULL;
char* timestamp=NULL;
char* count=NULL;
ledger_monitor* line;
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
if (json != NULL) {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "monitor_id"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (monitor_id != NULL) {
// 如果已经分配了内存,则释放内存
free(monitor_id);
}
monitor_id = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(monitor_id, json_value->valuestring);
std::cout << "monitor_id:" << monitor_id <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "terminal_code"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (terminal_code != NULL) {
// 如果已经分配了内存,则释放内存
free(terminal_code);
}
terminal_code = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(terminal_code, json_value->valuestring);
std::cout << "terminal_code:" << terminal_code <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "monitor_name"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (monitor_name != NULL) {
// 如果已经分配了内存,则释放内存
free(monitor_name);
}
monitor_name = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(monitor_name, json_value->valuestring);
std::cout << "monitor_name:" << monitor_name <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "logical_device_seq"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (logical_device_seq != NULL) {
// 如果已经分配了内存,则释放内存
free(logical_device_seq);
}
logical_device_seq = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(logical_device_seq, json_value->valuestring);
std::cout << "logical_device_seq:" << logical_device_seq <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "voltage_level"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (voltage_level != NULL) {
// 如果已经分配了内存,则释放内存
free(voltage_level);
}
voltage_level = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(voltage_level, json_value->valuestring);
std::cout << "voltage_level:" << voltage_level <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "terminal_connect"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (terminal_connect != NULL) {
// 如果已经分配了内存,则释放内存
free(terminal_connect);
}
terminal_connect = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(terminal_connect, json_value->valuestring);
std::cout << "terminal_connect:" << terminal_connect <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "timestamp"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (timestamp != NULL) {
// 如果已经分配了内存,则释放内存
free(timestamp);
}
timestamp = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(timestamp, json_value->valuestring);
std::cout << "timestamp:" << timestamp <<std::endl;
}
//添加一个数据库计数的读取
json_value = cJSON_GetObjectItem(json_node, "count"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (count != NULL) {
// 如果已经分配了内存,则释放内存
free(count);
}
count = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(count, json_value->valuestring);
std::cout << "count:" << count <<std::endl;
}
/*遍历一条记录一条 */
if (!ledger_monitor_map->contains(monitor_id)) {
line = new ledger_monitor();
if(function == "info"){
ledger_monitor_map->insert(monitor_id, line);
apr_snprintf(line->monitor_id, sizeof(line->monitor_id), "%s", monitor_id);//terminal_id
apr_snprintf(line->terminal_code, sizeof(line->terminal_code), "%s", terminal_code);//terminal_code
apr_snprintf(line->monitor_name, sizeof(line->monitor_name), "%s", monitor_name);//org_name
apr_snprintf(line->logical_device_seq, sizeof(line->logical_device_seq), "%s", logical_device_seq);//maint_name
apr_snprintf(line->voltage_level, sizeof(line->voltage_level), "%s", voltage_level);//station_name
apr_snprintf(line->terminal_connect, sizeof(line->terminal_connect), "%s", terminal_connect);//addr_str
apr_snprintf(line->timestamp, sizeof(line->timestamp), "%s", timestamp);//timestamp
}
else if(function == "count_cfg"){
ledger_monitor_map->insert("count_cfg", line);
apr_snprintf(line->count_cfg, sizeof(line->count_cfg), "%s", count);//表count
}
}
else
{
qDebug() << monitor_id << endl;
}
}
}
/* 根据前置现有的终端号筛选监测点 */
/* 遍历 ledger_monitor_map 容器并删除不在 g_node->n_clients 中的 terminal_code */
QMap<QString, ledger_monitor*>::iterator it;
it = ledger_monitor_map->begin();
while (it != ledger_monitor_map->end()) {
// 假设 value 是一个结构体,包含 terminal_code
ledger_monitor* data = it.value(); // 获取 monitor_id 对应的数据
std::string terminal_code_line = data->terminal_code; // 从数据中提取 terminal_code
// 标志是否找到匹配的终端号
bool found = false;
// 遍历 g_node->n_clients检查 terminal_code 是否存在
for (int dev_no = 0; dev_no < g_node->n_clients; dev_no++) {
ied_usr_t* user_ext = (ied_usr_t*)(g_node->clients[dev_no]->usr_ext);
std::string client_terminal_code = user_ext->terminal_code;
// 如果找到了匹配的终端号,标记 found 为 true 并停止循环
if (client_terminal_code == terminal_code_line) {
found = true;
break;
}
}
// 如果没找到匹配的 terminal_code就删除该记录
if (!found) {
it = ledger_monitor_map->erase(it); // 删除当前记录erase 会返回下一个迭代器
std::cout << "Removed monitor_id: " << it.key().toStdString() << " with terminal_code: " << terminal_code << std::endl; // 调试输出
} else {
++it; // 否则继续下一个记录
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//终端台账web接口
int parse_device_web_test_dev(QMap<QString, terminal_dev*>* terminal_dev_map,const std::vector<std::string>& codes)
{
std::cout << "parse_device_web_test_dev" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
if(function == "info"){
/*入参初始化 */
std::string front_inst = "";
std::string mp_number = "";
std::string cnt_cfg = "";
std::string mult_flag = "";
std::string front_num = "";
//入参
front_inst = codes[1];
mp_number = codes[2];
cnt_cfg = codes[3];
mult_flag = codes[4]; //单/多前置
front_num = codes[5];
std::cout << "param:" << front_inst << mp_number << cnt_cfg << mult_flag << front_num << std::endl;
code = std::string("code1=pg_dev&code2=read&code3=info") + "&code4=" + front_inst + "&code5=" + mp_number + "&code6=" + cnt_cfg + "&code7=" + mult_flag + "&code8=" + front_num;
}
else if(function == "count_cfg"){
code = std::string("code1=pg_dev&code2=read&code3=count_cfg"); //读取台账表的记录总数
}
char* ptr=NULL;
char* terminal_id=NULL;
char* terminal_code=NULL;
char* org_name=NULL;
char* maint_name=NULL;
char* station_name=NULL;
char* addr_str=NULL;
char* port=NULL;
char* tmnl_factory=NULL;
char* dev_type=NULL;
char* tmnl_status=NULL;
char* timestamp=NULL;
char* count=NULL;
terminal_dev* dev;
try{
//参数pg_dev取终端台账后续的参数分别为FRONT_INST 前置实例号;mp_num 前置对应检测点数;count_cfg 前置表读取的检测点数;MULTIPLE_NODE_FLAG 多前置标志;g_front_seg_num 多前置前置总数;
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
if (json != NULL) {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "terminal_id"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (terminal_id != NULL) {
// 如果已经分配了内存,则释放内存
free(terminal_id);
}
terminal_id = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(terminal_id, json_value->valuestring);
std::cout << "terminal_id:" << terminal_id <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "terminal_code"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (terminal_code != NULL) {
// 如果已经分配了内存,则释放内存
free(terminal_code);
}
terminal_code = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(terminal_code, json_value->valuestring);
std::cout << "terminal_code:" << terminal_code <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "org_name"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (org_name != NULL) {
// 如果已经分配了内存,则释放内存
free(org_name);
}
org_name = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(org_name, json_value->valuestring);
std::cout << "org_name:" << org_name <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "maint_name"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (maint_name != NULL) {
// 如果已经分配了内存,则释放内存
free(maint_name);
}
maint_name = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(maint_name, json_value->valuestring);
std::cout << "maint_name:" << maint_name <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "station_name"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (station_name != NULL) {
// 如果已经分配了内存,则释放内存
free(station_name);
}
station_name = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(station_name, json_value->valuestring);
std::cout << "station_name:" << station_name <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "addr_str"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (addr_str != NULL) {
// 如果已经分配了内存,则释放内存
free(addr_str);
}
addr_str = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(addr_str, json_value->valuestring);
std::cout << "addr_str:" << addr_str <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "port"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (port != NULL) {
// 如果已经分配了内存,则释放内存
free(port);
}
port = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(port, json_value->valuestring);
std::cout << "port:" << port <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "tmnl_factory"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (tmnl_factory != NULL) {
// 如果已经分配了内存,则释放内存
free(tmnl_factory);
}
tmnl_factory = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(tmnl_factory, json_value->valuestring);
std::cout << "tmnl_factory:" << tmnl_factory <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "dev_type"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (dev_type != NULL) {
// 如果已经分配了内存,则释放内存
free(dev_type);
}
dev_type = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(dev_type, json_value->valuestring);
std::cout << "dev_type:" << dev_type <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "tmnl_status"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (tmnl_status != NULL) {
// 如果已经分配了内存,则释放内存
free(tmnl_status);
}
tmnl_status = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(tmnl_status, json_value->valuestring);
std::cout << "tmnl_status:" << tmnl_status <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "timestamp"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (timestamp != NULL) {
// 如果已经分配了内存,则释放内存
free(timestamp);
}
timestamp = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(timestamp, json_value->valuestring);
std::cout << "timestamp:" << timestamp <<std::endl;
}
//添加一个数据库计数的读取
json_value = cJSON_GetObjectItem(json_node, "count"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (count != NULL) {
// 如果已经分配了内存,则释放内存
free(count);
}
count = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(count, json_value->valuestring);
std::cout << "count:" << count <<std::endl;
}
/*遍历一条记录一条 */
if (!terminal_dev_map->contains(terminal_code)) {
dev = new terminal_dev();
if(function == "info"){
terminal_dev_map->insert(terminal_code, dev);
apr_snprintf(dev->terminal_id, sizeof(dev->terminal_id), "%s", terminal_id);//terminal_id
apr_snprintf(dev->terminal_code, sizeof(dev->terminal_code), "%s", terminal_code);//terminal_code
apr_snprintf(dev->org_name, sizeof(dev->org_name), "%s", org_name);//org_name
apr_snprintf(dev->maint_name, sizeof(dev->maint_name), "%s", maint_name);//maint_name
apr_snprintf(dev->station_name, sizeof(dev->station_name), "%s", station_name);//station_name
apr_snprintf(dev->addr_str, sizeof(dev->addr_str), "%s", addr_str);//addr_str
apr_snprintf(dev->port, sizeof(dev->port), "%s", port);//port_int
apr_snprintf(dev->tmnl_factory, sizeof(dev->tmnl_factory), "%s", tmnl_factory);//tmnl_factory
apr_snprintf(dev->dev_type, sizeof(dev->dev_type), "%s", dev_type);//dev_type
apr_snprintf(dev->tmnl_status, sizeof(dev->tmnl_status), "%s", tmnl_status);//tmnl_status
apr_snprintf(dev->timestamp, sizeof(dev->timestamp), "%s", timestamp);//timestamp
}
else if(function == "count_cfg"){
terminal_dev_map->insert("count_cfg", dev);
apr_snprintf(dev->count_cfg, sizeof(dev->count_cfg), "%s", count);//表count
}
}
else
{
qDebug() << terminal_code << endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//前置表web接口-写
int parse_device_web_test_front_write(const std::vector<std::string>& codes)
{
std::cout << "parse_device_web_test_front_write" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
char* ret=NULL;
char* ptr=NULL;
if(function == "insertfront"){
/*入参初始化 */
std::string front_ip = "";
std::string front_inst = "";
std::string front_type = "";
std::string program_version = "";
std::string front_status = "";
//入参
front_ip = codes[1];
front_inst = codes[2];
front_type = codes[3];
program_version = codes[4];
front_status = codes[5];
std::cout << "insert param:" << front_ip << front_inst << front_type << program_version << front_status <<std::endl;
//构造参数
code = std::string("code1=pg_front&code2=write&code3=insertfront") + "&code4=" + front_ip + "&code5=" + front_inst + "&code6=" + front_type + "&code7=" + program_version+ "&code8=" + front_status;
}
else if(function == "his"){
/*入参初始化 */
std::string front_ip = "";
std::string program_version = "";
std::string mp_num = "";
//入参
front_ip = codes[1];
program_version = codes[2];
mp_num = codes[3];
std::cout << "insert param:" << front_ip << program_version << mp_num <<std::endl;
//构造参数
code = std::string("code1=pg_front&code2=write&code3=his") + "&code4=" + front_ip + "&code5=" + program_version + "&code6=" + mp_num;
}
else if(function == "updatefront"){
/*入参初始化 */
std::string front_ip = "";
std::string front_inst = "";
std::string count_real = "";
std::string front_version = "";
//入参
front_ip = codes[1];
front_inst = codes[2];
count_real = codes[3];
front_version = code[4];
std::cout << "update param:" << front_ip << front_inst << count_real << std::endl;
code = std::string("code1=pg_front&code2=write&code3=updatefront") + "&code4=" + front_ip + "&code5=" + front_inst + "&code6=" + count_real + "&code7=" + front_version;
}
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "ret"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (ret != NULL) {
// 如果已经分配了内存,则释放内存
free(ret);
}
ret = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(ret, json_value->valuestring);
std::cout << "ret:" << ret <<std::endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
if(ret == "0")
{
std::cout << "插入成功"<<std::endl;
}
else
{
std::cout << "插入失败"<<std::endl;
}
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//前置表web接口-读
int parse_device_web_test_front_read(QMap<QString, front_list*>* front_map,const std::vector<std::string>& codes)
{
std::cout << "parse_device_web_test_front" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
if(function == "info"){
code = std::string("code1=pg_front&code2=read&code3=info");
}
else if(function == "frontip"){
std::string front_index = "";
std::string front_status = "";
front_index = codes[1];
front_status = codes[2];
code = std::string("code1=pg_front&code2=read&code3=frontip") + "&code4=" + front_index + "&code5=" + front_status;
}
else if(function == "frontstatus"){
std::string front_ip = "";
std::string front_index = "";
front_ip = codes[1];
front_index = codes[2];
code = std::string("code1=pg_front&code2=read&code3=frontstatus") + "&code4=" + front_ip + "&code5=" + front_index;
}
char* front_type=NULL;
char* mp_num=NULL;
char* front_ip=NULL;
char* front_status=NULL;
char* ptr=NULL;
//QMap<QString, front_list*> front_map;
front_list* front;
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "front_type"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (front_type != NULL) {
// 如果已经分配了内存,则释放内存
free(front_type);
}
front_type = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(front_type, json_value->valuestring);
std::cout << "front_type:" << front_type <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "mp_num"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (mp_num != NULL) {
// 如果已经分配了内存,则释放内存
free(mp_num);
}
mp_num = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(mp_num, json_value->valuestring);
std::cout << "mp_num:" << mp_num <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "front_ip"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (front_ip != NULL) {
// 如果已经分配了内存,则释放内存
free(front_ip);
}
front_ip = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(front_ip, json_value->valuestring);
std::cout << "front_ip:" << front_ip <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "front_status"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (front_status != NULL) {
// 如果已经分配了内存,则释放内存
free(front_status);
}
front_status = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(front_status, json_value->valuestring);
std::cout << "front_status:" << front_status <<std::endl;
}
/*遍历一条记录一条 */
if(function == "info"){
if (!front_map->contains("0.0.0.0")) {
front = new front_list();
front_map->insert("0.0.0.0", front);
apr_snprintf(front->front_inst, sizeof(front->front_inst), "%s", "0");//front_inst
apr_snprintf(front->front_type, sizeof(front->front_type), "%s", front_type);//front_type
apr_snprintf(front->mp_num, sizeof(front->mp_num), "%s", mp_num);//mp_num
}
else
{
qDebug() << "0.0.0.0 : front_type = " << front_type << "mp_num = " << mp_num << endl;
}
}
else if(function == "frontip"){
if (!front_map->contains("frontip")) { //以"frontip"为key
front = new front_list();
front_map->insert("frontip", front);
apr_snprintf(front->front_ip, sizeof(front->front_ip), "%s", front_ip);//front_type
}
else
{
qDebug() << "front_ip = " << front_ip << endl;
}
}
else if(function == "frontstatus"){
if (!front_map->contains("frontstatus")) { //以"frontstatus"为key
front = new front_list();
front_map->insert("frontstatus", front);
apr_snprintf(front->front_status, sizeof(front->front_status), "%s", front_status);//front_type
}
else
{
qDebug() << "frontstatus = " << front_status << endl;
}
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//完整性web接口-读
int parse_intact_web_test_read(QMap<QString, intact_list*>* intact_list_map,const std::vector<std::string>& codes)
{
std::cout << "parse_intact_web_test" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
if(function == "deciderecall"){
/*入参初始化 */
std::string time = "";
std::string id = "";
//入参
time = codes[1];
id = codes[2];
std::cout << "param:" << time << id << std::endl;
code = std::string("code1=intact&code2=read&code3=deciderecall") + "&code4=" + time + "&code5=" + id;
}
else if(function == "autorecall"){
/*入参初始化 */
std::string time = "";
std::string id = "";
//入参
time = codes[1];
id = codes[2];
std::cout << "param:" << time << id << std::endl;
code = std::string("code1=intact&code2=read&code3=autorecall") + "&code4=" + time + "&code5=" + id;
}
else if(function == "handlerecall"){
/*入参初始化 */
std::string tmp_time = "";
std::string Monitorid = "";
std::string start_time = "";
std::string end_time = "";
//入参
tmp_time = codes[1];
Monitorid = codes[2];
start_time = codes[3];
end_time = codes[4];
std::cout << "param:" << tmp_time << Monitorid << start_time << end_time << std::endl;
code = std::string("code1=intact&code2=read&code3=handlerecall") + "&code4=" + tmp_time + "&code5=" + Monitorid + "&code4=" + start_time + "&code5=" + end_time;
}
char* exp_num=NULL;
char* act_num=NULL;
char* valuetime=NULL;
char* ptr=NULL;
intact_list* intact;
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "exp_num"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (exp_num != NULL) {
// 如果已经分配了内存,则释放内存
free(exp_num);
}
exp_num = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(exp_num, json_value->valuestring);
std::cout << "exp_num:" << exp_num <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "act_num"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (act_num != NULL) {
// 如果已经分配了内存,则释放内存
free(act_num);
}
act_num = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(act_num, json_value->valuestring);
std::cout << "act_num:" << act_num <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "valuetime"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (valuetime != NULL) {
// 如果已经分配了内存,则释放内存
free(valuetime);
}
valuetime = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(valuetime, json_value->valuestring);
std::cout << "valuetime:" << valuetime <<std::endl;
}
/*遍历一条记录一条 */
QString id = QString::fromStdString(codes[2]);
if (!intact_list_map->contains(id)) {
intact = new intact_list();
intact_list_map->insert(id, intact); //时间数据会循环多次id会重复
if(function == "deciderecall"){
apr_snprintf(intact->exp_num, sizeof(intact->exp_num), "%s", exp_num);
apr_snprintf(intact->act_num, sizeof(intact->act_num), "%s", act_num);
}
else if(function == "autorecall" || function == "handlerecall"){
intact->value_time.push_back(valuetime);
}
}
else
{
intact = intact_list_map->value(id); //找到这个id对应的类
if(function == "deciderecall"){
qDebug() << "exp_num = " << intact->exp_num << "act_num = " << intact->act_num << endl;
}
else if(function == "autorecall" || function == "handlerecall"){
intact->value_time.push_back(valuetime);//记录到对应id的容器中
}
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//日志数据库接口
int parse_rationality_write(const std::vector<std::string>& codes)
{
std::cout << "parse_rationality_write" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
char* ret=NULL;
char* ptr=NULL;
if(function == "log"){
/*入参初始化 */
std::string id = "";
std::string time = "";
std::string count = "";
std::string filename = "";
//入参
id = codes[1];
time = codes[2];
count = codes[3];
filename = codes[4];
std::cout << "insert param:" << id << time << count << filename << std::endl;
//构造参数
code = std::string("code1=rationality&code2=write&code3=log") + "&code4=" + id + "&code5=" + time + "&code6=" + count + "&code7=" + filename;
}
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "ret"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (ret != NULL) {
// 如果已经分配了内存,则释放内存
free(ret);
}
ret = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(ret, json_value->valuestring);
std::cout << "ret:" << ret <<std::endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
if(ret == "0")
{
std::cout << "插入成功"<<std::endl;
}
else
{
std::cout << "插入失败"<<std::endl;
}
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
int parse_dataintegrity_write(const std::vector<std::string>& codes)
{
std::cout << "parse_dataintegrity_write" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
char* ret=NULL;
char* ptr=NULL;
if(function == "log"){
/*入参初始化 */
std::string time = "";
std::string datatime = "";
std::string monitorId = "";
std::string recallflag = "";
std::string msspan = "";
//入参
time = codes[1];
datatime = codes[2];
monitorId = codes[3];
recallflag = codes[4];
msspan = codes[5];
std::cout << "insert param:" << time << datatime << monitorId << recallflag << msspan <<std::endl;
//构造参数
code = std::string("code1=dataintegrity&code2=write&code3=log") + "&code4=" + time + "&code5=" + datatime + "&code6=" + monitorId + "&code7=" + recallflag + "&code8=" + msspan;
}
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "ret"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (ret != NULL) {
// 如果已经分配了内存,则释放内存
free(ret);
}
ret = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(ret, json_value->valuestring);
std::cout << "ret:" << ret <<std::endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
if(ret == "0")
{
std::cout << "插入成功"<<std::endl;
}
else
{
std::cout << "插入失败"<<std::endl;
}
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
int parse_match_write(const std::vector<std::string>& codes)
{
std::cout << "parse_match_write" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
char* ret=NULL;
char* ptr=NULL;
if(function == "log"){
/*入参初始化 */
std::string id = "";
std::string time = "";
std::string BASE_MAT_NUM = "";
std::string ADV_MAT_NUM = "";
std::string BASE_ACT_NUM = "";
std::string ADV_ACT_NUM = "";
std::string filename = "";
//入参
id = codes[1];
time = codes[2];
BASE_MAT_NUM = codes[3];
ADV_MAT_NUM = codes[4];
BASE_ACT_NUM = codes[5];
ADV_ACT_NUM = codes[6];
filename = codes[7];
std::cout << "insert param:" << id << time << BASE_MAT_NUM<< ADV_MAT_NUM<< BASE_ACT_NUM<< ADV_ACT_NUM<<filename <<std::endl;
//构造参数
code = std::string("code1=match&code2=write&code3=log") + "&code4=" + id + "&code5=" + time + "&code6=" + BASE_MAT_NUM + "&code7=" + ADV_MAT_NUM + "&code8=" + BASE_ACT_NUM + "&code9=" + ADV_ACT_NUM + "&code10=" + filename;
}
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "ret"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (ret != NULL) {
// 如果已经分配了内存,则释放内存
free(ret);
}
ret = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(ret, json_value->valuestring);
std::cout << "ret:" << ret <<std::endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
if(ret == "0")
{
std::cout << "插入成功"<<std::endl;
}
else
{
std::cout << "插入失败"<<std::endl;
}
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
int parse_commstatus_write(const std::vector<std::string>& codes)
{
std::cout << "parse_commstatus_write" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
char* ret=NULL;
char* ptr=NULL;
if(function == "log"){
/*入参初始化 */
std::string id = "";
std::string currenttime = "";
//入参
id = codes[1];
currenttime = codes[2];
std::cout << "insert param:" << id << currenttime <<std::endl;
//构造参数
code = std::string("code1=commstatus&code2=write&code3=log") + "&code4=" + id + "&code5=" + currenttime ;
}
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "ret"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (ret != NULL) {
// 如果已经分配了内存,则释放内存
free(ret);
}
ret = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(ret, json_value->valuestring);
std::cout << "ret:" << ret <<std::endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
if(ret == "0")
{
std::cout << "插入成功"<<std::endl;
}
else
{
std::cout << "插入失败"<<std::endl;
}
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
int parse_commerror_write(const std::vector<std::string>& codes)
{
std::cout << "parse_commerror_write" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
char* ret=NULL;
char* ptr=NULL;
if(function == "log"){
/*入参初始化 */
std::string id = "";
std::string time = "";
std::string filename = "";
//入参
id = codes[1];
time = codes[2];
filename = codes[3];
std::cout << "insert param:" << id << time << filename <<std::endl;
//构造参数
code = std::string("code1=commerror&code2=write&code3=log") + "&code4=" + id + "&code5=" + time + "&code6=" + filename;
}
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "ret"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (ret != NULL) {
// 如果已经分配了内存,则释放内存
free(ret);
}
ret = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(ret, json_value->valuestring);
std::cout << "ret:" << ret <<std::endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
if(ret == "0")
{
std::cout << "插入成功"<<std::endl;
}
else
{
std::cout << "插入失败"<<std::endl;
}
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//删除的web接口
int parse_database_delete(const std::vector<std::string>& codes)
{
std::cout << "parse_device_web_test_front" << std::endl;
std::string code = "";
/*请求界定 */
std::string function = codes[0];
std::cout << "function:" << function << std::endl;
if(function == "ontime"){
/*入参初始化 */
std::string time = "";
//入参
time = codes[1];
std::cout << "param:" << time << std::endl;
code = std::string("code1=ontime&code2=delete&code3=deletetime") + "&code4=" + time;
}
char* ret=NULL;
char* tablename=NULL;
char* ptr=NULL;
try{
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
//调试用
printf("ptr:%s\n",ptr);
cJSON* json = cJSON_Parse(ptr); //json格式序列化
cJSON* json_node = NULL;;
cJSON* json_records = NULL;;
cJSON* json_value = NULL;
int array_size = 0;
int i = 0;
if (json == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(json == NULL){
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
json = cJSON_Parse(ptr);
i++;if(i>3)break;
}
}
else {
json_node = cJSON_GetObjectItem(json, "result"); //获取result根节点
json_records = cJSON_GetObjectItem(json_node, "records"); //获取记录节点
array_size = cJSON_GetArraySize(json_records); //获取记录数组大小
for(i = 0;i<array_size;i++){
json_node = cJSON_GetArrayItem(json_records, i); //获取数组中的节点
json_value = cJSON_GetObjectItem(json_node, "ret"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (ret != NULL) {
// 如果已经分配了内存,则释放内存
free(ret);
}
ret = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(ret, json_value->valuestring);
std::cout << "ret:" << ret <<std::endl;
}
json_value = cJSON_GetObjectItem(json_node, "tablename"); //获取result
if (json_value && json_value->type == cJSON_String) {
if (tablename != NULL) {
// 如果已经分配了内存,则释放内存
free(tablename);
}
tablename = (char*)malloc(strlen(json_value->valuestring) + 1); // 分配内存
strcpy(tablename, json_value->valuestring);
std::cout << "tablename:" << tablename <<std::endl;
}
if(ret == "0")
{
std::cout << tablename << "删除成功" <<std::endl;
}
else
{
std::cout << tablename << "删除失败" <<std::endl;
}
}
}
if (ptr) {
free(ptr);
}
cJSON_Delete(json);
return APR_SUCCESS;
}
catch (const std::exception& e) {
cout << "Exception caught: " << e.what() << endl;
// 这里可以添加其他异常处理逻辑
}
}
//补招的web接口前两个未使用 不再由前置轮询,将由上层轮询手动让前置补招
int OTL_Select_DecideRecall_web(char* time, char* id)//判断是否需要补招
{
int flag = 1;
try {
/*int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
//printf("\nPostgreSL 1 %s \n", POSTGRES_SCHEMA);
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "select \"exp_num\",\"act_num\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(time);
str1.append("' AND \"monitor_id\" = '");
str1.append(id);
str1.append("'");
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
double exp_num;
double act_num;
while (!i.eof()) { //while not end-of-data
i >> exp_num >> act_num;*/
std::vector<std::string> codes;//入参集合
QMap<QString, intact_list*> intact_list_map;
codes.push_back("deciderecall");
codes.push_back(std::string(time));
codes.push_back(std::string(id));
parse_intact_web_test_read(&intact_list_map,codes);
codes.clear();
try {
//char exp_num[64];
//char act_num[64];
double exp_num;
double act_num;
// 遍历终端台账容器
QMap<QString, intact_list*>::iterator it;
for (it = intact_list_map.begin(); it != intact_list_map.end(); ++it) {
intact_list* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
//strncpy(exp_num, value->exp_num.c_str(), sizeof(exp_num) - 1);
//strncpy(act_num, value->act_num.c_str(), sizeof(act_num) - 1);
exp_num = atof(value->exp_num);
act_num = atof(value->exp_num);
std::cout << exp_num << " " << act_num << std::endl;
if (exp_num * 0.8 <= act_num) {
flag = 0;
}
}
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
flag = 0;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
flag = 0;
}
return flag;
}
void OTL_Select_recall_web(char* time, char* id) //数据完整性补招判断
{
try {
QDateTime dt = QDateTime::fromString(time, "yyyy-MM-dd");
long long starttime = dt.toMSecsSinceEpoch() / 1000; //补招起始时间
long long endtime = starttime + 86399; //补招结束时间
QList<long long> timestamp_list; //数据库完整性记录时间点
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
/* int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
//OTLConnect();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "SELECT unnest(value_time) AS timestamp_value FROM \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(time);
str1.append("' AND \"monitor_id\" = '");
str1.append(id);
str1.append("' ORDER BY timestamp_value");
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> timestamp;*/
std::vector<std::string> codes;//入参集合
QMap<QString, intact_list*> intact_list_map;
codes.push_back("autorecall");
codes.push_back(std::string(time));
codes.push_back(std::string(id));
parse_intact_web_test_read(&intact_list_map,codes);
codes.clear();
try {
otl_datetime timestamp;
// 遍历终端台账容器
if (intact_list_map.contains(id)) {
intact_list* value = intact_list_map.value(id); // 找到键值为 "id" 的对象
if (value != nullptr) {
// 遍历 value_time 容器并输出所有时间字符串
for (std::vector<std::string>::const_iterator it = value->value_time.begin(); it != value->value_time.end(); ++it) {
const std::string& time = *it;
std::cout << "Time: " << time << std::endl;
timestamp = parseTimestamp(time);
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t timestamp = std::mktime(&timeinfo);
long long stamp = static_cast<long long>(timestamp);
timestamp_list.append(stamp);
}
}
}
else {
std::cout << "No entry found for id: " << id << std::endl;
}
/* struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t timestamp = std::mktime(&timeinfo);
long long stamp = static_cast<long long>(timestamp);
timestamp_list.append(stamp);*/
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
}
if (timestamp_list.size() == 0) //完整性数据表无数据
{
RecallInfo info;
info.starttime = starttime;
info.endtime = endtime;
recallinfo_list.append(info);
}
else if (timestamp_list.size() == 1)//存在1条数据
{
long long temptime = timestamp_list[0];
if (temptime != starttime && temptime != endtime)
{
RecallInfo info1;
info1.starttime = starttime;
info1.endtime = temptime - 1;
RecallInfo info2;
info2.starttime = temptime + 1;
info2.endtime = endtime;
recallinfo_list.append(info1);
recallinfo_list.append(info2);
}
else
{
RecallInfo info;
info.starttime = starttime + 1;
info.endtime = endtime - 1;
recallinfo_list.append(info);
}
}
else //存在多条数据
{
for (int i = 1; i < timestamp_list.size(); i++)
{
if (i == 1)
{
timestamp_list[0];//头数据
timestamp_list[timestamp_list.size() - 1];//尾数据
if (timestamp_list[0] - starttime > 600)
{
RecallInfo info;
info.starttime = starttime + 1;
info.endtime = timestamp_list[0] - 1;
recallinfo_list.append(info);
}
if (endtime - timestamp_list[timestamp_list.size() - 1] > 600)
{
RecallInfo info;
info.starttime = timestamp_list[timestamp_list.size() - 1] + 1;
info.endtime = endtime - 1;
recallinfo_list.append(info);
}
}
long long temptime1 = timestamp_list[i - 1];
long long temptime2 = timestamp_list[i];
if (temptime2 - temptime1 > 600)
{
RecallInfo info;
info.starttime = temptime1 + 1;
info.endtime = temptime2 - 1;
recallinfo_list.append(info);
}
}
}
for (int i = 0; i < recallinfo_list.size(); i++)
{
long long duration = recallinfo_list[i].endtime - recallinfo_list[i].starttime;
long long max_interval = 3600;
for (long long j = 0; j <= duration; j += max_interval)
{
if (j + max_interval > duration) {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].endtime;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end - 10;
recallinfo_list_hour.append(info);
}
else {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].starttime + j + max_interval;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end - 10;
recallinfo_list_hour.append(info);
}
}
}
LD_info_t* LD_info = find_LD_info_only_from_mp_id(id);
if (LD_info == NULL || LD_info->read_flag == 0) {
printf("\n Find LD_info == null \n");
}
else {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
}
}
bool CheckPG_To_Recall_web_test(long long start, long long end, char* Monitorid)
{
QDateTime deltime_Qtime = QDateTime::fromTime_t(start);
QDateTime deltime_Qtime_end = QDateTime::fromTime_t(end);
QString tmp_chr1 = deltime_Qtime.toString("yyyy-MM-dd"); //当前天
QString start_chr1 = deltime_Qtime.toString("yyyy-MM-dd hh:mm:ss"); //当前天
QString end_chr1 = deltime_Qtime_end.toString("yyyy-MM-dd hh:mm:ss"); //当前天
int timespan = 3;//默认时间间隔
try {
/*int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
//printf("\nPostgreSL 1 %s \n", POSTGRES_SCHEMA);
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "select \"exp_num\",\"act_num\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(tmp_chr1.toAscii().data());
str1.append("' AND \"monitor_id\" = '");
str1.append(Monitorid);
str1.append("'");
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
double exp_num;
double act_num;
while (!i.eof()) { //while not end-of-data
i >> exp_num >> act_num;*/
std::vector<std::string> codes;//入参集合
QMap<QString, intact_list*> intact_list_map;
codes.push_back("deciderecall");
codes.push_back(tmp_chr1.toStdString());
codes.push_back(std::string(Monitorid));
parse_intact_web_test_read(&intact_list_map,codes);
codes.clear();
try {
//char exp_num[64];
//char act_num[64];
double exp_num;
double act_num;
// 遍历终端台账容器
QMap<QString, intact_list*>::iterator it;
for (it = intact_list_map.begin(); it != intact_list_map.end(); ++it) {
intact_list* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
//strncpy(exp_num, value->exp_num.c_str(), sizeof(exp_num) - 1);
//strncpy(act_num, value->act_num.c_str(), sizeof(act_num) - 1);
exp_num = atof(value->exp_num);
act_num = atof(value->act_num);
std::cout << exp_num << " " << act_num << std::endl;
timespan = 1440 / exp_num;
printf("\n %f %f %d \n", exp_num, act_num, timespan);
}
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
//OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
try {
long long starttime = start; //补招起始时间
long long endtime = starttime + 3599; //补招结束时间
QList<long long> timestamp_list; //数据库完整性记录时间点
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
/* int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0) {
int ret = OTLConnect();
}
//OTLConnect();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str3 = POSTGRES_TABLEPREFIX;//schame analy
std::string str1 = "SELECT unnest(value_time) AS timestamp_value FROM \"";
str1.append(str2);
str1.append("\".\"");
str1.append(str3);
str1.append("meas_pq_measpoint_intact_tr\" ");
str1.append("WHERE \"statistical_date\" = '");
str1.append(tmp_chr1.toAscii().data());
str1.append("' AND \"monitor_id\" = '");
str1.append(Monitorid);
str1.append("' ORDER BY timestamp_value");
std::string str4 = "select b1.timestamp_value from (";
str4.append(str1);
str4.append(") b1 where b1.timestamp_value >= '");
str4.append(start_chr1.toAscii().data());
str4.append("' and b1.timestamp_value <= '");
str4.append(end_chr1.toAscii().data());
str4.append("'");
otl_stream i(1, // buffer size
str4.c_str(),
//SELECT statement
db //connect object
);
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> timestamp;*/
std::vector<std::string> codes;//入参集合
QMap<QString, intact_list*> intact_list_map;
codes.push_back("handlerecall");
codes.push_back(tmp_chr1.toStdString());
codes.push_back(std::string(Monitorid));
codes.push_back(start_chr1.toStdString());
codes.push_back(end_chr1.toStdString());
parse_intact_web_test_read(&intact_list_map,codes);
codes.clear();
try {
otl_datetime timestamp;
// 遍历终端台账容器
if (intact_list_map.contains(Monitorid)) {
intact_list* value = intact_list_map.value(Monitorid); // 找到键值为 "id" 的对象
if (value != nullptr) {
// 遍历 value_time 容器并输出所有时间字符串
for (std::vector<std::string>::const_iterator it = value->value_time.begin(); it != value->value_time.end(); ++it) {
const std::string& time = *it;
std::cout << "Time: " << time << std::endl;
timestamp = parseTimestamp(time);
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t timestamp = std::mktime(&timeinfo);
long long stamp = static_cast<long long>(timestamp);
timestamp_list.append(stamp);
}
}
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
//OTLDisconnect();
if (timestamp_list.size() <= (60 / timespan) * 0.97) //完整性数据表无数据
{
printf("\n return ture %d %f\n", timestamp_list.size(), (60 / timespan) * 0.97);
return true;
}
else
{
printf("\n return false %d %f\n", timestamp_list.size(), (60 / timespan) * 0.97);
return false;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
printf("\n>>>error quit!!\n");
return true;
}
//初始化的web测试接口
int parse_device_cfg_web_test()
{
qDebug() << "parse_device_cfg_web" << endl;
std::vector<std::string> codes;
//多前置判断
if (FRONT_INST == 0 || FRONT_IP[0] == '\0') {
MULTIPLE_NODE_FLAG = 0;
cout << "set MULTIPLE_NODE_FLAG:0,because do not have FRONT_INST or FRONT_IP" << endl;
}
char front_type[2] = {""};
int mp_num = 0;
//用web接口替换前置表的读写接口中解析结果存入容器从接口直接取出容器从容器中获取需要的值写入时直接传参
if (MULTIPLE_NODE_FLAG) {
//前置表读取部分替换
/*QString selectFrontSql;
selectFrontSql.append(QString("select \"front_type\",\"mp_num\" from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where \"front_ip\" = '0.0.0.0' and \"front_inst\"=0"));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
OTLConnect();
otl_stream i2(1, // buffer size
selectFrontSql.toStdString().c_str(),
db //connect object
);
while (!i2.eof()) { //while not end-of-data
i2 >> front_type >> mp_num;
break;
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}*/
QMap<QString, front_list*> front_map;
codes.push_back("info");
parse_device_web_test_front_read(&front_map,codes);
codes.clear();
// 遍历 QMap 容器
QMap<QString, front_list*>::iterator it;
for (it = front_map.begin(); it != front_map.end(); ++it) {
front_list* value = it.value();
// 确保 value 不为空
if (it.key() == "0.0.0.0" && value != nullptr) {
// 从 value 中读取 front_type保留前两个字符
strncpy(front_type, value->front_type, 2);
front_type[2] = '\0'; // 确保以空字符结尾
// 将 mp_num 从字符串转换为整数
mp_num = std::atoi(value->mp_num);
}
}
//前置表读取部分
//前置表写入部分
/*QString addFrontSql;
addFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
addFrontSql.append(QString("values('%1',10000,%2,'%3','01','%4',200) ").arg(FRONT_IP).arg(FRONT_INST).arg(front_type).arg(PROGRAM_VERSION));
addFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
addFrontSql.append(QString("\"front_type\"= '%1',\"front_version\"='%2'").arg(front_type).arg(PROGRAM_VERSION));
cout << addFrontSql.toStdString().c_str() << endl;
OTLConnect();
int rt = write_to_db(addFrontSql.toStdString().c_str());
OTLDisconnect();*/
codes.push_back("insertfront");
codes.push_back(std::string(FRONT_IP));
codes.push_back(intToString(FRONT_INST));
codes.push_back(std::string(front_type));
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back("01"); //添加状态值
parse_device_web_test_front_write(codes);
codes.clear();
//前置表写入部分
}
cout << "mp_num:" << mp_num << " front_type:" << front_type << endl;
ied_t* ied;
ied_usr_t* ied_usr;
chnl_usr_t* chnl_usr;
int count_cfg = 0;
int count_real = 0;
//读取终端ext表替换为web接口
QMap<QString, terminal_ext*> terminal_ext_map;
//read_terminal_ext_pg(&terminal_ext_map);
codes.push_back("info");
parse_device_web_test_ext(&terminal_ext_map,codes);
codes.clear();
//读取终端ext表替换为web接口
//读取终端台账表总数替换为web接口
/*try {
OTLConnect();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("meas_pq_dev_tr");
str1.append("\" where tmnl_status='20';");
cout << "pg sql1 is:" << str1 << endl;
otl_stream i(1, // buffer size
str1.c_str(),
db //connect object
);
int f2;
while (!i.eof()) { //while not end-of-data
i >> f2;
}
OTLDisconnect();
count_cfg = f2;;//读数据库
cout << "dev_count=" << count_cfg << endl;
}
catch (otl_exception& e)
{
printf("\ndev PostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}*/
QMap<QString, terminal_dev*> terminal_dev_map;
codes.push_back("count_cfg");
parse_device_web_test_dev(&terminal_dev_map,codes);
// 遍历 QMap 容器
QMap<QString, terminal_dev*>::iterator it;
for (it = terminal_dev_map.begin(); it != terminal_dev_map.end(); ++it) {
terminal_dev* value = it.value();
// 确保 value 不为空
if (it.key() == "count_cfg" && value != nullptr) {
// 将 count 从字符串转换为整数
count_cfg = std::atoi(value->count_cfg);
}
//调试用
cout << "count_cfg:" << count_cfg << " value->count_cfg:" << value->count_cfg << endl;
}
codes.clear();
//取完count——cfg要将容器清0否则影响取台账逻辑
terminal_dev_map.clear();
//读取终端台账表总数替换为web接口
//读取终端台账表替换为web接口
codes.push_back("info");
codes.push_back(intToString(FRONT_INST));
codes.push_back(intToString(mp_num));
codes.push_back(intToString(count_cfg));
codes.push_back(intToString(MULTIPLE_NODE_FLAG));
codes.push_back(intToString(g_front_seg_num));
parse_device_web_test_dev(&terminal_dev_map,codes);
codes.clear();
if (MULTIPLE_NODE_FLAG && g_front_seg_num == 0) {
if (mp_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * mp_num;
}
else
{
count_cfg = mp_num;
}
}
else if (MULTIPLE_NODE_FLAG && g_front_seg_num != 0) {
int front_num = (count_cfg / g_front_seg_num) + 1;
if (front_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * front_num;
}
else
{
count_cfg = front_num;
}
}
g_node->n_clients = count_cfg; //总数读不到后续就会出错
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
/* std::string strSchame = POSTGRES_SCHEMA;//schame analy
std::string strDevSQL = "select \"terminal_id\",\"terminal_code\",\"org_name\",\"maint_name\",\"station_name\",\"tmnl_ip\",\"tmnl_port\",\"tmnl_factory\",\"tmnl_type\",\"tmnl_status\",\"update_time\" from \"";
strDevSQL.append(strSchame);
strDevSQL.append("\".\"");
strDevSQL.append(POSTGRES_TABLEPREFIX);
strDevSQL.append("meas_pq_dev_tr");
strDevSQL.append("\" where tmnl_status='20'");
if (MULTIPLE_NODE_FLAG && g_front_seg_num == 0) {
strDevSQL.append(" ORDER BY terminal_id OFFSET ");
strDevSQL.append(QString::number((FRONT_INST - 1) * mp_num).toStdString());
strDevSQL.append(" LIMIT ");
strDevSQL.append(QString::number(mp_num).toStdString());
if (mp_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * mp_num;
}
else
{
count_cfg = mp_num;
}
}
else if (MULTIPLE_NODE_FLAG && g_front_seg_num != 0) {
int front_num = (count_cfg / g_front_seg_num) + 1;
strDevSQL.append(" ORDER BY terminal_code OFFSET ");
strDevSQL.append(QString::number((FRONT_INST - 1) * front_num).toStdString());
strDevSQL.append(" LIMIT ");
strDevSQL.append(QString::number(front_num).toStdString());
if (front_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * front_num;
}
else
{
count_cfg = front_num;
}
}
cout << strDevSQL << endl;
g_node->n_clients = count_cfg;
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
//读数据
try {
cout << "read dev information." << endl;
OTLConnect();
//cout << "pg sql2 is:" << str1 << endl;
//int rtState = OTLState();
// 执行长的select语句
otl_stream i(1, // buffer size
strDevSQL.c_str(),
//SELECT statement
db //connect object
);
//create select stream
char terminal_id[64];
char terminal_code[64];
char org_name[64];
char maint_name[64];
char station_name[64];
char tmnl_factory[64];
char tmnl_status[64];
char dev_type[64];
char dev_key[64];
char dev_series[64];
char addr_str[64];
char port_char[64];
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> terminal_id >> terminal_code >> org_name >> maint_name >> station_name >> addr_str >> port_char >> tmnl_factory >> dev_type >> tmnl_status >> timestamp;
*/
//读取终端台账表替换为web接口
//////////////////////////////////////////////////////////////////////////////////////////////////
//读数据
try {
char terminal_id[64];
char terminal_code[64];
char org_name[64];
char maint_name[64];
char station_name[64];
char tmnl_factory[64];
char tmnl_status[64];
char dev_type[64];
char dev_key[64];
char dev_series[64];
char addr_str[64];
char port_char[64];
//char timestamp[64];
otl_datetime timestamp;
// 遍历终端台账容器
QMap<QString, terminal_dev*>::iterator it;
for (it = terminal_dev_map.begin(); it != terminal_dev_map.end(); ++it) {
terminal_dev* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
strncpy(terminal_id, value->terminal_id, sizeof(terminal_id) - 1);
strncpy(terminal_code, value->terminal_code, sizeof(terminal_code) - 1);
strncpy(org_name, value->org_name, sizeof(org_name) - 1);
strncpy(maint_name, value->maint_name, sizeof(maint_name) - 1);
strncpy(station_name, value->station_name, sizeof(station_name) - 1);
strncpy(tmnl_factory, value->tmnl_factory, sizeof(tmnl_factory) - 1);
strncpy(tmnl_status, value->tmnl_status, sizeof(tmnl_status) - 1);
strncpy(dev_type, value->dev_type, sizeof(dev_type) - 1);
//strncpy(dev_key, value->dev_key, sizeof(dev_key) - 1);
//strncpy(dev_series, value->dev_series, sizeof(dev_series) - 1);
strncpy(addr_str, value->addr_str, sizeof(addr_str) - 1);
strncpy(port_char, value->port, sizeof(port_char) - 1);
//strncpy(timestamp, value->timestamp, sizeof(timestamp) - 1);
timestamp = parseTimestamp(value->timestamp);
}
/////////////////////////////////////////////////////////////////////////////////
ied = g_node->clients[count_real++];
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, MAX_CPUNO * sizeof(LD_info_t));
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
ied->cpucount = 0;
if (strlen(terminal_id) != 0) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", terminal_id);//terminal_id
cout << "ied_usr->terminal_id:" << ied_usr->terminal_id << endl;
}
if (terminal_code != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", terminal_code);//terminal_code
cout << "ied_usr->terminal_code:" << ied_usr->terminal_code << endl;
}
if (org_name != NULL) {
apr_snprintf(ied_usr->org_name, sizeof(ied_usr->org_name), "%s", org_name);//org_name
cout << "ied_usr->org_name:" << ied_usr->org_name << endl;
}
if (maint_name != NULL) {
apr_snprintf(ied_usr->maint_name, sizeof(ied_usr->maint_name), "%s", maint_name);//maint_name
cout << "ied_usr->maint_name:" << ied_usr->maint_name << endl;
}
if (station_name != NULL) {
apr_snprintf(ied_usr->station_name, sizeof(ied_usr->station_name), "%s", station_name);//station_name
cout << "ied_usr->station_name:" << ied_usr->station_name << endl;
}
if (tmnl_factory != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", tmnl_factory);//tmnl_factory
cout << "ied_usr->tmnl_factory:" << ied_usr->tmnl_factory << endl;
}
if (tmnl_status != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", tmnl_status);//tmnl_status
cout << "ied_usr->tmnl_status:" << ied_usr->tmnl_status << endl;
}
if (dev_type != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", dev_type);//dev_type
cout << "ied_usr->dev_type:" << ied_usr->dev_type << endl;
}
cout << "code" << ied_usr->terminal_code << endl;
if (terminal_ext_map.contains(QString::fromUtf8(ied_usr->terminal_code))) {
//terminal_ext* ext = terminal_ext_map.value(ied_usr->terminal_code);
terminal_ext* ext = terminal_ext_map.value(QString::fromUtf8(ied_usr->terminal_code));
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ext->terminal_key);//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ext->terminal_identify_code);//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else
{
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Key
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
//QByteArray ba = QByteArray::fromBase64(devPropVal.toAscii());//DEV_Series
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;//channel
ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
if (addr_str != NULL) {
ied->channel[0].addr = ntohl(inet_addr(addr_str));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
else
{
ied->channel[0].addr = ntohl(inet_addr("0.0.0.0"));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
if (port_char != NULL) {
int port = 102;
if (stringToInt(port_char, &port)) {
// 转换成功portStr全为数字并且已经转换为int类型的port
ied->channel[0].port = port;//DEV_PortID
cout << "ied_usr->port:" << ied->channel[0].port << endl;//DEV_PortID
}
else {
ied->channel[0].port = 102;//DEV_PortID
cout << "ied_usr->port:" << port_char << ",非合法端口.使用默认端口:" << ied->channel[0].port << endl;//DEV_PortID
}
}
if (timestamp.year != 0) {
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
ied_usr->time = static_cast<long long>(time);
cout << "ied_usr->time:" << ied_usr->time << endl;
}
////////////////////////////////
/*// 定义年、月、日、时、分、秒变量
int year, month, day, hour, minute, second;
// 使用字符串流进行解析
std::istringstream ss(timestamp);
char discard; // 用于丢弃分隔符
// 解析字符串
ss >> year >> discard >> month >> discard >> day >> hour >> discard >> minute >> discard >> second;
std::cout << "" << year << "" << month<< "" << day<< "" << hour<< "" << minute<< "" << second<<std::endl;
if (year != 0) {
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = year - 1900; // 年份需要减去1900
timeinfo.tm_mon = month - 1; // 月份需要减去1
timeinfo.tm_mday = day;
timeinfo.tm_hour = hour;
timeinfo.tm_min = minute;
timeinfo.tm_sec = second;
time_t time = std::mktime(&timeinfo);
ied_usr->time = static_cast<long long>(time);
cout << "ied_usr->time:" << ied_usr->time << endl;
}*/
/////////////////////////////////////
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
//调试用
std::cout << "value:" << terminal_id <<" "<<terminal_code <<" "<<org_name <<" "<<maint_name <<" "<<station_name <<" "<<tmnl_factory <<" "<< tmnl_status <<" "<<dev_type <<" "<<addr_str <<" "<<port_char <<" "<<timestamp.year<< std::endl;
}
//OTLDisconnect();//读取终端台账表替换为web接口
//list循环结束
//替换前置表更新部分
if (MULTIPLE_NODE_FLAG) {
/*QString updateFrontSql;//待组装的pgsql语句
updateFrontSql.append(QString("update \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("set \"mp_num\"= %1 ").arg(count_real));
updateFrontSql.append(QString("where \"front_ip\" = '%1' and \"front_inst\"=%2").arg(FRONT_IP).arg(FRONT_INST));
OTLConnect();
int rt = write_to_db(updateFrontSql.toStdString().c_str());
OTLDisconnect();*/
codes.push_back("updatefront");
codes.push_back(std::string(FRONT_IP));
codes.push_back(intToString(FRONT_INST));
codes.push_back(intToString(count_real));
codes.push_back(std::string(PROGRAM_VERSION)); //和定时任务的update一样写入PROGRAM_VERSION
parse_device_web_test_front_write(codes);
codes.clear();
//替换前置表更新部分
}
if (count_real < count_cfg)
g_node->n_clients = count_real;
if (count_cfg != count_real)
return APR_EBADF;
cout << "dev init create count:" << count_real;
return APR_SUCCESS;
}
catch (otl_exception& e)
{
printf("\ndev tr\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
}
int parse_line_cfg_web_test()
{
ied_t* ied;
ied_usr_t* ied_usr;
int count_cfg = 0;
int count_real = 0;
LD_info_t line_info;
std::vector<std::string> codes;//入参集合
//监测点数量
/*try {
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select count(*) from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor");
str1.append("\" where status<>'04' and status<>'05' and \"terminal_code\" in (");
int dev_no = 0;
cout << "n_clients:" << g_node->n_clients << endl;
if (g_node->n_clients <= 0) {
cout << "no terminal exist " << endl;
return APR_EBADF;
}
for (dev_no = 0; dev_no < g_node->n_clients; dev_no++) {
str1.append("'");
str1.append(((ied_usr_t*)(g_node->clients[dev_no]->usr_ext))->terminal_code);
str1.append("'");
if (dev_no < g_node->n_clients - 1) {
str1 += ",";
}
}
str1.append(")");
cout << "pg sql1 is:" << str1 << endl;
OTLConnect();
otl_stream i(1,str1.c_str(),db);
int f2;
while (!i.eof()) {
i >> f2;
}
OTLDisconnect();
count_cfg = f2;;//读数据库
cout << "line_count=" << count_cfg << endl;
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}*/
//前置对应的监测点数量将根据监测点信息中的终端号进行统计,而不是直接从数据库获取
//监测点数量
//检测点数据
QMap<QString, ledger_monitor*> ledger_monitor_map;
codes.push_back("info");
parse_line_web_test(&ledger_monitor_map,codes);
codes.clear();
/*根据终端号整理监测点数量和监测点数据*/
std::cout << "n_clients:" << g_node->n_clients << std::endl;
if (g_node->n_clients <= 0) {
std::cout << "no terminal exist " << std::endl;
return APR_EBADF;
}
/*这段处理放在容器处理中
for (dev_no = 0; dev_no < g_node->n_clients; dev_no++) {
if(((ied_usr_t*)(g_node->clients[dev_no]->usr_ext))->terminal_code);
}*/
//读数据
/*try {
OTLConnect();
std::string str2 = POSTGRES_SCHEMA;//schame analy
std::string str1 = "select \"monitor_id\",\"terminal_code\",\"monitor_name\",\"logical_device_seq\",\"voltage_level\",\"terminal_connect\",\"update_time\" from \"";
str1.append(str2);
str1.append("\".\"");
str1.append(POSTGRES_TABLEPREFIX);
str1.append("pq_ledger_monitor");
str1.append("\" where status<>'04' and status<>'05' and \"terminal_code\" in (");
int dev_no = 0;
for (dev_no = 0; dev_no < g_node->n_clients; dev_no++) {
str1.append("'");
str1.append(((ied_usr_t*)(g_node->clients[dev_no]->usr_ext))->terminal_code);
str1.append("'");
if (dev_no < g_node->n_clients - 1) {
str1 += ",";
}
}
str1.append(")");
cout << "pg sql2 is:" << str1 << endl;
//int rtState = OTLState();
otl_stream i(1, // buffer size
str1.c_str(),
//SELECT statement
db //connect object
);
//create select stream
char monitor_id[64];
char terminal_code[64];
char monitor_name[64];
char logical_device_seq[64];
char voltage_level[64];
char terminal_connect[64];
otl_datetime timestamp;
while (!i.eof()) { //while not end-of-data
i >> monitor_id >> terminal_code >> monitor_name >> logical_device_seq >> voltage_level >> terminal_connect >> timestamp;
cout << "monitor_id=" << monitor_id << " terminal_code=" << terminal_code << " monitor_name=" << monitor_name << " logical_device_seq=" << logical_device_seq;
cout << " voltage_level=" << voltage_level << " terminal_connect=" << terminal_connect;
cout << " timestamp: " << timestamp.year << "-" << timestamp.month << "-" << timestamp.day << " " << timestamp.hour << ":" << timestamp.minute << ":" << timestamp.second << endl;*/
//读数据
try {
char monitor_id[64];
char terminal_code[64];
char monitor_name[64];
char logical_device_seq[64];
char voltage_level[64];
char terminal_connect[64];
//char timestamp[64];
otl_datetime timestamp;
// 遍历终端台账容器
QMap<QString, ledger_monitor*>::iterator it;
for (it = ledger_monitor_map.begin(); it != ledger_monitor_map.end(); ++it) {
ledger_monitor* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
strncpy(monitor_id, value->monitor_id, sizeof(monitor_id) - 1);
strncpy(terminal_code, value->terminal_code, sizeof(terminal_code) - 1);
strncpy(monitor_name, value->monitor_name, sizeof(monitor_name) - 1);
strncpy(logical_device_seq, value->logical_device_seq, sizeof(logical_device_seq) - 1);
strncpy(voltage_level, value->voltage_level, sizeof(voltage_level) - 1);
strncpy(terminal_connect, value->terminal_connect, sizeof(terminal_connect) - 1);
//strncpy(timestamp, value->timestamp, sizeof(timestamp) - 1);
timestamp = parseTimestamp(value->timestamp);
}
count_cfg = ledger_monitor_map.size();//获取监测点表的条数
//检测点数据
count_real++;
memset(&line_info, 0, sizeof(line_info));
line_info.line_id = count_real;
//cout << "line_id:" << line_info.line_id << endl;
strcpy(line_info.mp_id, monitor_id);
//cout << "mp_id:" << line_info.mp_id << endl;
strcpy(line_info.terminal_code, terminal_code);
//cout << "terminal_code:" << line_info.terminal_code << endl;
if (isCharPtrEmpty(logical_device_seq)) {
line_info.cpuno = 1;
//cout << "logical_device_seq:is null~"<< line_info.cpuno << endl;
}
else {
line_info.cpuno = std::atoi(logical_device_seq);
//cout << "logical_device_seq:"<< logical_device_seq << endl;
}
//cout << "cpuno:" << line_info.cpuno << endl;
strcpy(line_info.voltage_level, voltage_level);
//cout << "voltage_level:" << line_info.voltage_level << endl;
strcpy(line_info.v_wiring_type, terminal_connect);
//cout << "v_wiring_type:" << line_info.v_wiring_type << endl;
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
line_info.time = static_cast<long long>(time);
//cout << "time:" << line_info.time << endl;
strcpy(line_info.name, monitor_name);
//cout << "name:" << line_info.name << endl;
line_info.read_flag = 1;
ied = find_ied_from_dev_code(line_info.terminal_code);
if (ied && ied->usr_ext && line_info.cpuno && line_info.cpuno < 10) {
char str[256];
byte_t cpuno = line_info.cpuno;
//cout << "cpuno:" << line_info.cpuno << endl;
//cout << "byte_t cpuno:" << cpuno-1 << endl;
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->LD_info[cpuno - 1] = line_info;
ied_usr->LD_info[cpuno - 1].ied = ied;
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].rptcount = 0;
//cout << "rptcount:" << ied_usr->LD_info[cpuno - 1].rptcount << endl;
if (cpuno > ied->cpucount) {
//int c = cpuno;
//cout << "cpucount(linecount old):" << (int)(ied->cpucount) << "new:" << c << endl;
ied->cpucount = cpuno;
//cout << "byte_t cpucount:" << ied->cpucount+1 << endl;
}
}
}
OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nledger monitor\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
if (count_cfg != count_real)
return APR_EBADF;
return APR_SUCCESS;
}
int parse_model_cfg_web_test()
{
std::vector<std::string> codes;//入参集合
QMap<QString, icd_model*> icd_model_map;
codes.push_back("info");
parse_model_web_test(&icd_model_map,codes);
codes.clear();
try {
char model_id[64];
char tmnl_type[64];
char tmnl_factory[64];
char file_name[128];
//char timestamp[64];
otl_datetime timestamp;
// 遍历终端台账容器
QMap<QString, icd_model*>::iterator it;
for (it = icd_model_map.begin(); it != icd_model_map.end(); ++it) {
icd_model* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
strncpy(model_id, value->model_id, sizeof(model_id) - 1);
strncpy(tmnl_type, value->tmnl_type, sizeof(tmnl_type) - 1);
strncpy(tmnl_factory, value->tmnl_factory, sizeof(tmnl_factory) - 1);
strncpy(file_name, value->file_name, sizeof(file_name) - 1);
//strncpy(timestamp, value->timestamp, sizeof(timestamp) - 1);
timestamp = parseTimestamp(value->timestamp);
Set_xml_databaseinfo(model_id, tmnl_type, tmnl_factory, file_name, timestamp.year, timestamp.month, timestamp.day, timestamp.hour, timestamp.minute, timestamp.second);
}
}
}
catch (otl_exception& e)
{
printf("\nicd model\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
}
#if 0
//定时任务的sql修改为web
void OnTimerThread::run()
{
msleep(10000);
printf("OnTimerThread::run() is called ...... \n");
static int delectflag = 1;//定时日志清理标记
bool account_update = true;
bool asd = true;
apr_time_t previousTime = apr_time_now();//
apr_time_exp_t localTime;
apr_time_exp_gmt(&localTime, previousTime);
cout << "Local Time: "
<< localTime.tm_year + 1900 << "-" << localTime.tm_mon + 1 << "-" << localTime.tm_mday << " "
<< localTime.tm_hour << ":" << localTime.tm_min << ":" << localTime.tm_sec
<< endl;
QMap<QString, bool> dic_task_block;
// 向QMap中添加键值对
dic_task_block.insert("account", false);
dic_task_block.insert("recruit ", false);
dic_task_block.insert("log", false);
dic_task_block.insert("multi_node", false);
int ip_count = 0;
int telnet_count = 0;
// 查找键值对
if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {
init_ping_telnet(ip_count, telnet_count);
Cout_account_information();
}
if (g_onlyIP[0] != 0)
{
printf("g_onlyIP[0]=!0 ontimer--%s--\n", g_onlyIP);
add_comm_log(const_cast<char*>("g_onlyIP[0]=!0,g_onlyIP is --%s--", g_onlyIP));
}
else {
printf("g_onlyIP[0] == 0!");
}
int pgflag = 0;
int pgmin = 0;
int mp_num_hour = 0;
int recall_flag1 = 1;
//添加入参容器
std::vector<std::string> codes;
//char recalllllll[256] = "0923000982";
//CheckPG_To_Recall(1705168800, 1705168800 + 3599, recalllllll);
while (1)
{
/*cout << "ip_count:" << ip_count << " telnet_count:" << telnet_count << endl;
msleep(1000);*/
//进入线程时间
previousTime = apr_time_now();
apr_time_exp_gmt(&localTime, previousTime);
//apr_time_t elapsedTime = currentTime - previousTime;
//apr_time_as_msec(elapsedTime);
//cout << "front num:" << FRONT_MP_NUM << endl;
if (strcmp(subdir, "cfg_stat_data") == 0 || strcmp(subdir, "cfg_newhis_data") == 0) {//台账更新,多节点,通讯
//读取上次台账更新时间
//判断间隔执行
if (false) {
//执行台账任务;
}
//记录现在时间
//
//判断执行此任务时间段内是否有 任务被堵塞
if (MULTIPLE_NODE_FLAG && pgflag) {
if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
//修改为web接口更新前置表
/*QString updateFrontSql;//待组装的pgsql语句
updateFrontSql.append(QString("update \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("set \"mp_num\"= %1,front_version='%2' ").arg(FRONT_MP_NUM).arg(PROGRAM_VERSION));
updateFrontSql.append(QString("where \"front_ip\" = '%1' and \"front_inst\"=%2;").arg(FRONT_IP).arg(FRONT_INST));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁*/
codes.push_back("updatefront");
codes.push_back(std::string(FRONT_IP));
codes.push_back(intToString(FRONT_INST));
codes.push_back(intToString(FRONT_MP_NUM));
codes.push_back(std::string(PROGRAM_VERSION));
parse_device_web_test_front_write(codes);
codes.clear();
}
pgflag = 0;
}
else if (MULTIPLE_NODE_FLAG && pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
if (mp_num_hour != localTime.tm_hour) {
std::string mp_num_str = "";
mp_num_str.append("connected device count:");
mp_num_str.append(QString::number(FRONT_MP_NUM).toStdString());
mp_num_str.append(",g_node clients:");
mp_num_str.append(QString::number(g_node->n_clients).toStdString());
add_comm_log(const_cast<char*>(mp_num_str.c_str()));
mp_num_hour = localTime.tm_hour;
}
//2023-10-17 zw新增 定期obs oss和sql数据库记录删除
if (delectflag == 1 && localTime.tm_hour == 16)
{
delectflag = 0;
//time_t timestamp = apr_time_as_time_t(previousTime);
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
if (FILE_FLAG == 1) //阿里云 oss 文件删除
{
//PutOSS("comtrade/not def/20231111/temp2.log", "/FeProject/dat/9D3AAA2BDCE430BA7E3E1302F132B880.xml");
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
long long deltime = stamp - (60 * 60 * 24 * 30);//减去30天
QDateTime deltime_Qtime = QDateTime::fromTime_t(deltime);
QString tmp_chr1 = deltime_Qtime.toString("yyyyMMdd");
QString Oss_Del_Path = NULL;
Oss_Del_Path.append("comtrade/");
Oss_Del_Path.append(LD_info->mp_id).append("/");
Oss_Del_Path.append(tmp_chr1).append("/");
//cout << Oss_Del_Path.toAscii().data() << endl;
DelOSS(Oss_Del_Path.toAscii().data());
cpuno++;
}
i++;
}
//PutOSS("comtrade/not def/20231111/temp.log","/FeProject/dat/6A5C8A2A7BBC1A61D9EC3F1AE2A25A03.xml");
//PutOSS("comtrade/not def/20231111/temp2.log", "/FeProject/dat/6A5C8A2A7BBC1A61D9EC3F1AE2A25A03.xml");
//PutOSS("comtrade/not def/20231111/temp3.log", "/FeProject/dat/6A5C8A2A7BBC1A61D9EC3F1AE2A25A03.xml");
//DelOSS("comtrade/not def/20231111/temp3.log");
}
else if (FILE_FLAG == 2)//华为云 obs 文件删除
{
//OBSFile("/FeProject/dat/67BC249C13B5EC819CF4DF0307DB71C5.xml", "comtrade/not def/20231111/temp3.log", "putObject");
//OBSFile_del("comtrade/not def/20231111/temp3.log", "deleteObject");
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
long long deltime = stamp - (60 * 60 * 24 * 30);//减去30天
QDateTime deltime_Qtime = QDateTime::fromTime_t(deltime);
QString tmp_chr1 = deltime_Qtime.toString("yyyyMMdd");
QString Oss_Del_Path = NULL;
Oss_Del_Path.append("comtrade/");
Oss_Del_Path.append(LD_info->mp_id).append("/");
Oss_Del_Path.append(tmp_chr1).append("/");
//cout << Oss_Del_Path.toAscii().data() << endl;
OBSFile_del(Oss_Del_Path.toAscii().data(), "deleteObject");
cpuno++;
}
i++;
}
}
//pgsql删除记录
long long deltime = stamp - (60 * 60 * 24 * 30);//减去30天
QDateTime deltime_Qtime = QDateTime::fromTime_t(deltime);
QString tmp_chr1 = deltime_Qtime.toString("yyyy-MM-dd");
//替换成web接口
/*QString pgsql0;
pgsql0.append(QString("DELETE FROM \"%1\".\"%2meas_pq_comm_status_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql1;
pgsql1.append(QString("DELETE FROM \"%1\".\"%2meas_pq_comm_error_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql2;
pgsql2.append(QString("DELETE FROM \"%1\".\"%2meas_pq_measpoint_rationality_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql3;
pgsql3.append(QString("DELETE FROM \"%1\".\"%2meas_pq_measpoint_intact_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
QString pgsql4;
pgsql4.append(QString("DELETE FROM \"%1\".\"%2meas_pq_measpoint_match_tr\ WHERE \"statistical_data\" < '%3';").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX).arg(tmp_chr1));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(pgsql0);
Sql_data_list.append(pgsql1);
Sql_data_list.append(pgsql2);
Sql_data_list.append(pgsql3);
Sql_data_list.append(pgsql4);
Sql_data_list_mutex.unlock(); //解锁*/
codes.push_back("delete");
codes.push_back(tmp_chr1.toStdString());
parse_database_delete(codes);
codes.clear();
}
if (delectflag == 0 && localTime.tm_hour != 16)
{
delectflag = 1;
}
//2023-10-17 zw新增 定期obs oss和sql数据库记录删除 end
}
if (strcmp(subdir, "cfg_newhis_data") == 0) {//上海定时招装置日志
static int hour_time = 0;
if (localTime.tm_hour != hour_time) {
hour_time = localTime.tm_hour;
printf(">>>cfg_newhis_data is run!!!\n");
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
long long start = stamp - (stamp % 3600) - 3600 - 3600;//开始时间 当前整点值往前推两小时
long long end = start + 3599;//结束时间
QList<RecallInfo> recallinfo_list_hour;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end;
recallinfo_list_hour.append(info);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED) {
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
if (LD_info->logcount <= 0 || LD_info->read_flag == 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
i++;
}
}
}
if (strcmp(subdir, "cfg_recallall_data") == 0)
{
static int recall_xml_time = 0;
if (localTime.tm_min != recall_xml_time)
{
recall_xml_time = localTime.tm_min;
//补招开始与截止时间
static long long recall_start_time = 0;
static long long recall_end_time = 0;
static int flag = 0;
if (recall_start_time == 0 && recall_end_time == 0) {//无缓存数据
//查询一条 -1状态(代补招)的记录
char front_ip[42];
cout << "start select:" << endl;
//替换为web接口
/*QString selectFrontSql;
selectFrontSql.append(QString("select \"front_ip\" from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where front_inst=%1 and \"front_status\" = '-1' LIMIT 1;").arg(g_front_seg_index));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
otl_stream i(1, // buffer size
selectFrontSql.toStdString().c_str(),
db //connect object
);
//create select stream
while (!i.eof()) { //while not end-of-data
i >> front_ip;
break;
//cout << "count=" << f2 << endl;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
continue;
}*/
QMap<QString, front_list*> front_map;
codes.push_back("frontip");
codes.push_back("g_front_seg_index");
codes.push_back("-1");
parse_device_web_test_front_read(&front_map,codes);
codes.clear();
// 遍历 QMap 容器
QMap<QString, front_list*>::iterator it;
for (it = front_map.begin(); it != front_map.end(); ++it) {
front_list* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 从 value 中读取 front_ip
strncpy(front_ip, value->front_ip, sizeof(front_ip) - 1);
//应该只有一条记录
std::cout << "front_ip:" <<front_ip << std::endl;
}
}
if (containsDash(front_ip, 21)) {
//替换为web接口
//插入更新记录
/*QString insertFrontSql;
insertFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
insertFrontSql.append(QString("values('%1',10000,%2,'03','-1','%3',200) ").arg(front_ip).arg(g_front_seg_index).arg(PROGRAM_VERSION));
insertFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
insertFrontSql.append(QString("\"front_status\"= '%1'").arg("-2"));
cout << insertFrontSql.toStdString().c_str() << endl;
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(insertFrontSql);
Sql_data_list_mutex.unlock(); //解锁*/
codes.push_back("insertfront");
codes.push_back(std::string(front_ip));
codes.push_back(intToString(g_front_seg_index));
codes.push_back("03"); //前置类型
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back("-1"); //状态值
parse_device_web_test_front_write(codes);
codes.clear();
//缓存数据
cout << "front_ip=" << front_ip << endl;
QString startDate, endDate;
// 分割字符串
startDate = QString::fromAscii(front_ip).left(10); // 取前10个字符作为开始日期
qDebug() << "startDate=" << startDate << endl;
endDate = QString::fromAscii(front_ip + 11).left(10); // 从第10个字符开始取8个字符作为结束日期
qDebug() << "endDate=" << endDate << endl;
QDateTime start_dt = QDateTime::fromString(startDate, "yyyyMMddHH");
qDebug() << "start_dt=" << start_dt << endl;
recall_start_time = start_dt.toMSecsSinceEpoch() / 1000;
qDebug() << "recall_start_time=" << recall_start_time << endl;
QDateTime end_dt = QDateTime::fromString(endDate, "yyyyMMddHH");
qDebug() << "end_dt=" << end_dt << endl;
recall_end_time = end_dt.toMSecsSinceEpoch() / 1000;
qDebug() << "recall_end_time=" << recall_end_time << endl;
}
flag = 0;
}
else if (recall_start_time != 0 && recall_end_time != 0) {//有缓存数据
// 将时间戳转换为YYYYMMDD格式
QString date1 = timestampToYYYYMMDD(recall_start_time);
QString date2 = timestampToYYYYMMDD(recall_end_time);
// 拼接两个日期,并用'-'分隔
QString dateRange = date1 + "-" + date2;
qDebug() << "dateRange=" << dateRange << endl;
char front_status[4];
//替换为web接口
/*QString selectFrontSql;
selectFrontSql.append(QString("select front_status from \"%1\".\"%2meas_pq_front_list_tr\" ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
selectFrontSql.append(QString("where front_inst=%1 and \"front_ip\" = '%2'").arg(g_front_seg_index).arg(dateRange));
cout << selectFrontSql.toStdString().c_str() << endl;
try {
otl_stream i(1, // buffer size
selectFrontSql.toStdString().c_str(),
db //connect object
);
//create select stream
while (!i.eof()) { //while not end-of-data
i >> front_status;
break;
//cout << "count=" << f2 << endl;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
continue;
}*/
QMap<QString, front_list*> front_map;
codes.push_back("frontstatus");
codes.push_back(dateRange.toStdString()); //ip
codes.push_back("g_front_seg_index"); //inst
parse_device_web_test_front_read(&front_map,codes);
codes.clear();
// 遍历 QMap 容器
QMap<QString, front_list*>::iterator it;
for (it = front_map.begin(); it != front_map.end(); ++it) {
front_list* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 从 value 中读取 front_ip
strncpy(front_status, value->front_status, sizeof(front_status) - 1);
//应该只有一条记录
std::cout << "front_status:" <<front_status << std::endl;
}
}
qDebug() << "front_status=" << front_status << endl;
//再次判断是否为执行中状态
if (strcmp(front_status, "-1") == 0) {
//状态为-1 重新插入更新记录
//替换为web接口
/*QString updateFrontSql;
updateFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("values('%1',10000,%2,'03','-1','%3',200) ").arg(dateRange).arg(g_front_seg_index).arg(PROGRAM_VERSION));
updateFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
updateFrontSql.append(QString("\"front_status\"= '%1'").arg("-2"));
cout << updateFrontSql.toStdString().c_str() << endl;
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁*/
codes.push_back("insertfront");
codes.push_back(dateRange.toStdString());
codes.push_back(intToString(g_front_seg_index));
codes.push_back("03"); //前置类型
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back("-1"); //状态值
parse_device_web_test_front_write(codes);
codes.clear();
flag = 0;
}
else if (strcmp(front_status, "-2") == 0)
{//状态为-2 补招
flag = 1;
}
else {
flag = 0;
recall_end_time = 0;
recall_start_time = 0;
}
}
if (recall_start_time != 0 && recall_end_time != 0 && flag == 1)
{
qDebug() << "start recall time=" << recall_start_time << endl;
qDebug() << "end recall time=" << recall_end_time << endl;
long long starttime = recall_start_time; //补招起始时间
long long endtime = recall_end_time; //补招结束时间
flag = 0;
recall_start_time = 0;
recall_end_time = 0;
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
RecallInfo info;
info.starttime = starttime;
info.endtime = endtime;
recallinfo_list.append(info);
for (int i = 0; i < recallinfo_list.size(); i++)
{
//printf("\n %lld ----- %11d\n", recallinfo_list[i].starttime, recallinfo_list[i].endtime);
long long duration = recallinfo_list[i].endtime - recallinfo_list[i].starttime;
long long max_interval = 3600;
for (long long j = 0; j <= duration; j += max_interval)
{
if (j + max_interval > duration) {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].endtime;
RecallInfo info;
info.starttime = start;
info.endtime = end;
recallinfo_list_hour.append(info);
}
else {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].starttime + j + max_interval;
RecallInfo info;
info.starttime = start;
info.endtime = end - 1;
recallinfo_list_hour.append(info);
}
}
}
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED)
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
printf("/home/pq mpid=%s %d\n", LD_info->mp_id, LD_info->read_flag);
if (LD_info->logcount <= 0 || LD_info->read_flag == 0) {
continue;
}
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
g_StatisticLackList_list_mutex.lock();
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
//替换成web接口 2024-10-21 lnk
// if (CheckPG_To_Recall(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
// printf("CheckPG_To_Recall == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
if (CheckPG_To_Recall_web(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
printf("CheckPG_To_Recall_web == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
continue;
}
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList.push_back(jr);
}
g_StatisticLackList_list_mutex.unlock();
}
}
i++;
}
}
}
}
if (strcmp(subdir, "cfg_his_data") == 0)
{
if (pgflag) {
if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
//替换为web接口
/*QString updateFrontSql;
updateFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("values('his',10000,1,'02','01','%1',200) ").arg(PROGRAM_VERSION));
updateFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
updateFrontSql.append(QString("\"mp_num\"= '%1',front_version='%2'").arg(FRONT_MP_NUM).arg(PROGRAM_VERSION));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁 */
codes.push_back("his");
codes.push_back("his"); //ip
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back(intToString(FRONT_MP_NUM)); //检测点数
parse_device_web_test_front_write(codes);
codes.clear();
}
pgflag = 0;
}
else if (pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
static int cfg_his_data_hour_time = 0;
if (localTime.tm_hour != cfg_his_data_hour_time) {
cfg_his_data_hour_time = localTime.tm_hour;
printf(">>>cfg_his_data is run!!!\n");
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
long long start = stamp - (stamp % 3600) - 3600 - 3600;//开始时间 当前整点值往前推两小时
long long end = start + 3599;//结束时间
QList<RecallInfo> recallinfo_list_hour;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end;
recallinfo_list_hour.append(info);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED) {
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
if (LD_info->logcount <= 0 || LD_info->read_flag == 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
//替换成web接口 2024-10-21 lnk
//if (CheckPG_To_Recall(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
//printf("CheckPG_To_Recall == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
if (CheckPG_To_Recall_web(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
printf("CheckPG_To_Recall_web == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
continue;
}
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
i++;
}
}
}
if (strcmp(subdir, "cfg_recallhis_data") == 0)
{
if (pgflag) {
if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
//替换为web接口
/*QString updateFrontSql;
updateFrontSql.append(QString("insert into \"%1\".\"%2meas_pq_front_list_tr\"(\"front_ip\",\"front_port\",\"front_inst\",\"front_type\",\"front_status\",\"front_version\",\"mp_num\") ").arg(POSTGRES_SCHEMA).arg(POSTGRES_TABLEPREFIX));
updateFrontSql.append(QString("values('recallhis',10000,1,'02','01','%1',200) ").arg(PROGRAM_VERSION));
updateFrontSql.append(QString("on conflict(\"front_ip\",\"front_inst\") do update set "));
updateFrontSql.append(QString("\"mp_num\"= '%1',front_version='%2'").arg(FRONT_MP_NUM).arg(PROGRAM_VERSION));
Sql_data_list_mutex.lock(); //加锁
Sql_data_list.append(updateFrontSql);
Sql_data_list_mutex.unlock(); //解锁 */
codes.push_back("his");
codes.push_back("recallhis"); //ip
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back(intToString(FRONT_MP_NUM)); //检测点数
parse_device_web_test_front_write(codes);
codes.clear();
}
pgflag = 0;
}
else if (pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
}
//g_node_id == HIS_DATA_BASE_NODE_ID &&
//printf("/home/pq hour=%d\n", localTime.tm_hour);
if (0 && g_node_id == HIS_DATA_BASE_NODE_ID && (localTime.tm_hour <= 12 || localTime.tm_hour >= 20) && recall_flag1 == 1) {
recall_flag1 = 0;
QString MyKafkaIniFilename = QString("../etc/") + QString("mykafka.ini"); //+QString::fromAscii(subdir)
QSettings settings(MyKafkaIniFilename, QSettings::IniFormat);
QString dateString = settings.value("Recall/select_day").toString();
QList<RecallInfo> recallinfo_list_hour;
QByteArray byteArray = dateString.toUtf8(); // 使用 UTF-8 编码
char* charArray = byteArray.data();
Get_Recall_Time(charArray, recallinfo_list_hour);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
if (LD_info->logcount <= 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
if (LD_info->autorecallcount != 0) {
for (int j = 0; j < LD_info->autorecallcount; j++) {
delete LD_info->autorecall[j];
}
delete LD_info->autorecall;
LD_info->autorecallcount = 0;
}
LD_info->autorecallflag = 0;
LD_info->autorecallcount = recallinfo_list_hour.size();
LD_info->autorecall = new autorecall_t * [recallinfo_list_hour.size()];
printf("/home/pq recall mpid=%s\n", LD_info->mp_id);
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
printf("\n %lld ===== %11d\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime);
LD_info->autorecall[j] = new autorecall_t[1];
LD_info->autorecall[j]->start = recallinfo_list_hour[j].starttime;
LD_info->autorecall[j]->end = recallinfo_list_hour[j].endtime;
}
}
cpuno++;
}
i++;
}
QDate date = QDate::fromString(dateString, "yyyy-MM-dd");
date.addDays(-1); // 一天
settings.setValue("Recall/select_day", date.toString("yyyy-MM-dd")); // 重新写入日期字符串
}
if (localTime.tm_hour > 12 && localTime.tm_hour < 20 && recall_flag1 == 0) {
recall_flag1 = 1;
}
msleep(1000);
}
printf(">>>OnTimerThread::run() is end!!!\n");
}
#endif
#endif
/*/////////////////////////////////////////////////////////lnk10-11移除pg库sql的测试代码/////////////////////////////////////////////////////////////*/
/*/////////////////////////////////////////////////////////lnk10-24根据web接口修改/////////////////////////////////////////////////////////////*/
//添加了json字符串的入参
// 回调函数,将数据直接追加到 *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;
// 动态扩展 *ptr 的内存
char* temp = (char*)realloc(*ptr, strlen(*ptr) + realsize + 1);
if (temp == NULL) {
printf("Memory allocation failed!\n");
return 0; // 返回 0 以通知 curl 停止数据接收
}
*ptr = temp;
// 追加数据到 *ptr
strncat(*ptr, (char*)contents, realsize);
return realsize;
}
void SendJsonAPI_web(const std::string& strUrl, const char* code, const std::string& json, char** ptr) {
CURL* curl = curl_easy_init();
CURLcode res;
// 初始化 *ptr 并分配空字符串
*ptr = (char*)malloc(1);
if (*ptr == NULL) {
printf("Memory allocation failed!\n");
return;
}
(*ptr)[0] = '\0'; // 为空字符串以便 strncat 操作
if (curl) {
char url[256];
snprintf(url, sizeof(url), "%s?%s", strUrl.c_str(), code);
printf(">>>json %s\n", url);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply_http);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, ptr);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
if (!json.empty()) {
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str());
}
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
printf("web failed res code: %s\n", curl_easy_strerror(res));
} else {
//printf(">>> web return str: %s \n", *ptr);
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
} else {
printf(">>> web curl init failed\n");
}
}
/*void SendJsonAPI_web(const std::string& strUrl, const char* code, const std::string& json, char** ptr) {
// curl 初始化
CURL* curl = curl_easy_init();
CURLcode res;
if (curl) {
char url[100];
sprintf(url, "%s?%s", strUrl.c_str(), code);
printf(">>>json %s\n", url);
// 设置 URL
curl_easy_setopt(curl, CURLOPT_URL, url);
// 设置数据接收和写入函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply_web);
// 数据接收
std::string resPost0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&resPost0);
// 设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
if(json != ""){
// 设置 HTTP 方法为 POST
curl_easy_setopt(curl, CURLOPT_POST, 1L);
// 设置 JSON 格式的 body 数据
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str());
}
// 设置请求头
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 执行请求
res = curl_easy_perform(curl);
// 检查请求是否成功
if (res != CURLE_OK) {
printf("web failed res code: %s\n", curl_easy_strerror(res));
} else {
printf(">>> web return str: %s \n", resPost0.c_str());
// 分配内存并复制返回结果
*ptr = (char*)malloc(resPost0.size() + 1); // 分配足够的内存空间
if (*ptr != NULL) {
strcpy(*ptr, resPost0.c_str());
} else {
printf("Memory allocation failed!\n");
}
}
// 清理请求头
curl_slist_free_all(headers);
} else {
printf(">>> web curl init failed");
}
curl_easy_cleanup(curl);
}*/
// 打印 terminal_dev_map 中所有内容的函数
void printTerminalDevMap(const QMap<QString, terminal_dev*>& terminal_dev_map) {
QMap<QString, terminal_dev*>::const_iterator it;
for (it = terminal_dev_map.constBegin(); it != terminal_dev_map.constEnd(); ++it) {
QString key = it.key();
terminal_dev* dev = it.value();
if (dev) {
qDebug() << "Key:" << key
<< ", Terminal ID:" << QString(dev->terminal_id)
<< ", Terminal Code:" << QString(dev->terminal_code)
<< ", Organization Name:" << QString(dev->org_name)
<< ", Maintenance Name:" << QString(dev->maint_name)
<< ", Station Name:" << QString(dev->station_name)
<< ", Factory:" << QString(dev->tmnl_factory)
<< ", Status:" << QString(dev->tmnl_status)
<< ", Device Type:" << QString(dev->dev_type)
<< ", Device Key:" << QString(dev->dev_key)
<< ", Device Series:" << QString(dev->dev_series)
<< ", Address:" << QString(dev->addr_str)
<< ", Port:" << QString(dev->port)
<< ", Timestamp:" << QString(dev->timestamp);
// 打印监测点信息
for (int i = 0; i < 10; ++i) {
qDebug() << " Monitor ID:" << QString(dev->line[i].monitor_id)
<< ", Terminal Code:" << QString(dev->line[i].terminal_code)
<< ", Monitor Name:" << QString(dev->line[i].monitor_name)
<< ", Logical Device Seq:" << QString(dev->line[i].logical_device_seq)
<< ", Voltage Level:" << QString(dev->line[i].voltage_level)
<< ", Terminal Connect:" << QString(dev->line[i].terminal_connect)
<< ", Timestamp:" << QString(dev->line[i].timestamp)
<< ", Status:" << QString(dev->line[i].status);
}
} else {
qDebug() << "Key:" << key << ", Value is nullptr";
}
}
}
//打印当前进程的台账//////////////////////////////////////////////////////////////////////////
// 打印结构体信息的递归函数
void printLedger(const ied_usr_t& ied_usr) {
std::cout << "------------------------------------" << std::endl;
std::cout << "|-- terminal_id: " << ied_usr.terminal_id << std::endl;
std::cout << "|-- dev_index: " << ied_usr.dev_idx << std::endl;
std::cout << "|-- dev_type: " << ied_usr.dev_type << std::endl;
std::cout << "|-- dev_key: " << ied_usr.dev_key << std::endl;
std::cout << "|-- dev_series: " << ied_usr.dev_series << std::endl;
std::cout << "|-- dev_flag: " << ied_usr.dev_flag << std::endl;
std::cout << "|-- last_call_wavelist_time: " << ied_usr.last_call_wavelist_time << std::endl;
std::cout << "|-- org_name: " << ied_usr.org_name << std::endl;
std::cout << "|-- maint_name: " << ied_usr.maint_name << std::endl;
std::cout << "|-- station_name: " << ied_usr.station_name << std::endl;
std::cout << "|-- tmnl_factory: " << ied_usr.tmnl_factory << std::endl;
std::cout << "|-- time: " << ied_usr.time << std::endl;
std::cout << "|-- tmnl_status: " << ied_usr.tmnl_status << std::endl;
std::cout << "|-- terminal_code: " << ied_usr.terminal_code << std::endl;
std::cout << "|-- update_flag: " << ied_usr.update_flag << std::endl;
// 打印每个LD_info的内容
for (int i = 0; i < 10; ++i) {
if (strcmp(ied_usr.LD_info[i].mp_id, "") != 0) {
std::cout << "|-- LD_info[" << i << "]:" << std::endl;
//name
std::cout << " |-- name: " << ied_usr.LD_info[i].name << std::endl;
std::cout << " |-- LD_name: "
<< (strlen(ied_usr.LD_info[i].LD_name) == 0 ? "NA" : ied_usr.LD_info[i].LD_name)
<< std::endl;
std::cout << " |-- read_flag: " << ied_usr.LD_info[i].read_flag << std::endl;
//index
std::cout << " |-- line_id: " << ied_usr.LD_info[i].line_id << std::endl;
//monitorledger
std::cout << " |-- mp_id: " << ied_usr.LD_info[i].mp_id << std::endl;
std::cout << " |-- terminal_code: " << ied_usr.LD_info[i].terminal_code << std::endl;
std::cout << " |-- voltage_level: " << ied_usr.LD_info[i].voltage_level << std::endl;
std::cout << " |-- v_wiring_type: " << ied_usr.LD_info[i].v_wiring_type << std::endl;
std::cout << " |-- time: " << ied_usr.LD_info[i].time << std::endl;
std::cout << " |-- update_flag: " << ied_usr.LD_info[i].update_flag << std::endl;
std::cout << " |-- monitor_status: " << ied_usr.LD_info[i].monitor_status << std::endl;
//count暂不打印数组
std::cout << " |-- rptcount: " << ied_usr.LD_info[i].rptcount << std::endl;
std::cout << " |-- logcount: " << ied_usr.LD_info[i].logcount << std::endl;
//rpt
std::cout << " |-- rptRecvFlag: " << ied_usr.LD_info[i].rptRecvFlag << std::endl;
std::cout << " |-- rptRecvCheckFlag: " << ied_usr.LD_info[i].rptRecvCheckFlag << std::endl;
std::cout << " |-- rptPstRecvFlag: " << ied_usr.LD_info[i].rptPstRecvFlag << std::endl;
std::cout << " |-- rptPstRecvCheckFlag: " << ied_usr.LD_info[i].rptPstRecvCheckFlag << std::endl;
//rtdata
std::cout << " |-- real_data: " << ied_usr.LD_info[i].real_data << std::endl;
std::cout << " |-- soe_data: " << ied_usr.LD_info[i].soe_data << std::endl;
std::cout << " |-- limit: " << ied_usr.LD_info[i].limit << std::endl;
std::cout << " |-- count: " << ied_usr.LD_info[i].count << std::endl;
//RDRE
std::cout << " |-- RDRE_FltNum: " << ied_usr.LD_info[i].RDRE_FltNum << std::endl;
for (int j = 0; j < 256; ++j) {
if (ied_usr.LD_info[i].FltNum[j] != 0) {
std::cout << " |-- FltNum[" << j << "]:" << ied_usr.LD_info[i].FltNum[j] << std::endl;
}
}
//QVVR
std::cout << " |-- qvvr_idx: " << ied_usr.LD_info[i].qvvr_idx << std::endl;
std::cout << " |-- QVVRs:" << std::endl;
for (int j = 0; j < 256; ++j) {
if (ied_usr.LD_info[i].qvvr[j].used_status != 0) {
std::cout << " |-- QVVR[" << j << "]:" << std::endl;
std::cout << " |-- used_status: " << ied_usr.LD_info[i].qvvr[j].used_status << std::endl;
std::cout << " |-- QVVR_start: " << ied_usr.LD_info[i].qvvr[j].QVVR_start << std::endl;
std::cout << " |-- QVVR_type: " << ied_usr.LD_info[i].qvvr[j].QVVR_type << std::endl;
std::cout << " |-- QVVR_time: " << ied_usr.LD_info[i].qvvr[j].QVVR_time << std::endl;
std::cout << " |-- QVVR_PerTime: " << ied_usr.LD_info[i].qvvr[j].QVVR_PerTime << std::endl;
std::cout << " |-- QVVR_Amg: " << ied_usr.LD_info[i].qvvr[j].QVVR_Amg << std::endl;
std::cout << " |-- QVVR_Rptname: " << ied_usr.LD_info[i].qvvr[j].QVVR_Rptname << std::endl;
std::cout << " |-- timestamp: " << ied_usr.LD_info[i].qvvr[j].timestamp << std::endl;
}
}
}
}
std::cout << "------------------------------------" << std::endl;
}
void printLedgerinshell(const ied_usr_t& ied_usr, QIODevice* outputDevice) {
outputDevice->write("------------------------------------\n");
outputDevice->write("|-- terminal_id: " + QByteArray(ied_usr.terminal_id) + "\n");
outputDevice->write("|-- dev_index: " + QByteArray::number(ied_usr.dev_idx) + "\n");
outputDevice->write("|-- dev_type: " + QByteArray(ied_usr.dev_type) + "\n");
outputDevice->write("|-- dev_key: " + QByteArray(ied_usr.dev_key) + "\n");
outputDevice->write("|-- dev_series: " + QByteArray(ied_usr.dev_series) + "\n");
outputDevice->write("|-- dev_flag: " + QByteArray::number(ied_usr.dev_flag) + "\n");
outputDevice->write("|-- last_call_wavelist_time: " + QByteArray::number(ied_usr.last_call_wavelist_time) + "\n");
outputDevice->write("|-- org_name: " + QByteArray(ied_usr.org_name) + "\n");
outputDevice->write("|-- maint_name: " + QByteArray(ied_usr.maint_name) + "\n");
outputDevice->write("|-- station_name: " + QByteArray(ied_usr.station_name) + "\n");
outputDevice->write("|-- tmnl_factory: " + QByteArray(ied_usr.tmnl_factory) + "\n");
outputDevice->write("|-- time: " + QByteArray::number(ied_usr.time) + "\n");
outputDevice->write("|-- tmnl_status: " + QByteArray(ied_usr.tmnl_status) + "\n");
outputDevice->write("|-- terminal_code: " + QByteArray(ied_usr.terminal_code) + "\n");
outputDevice->write("|-- update_flag: " + QByteArray::number(ied_usr.update_flag) + "\n");
// 打印每个LD_info的内容
for (int i = 0; i < 10; ++i) {
if (strcmp(ied_usr.LD_info[i].mp_id, "") != 0) {
outputDevice->write("|-- LD_info[" + QByteArray::number(i) + "]:\n");
// name
outputDevice->write(" |-- name: " + QByteArray(ied_usr.LD_info[i].name) + "\n");
outputDevice->write(" |-- LD_name: "
+ (strlen(ied_usr.LD_info[i].LD_name) == 0 ? QByteArray("NA") : QByteArray(ied_usr.LD_info[i].LD_name))
+ "\n");
outputDevice->write(" |-- read_flag: " + QByteArray::number(ied_usr.LD_info[i].read_flag) + "\n");
// index
outputDevice->write(" |-- line_id: " + QByteArray::number(ied_usr.LD_info[i].line_id) + "\n");
// monitorledger
outputDevice->write(" |-- mp_id: " + QByteArray(ied_usr.LD_info[i].mp_id) + "\n");
outputDevice->write(" |-- terminal_code: " + QByteArray(ied_usr.LD_info[i].terminal_code) + "\n");
outputDevice->write(" |-- voltage_level: " + QByteArray(ied_usr.LD_info[i].voltage_level) + "\n");
outputDevice->write(" |-- v_wiring_type: " + QByteArray(ied_usr.LD_info[i].v_wiring_type) + "\n");
outputDevice->write(" |-- time: " + QByteArray::number(ied_usr.LD_info[i].time) + "\n");
outputDevice->write(" |-- update_flag: " + QByteArray::number(ied_usr.LD_info[i].update_flag) + "\n");
outputDevice->write(" |-- monitor_status: " + QByteArray(ied_usr.LD_info[i].monitor_status) + "\n");
// count暂不打印数组
outputDevice->write(" |-- rptcount: " + QByteArray::number(ied_usr.LD_info[i].rptcount) + "\n");
outputDevice->write(" |-- logcount: " + QByteArray::number(ied_usr.LD_info[i].logcount) + "\n");
// rpt
outputDevice->write(" |-- rptRecvFlag: " + QByteArray::number(ied_usr.LD_info[i].rptRecvFlag) + "\n");
outputDevice->write(" |-- rptRecvCheckFlag: " + QByteArray::number(ied_usr.LD_info[i].rptRecvCheckFlag) + "\n");
outputDevice->write(" |-- rptPstRecvFlag: " + QByteArray::number(ied_usr.LD_info[i].rptPstRecvFlag) + "\n");
outputDevice->write(" |-- rptPstRecvCheckFlag: " + QByteArray::number(ied_usr.LD_info[i].rptPstRecvCheckFlag) + "\n");
// rtdata
outputDevice->write(" |-- real_data: " + QByteArray::number(ied_usr.LD_info[i].real_data) + "\n");
outputDevice->write(" |-- soe_data: " + QByteArray::number(ied_usr.LD_info[i].soe_data) + "\n");
outputDevice->write(" |-- limit: " + QByteArray::number(ied_usr.LD_info[i].limit) + "\n");
outputDevice->write(" |-- count: " + QByteArray::number(ied_usr.LD_info[i].count) + "\n");
// RDRE
outputDevice->write(" |-- RDRE_FltNum: " + QByteArray::number(ied_usr.LD_info[i].RDRE_FltNum) + "\n");
for (int j = 0; j < 256; ++j) {
if (ied_usr.LD_info[i].FltNum[j] != 0) {
outputDevice->write(" |-- FltNum[" + QByteArray::number(j) + "]: "
+ QByteArray::number(ied_usr.LD_info[i].FltNum[j]) + "\n");
}
}
// QVVR
outputDevice->write(" |-- qvvr_idx: " + QByteArray::number(ied_usr.LD_info[i].qvvr_idx) + "\n");
outputDevice->write(" |-- QVVRs:\n");
for (int j = 0; j < 256; ++j) {
if (ied_usr.LD_info[i].qvvr[j].used_status != 0) {
outputDevice->write(" |-- QVVR[" + QByteArray::number(j) + "]:\n");
outputDevice->write(" |-- used_status: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].used_status) + "\n");
outputDevice->write(" |-- QVVR_start: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].QVVR_start) + "\n");
outputDevice->write(" |-- QVVR_type: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].QVVR_type) + "\n");
outputDevice->write(" |-- QVVR_time: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].QVVR_time) + "\n");
outputDevice->write(" |-- QVVR_PerTime: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].QVVR_PerTime) + "\n");
outputDevice->write(" |-- QVVR_Amg: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].QVVR_Amg) + "\n");
outputDevice->write(" |-- QVVR_Rptname: " + QByteArray(ied_usr.LD_info[i].qvvr[j].QVVR_Rptname) + "\n");
outputDevice->write(" |-- timestamp: " + QByteArray::number(ied_usr.LD_info[i].qvvr[j].timestamp) + "\n");
}
}
}
}
outputDevice->write("------------------------------------\n");
}
// 打印所有设备信息或特定终端信息
void ledger(const char* terminal_id, QIODevice* outputDevice) {
pthread_mutex_lock(&mtx);
bool found = false;
ied_t* ied;
ied_usr_t* ied_usr;
for (int t = 0; t < g_node->n_clients; t++) {
ied = (ied_t*)g_node->clients[t];
if(ied != NULL){
ied_usr = (ied_usr_t*)ied->usr_ext;
if (ied_usr != NULL && (terminal_id == NULL || strcmp(ied_usr->terminal_id, terminal_id) == 0)) {
printLedgerinshell(*ied_usr, outputDevice); // 使用 QIODevice 输出
std::cout << "!!! print to log !!!"<< std::endl;
printLedger(*ied_usr);
found = true;
}
}
}
if (!found || terminal_id == NULL) {
std::cout << "该终端不存在: " << terminal_id << std::endl;
QByteArray msg = "该终端不存在: " + QByteArray(terminal_id ? terminal_id : "NULL") + "\n";
outputDevice->write(msg); // 输出到 QIODevice
}
pthread_mutex_unlock(&mtx);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
// 解析 JSON 的函数 多前置动态均分
int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
const std::vector<std::string>& codes,
int index,
int num)
{
//后续修改为根据index来获取对应的台账num就没有作用了index用来均分的也没有作用了
if(1 == MULTIPLE_NODE_FLAG){
// 参数验证
if (num <= 0) {
std::cerr << "Error: 'num' must be greater than 0." << std::endl;
return 1; // 返回适当的错误码
}
index = index - 1;
if (index < 0 || index >= num) {
std::cerr << "Error: 'index' must be in the range [0, num-1]." << std::endl;
return 1; // 返回适当的错误码
}
}
// 获取参数
if (codes.empty()) {
std::cerr << "Error: 'codes' vector is empty." << std::endl;
return 1;
}
std::string parm = codes[0];
char* ptr = NULL;
// 发送 API 请求
SendJsonAPI_web(WEB_DEVICE, "",parm.c_str(), &ptr);
if (ptr == NULL) {
std::cerr << "Error: Received NULL response from SendJsonAPI_web." << std::endl;
return 1;
}
// 调试用
printf("ptr:%s\n", ptr);
cJSON* root = cJSON_Parse(ptr); //json格式序列化
int retry = 0;
if (root == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(root == NULL){
// 在重试前释放之前的 ptr 以避免内存泄漏
if (ptr != NULL) {
free(ptr);
ptr = NULL;
}
//测试用url参数
//SendJsonAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", parm.c_str(), "",&ptr);
SendJsonAPI_web(WEB_DEVICE, "",parm.c_str(), &ptr);
if(ptr == NULL){
retry++;if(retry>3)break;
continue;
}
root = cJSON_Parse(ptr);
retry++;if(retry>3)break;
}
// 如果重试后仍然失败,确保退出前释放任何已分配的内存
if (root == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
return 1; // 根据需要返回适当的错误码
}
}
// 获取 "code" 和 "msg"
cJSON* codeItem = cJSON_GetObjectItem(root, "code");
cJSON* msgItem = cJSON_GetObjectItem(root, "msg");
// 使用 std::string 获取值
std::string code = (codeItem != NULL && codeItem->type == cJSON_String) ? codeItem->valuestring : "not found";
std::string msg = (msgItem != NULL && msgItem->type == cJSON_String) ? msgItem->valuestring : "not found";
// 打印结果
std::cout << "code: " << code << std::endl;
std::cout << "msg: " << msg << std::endl;
// 获取 "data" 数组
cJSON* data = cJSON_GetObjectItem(root, "data");
if (!data || data->type != cJSON_Array) {
std::cerr << "Error: 'data' is not an array." << std::endl;
cJSON_Delete(root);
free(ptr);
return 1;
}
int data_size = cJSON_GetArraySize(data);
std::cout << "data_size " << data_size << std::endl;
if (data_size == 0) {
std::cerr << "Error: 'data' array is empty." << std::endl;
cJSON_Delete(root);
free(ptr);
return 1;
}
//后续修改为根据index来获取对应的台账将不再均分获取所有台账并判断进程号
int base_size = 0;
int remainder = 0;
int start_index = 0;
int end_index = data_size;
if(1 == MULTIPLE_NODE_FLAG){
// 计算每份的大小
base_size = data_size / num;
remainder = data_size % num;
// 计算当前份的起始和结束索引
start_index = index * base_size + (index < remainder ? index : remainder);
end_index = start_index + base_size + (index < remainder ? 1 : 0);
// 确保结束索引不超过数组大小
if (end_index > data_size) {
end_index = data_size;
}
}
// 遍历指定范围内的元素
for (int i = start_index; i < end_index; ++i) {
cJSON* item = cJSON_GetArrayItem(data, i);
if (!item || item->type != cJSON_Object) {
std::cerr << "Warning: Invalid item at index " << i << "." << std::endl;
continue; // 跳过无效的项
}
terminal_dev* dev = new terminal_dev();
memset(dev, 0, sizeof(terminal_dev)); // 初始化结构体
// 解析各个字段
cJSON* id = cJSON_GetObjectItem(item, "id"); // terminal_id
if (id && id->type == cJSON_String) strncpy(dev->terminal_id, id->valuestring, sizeof(dev->terminal_id) - 1);
else strncpy(dev->terminal_id, "N/A", sizeof(dev->terminal_id) - 1);
cJSON* ip = cJSON_GetObjectItem(item, "ip"); // addr_str
if (ip && ip->type == cJSON_String) strncpy(dev->addr_str, ip->valuestring, sizeof(dev->addr_str) - 1);
else strncpy(dev->addr_str, "N/A", sizeof(dev->addr_str) - 1);
cJSON* terminalCode = cJSON_GetObjectItem(item, "name"); // terminal_code
if (terminalCode && terminalCode->type == cJSON_String) strncpy(dev->terminal_code, terminalCode->valuestring, sizeof(dev->terminal_code) - 1);
else strncpy(dev->terminal_code, "N/A", sizeof(dev->terminal_code) - 1);
cJSON* orgName = cJSON_GetObjectItem(item, "org_name"); // org_name
if (orgName && orgName->type == cJSON_String) strncpy(dev->org_name, orgName->valuestring, sizeof(dev->org_name) - 1);
else strncpy(dev->org_name, "N/A", sizeof(dev->org_name) - 1);
cJSON* maintName = cJSON_GetObjectItem(item, "maint_name"); // maint_name
if (maintName && maintName->type == cJSON_String) strncpy(dev->maint_name, maintName->valuestring, sizeof(dev->maint_name) - 1);
else strncpy(dev->maint_name, "N/A", sizeof(dev->maint_name) - 1);
cJSON* stationName = cJSON_GetObjectItem(item, "stationName"); // station_name
if (stationName && stationName->type == cJSON_String) strncpy(dev->station_name, stationName->valuestring, sizeof(dev->station_name) - 1);
else strncpy(dev->station_name, "N/A", sizeof(dev->station_name) - 1);
cJSON* manufacturer = cJSON_GetObjectItem(item, "manufacturer"); // tmnl_factory
if (manufacturer && manufacturer->type == cJSON_String) strncpy(dev->tmnl_factory, manufacturer->valuestring, sizeof(dev->tmnl_factory) - 1);
else strncpy(dev->tmnl_factory, "N/A", sizeof(dev->tmnl_factory) - 1);
cJSON* status = cJSON_GetObjectItem(item, "status"); // tmnl_status
if (status && status->type == cJSON_String) strncpy(dev->tmnl_status, status->valuestring, sizeof(dev->tmnl_status) - 1);
else strncpy(dev->tmnl_status, "N/A", sizeof(dev->tmnl_status) - 1);
cJSON* devType = cJSON_GetObjectItem(item, "devType"); // dev_type
if (devType && devType->type == cJSON_String) strncpy(dev->dev_type, devType->valuestring, sizeof(dev->dev_type) - 1);
else strncpy(dev->dev_type, "N/A", sizeof(dev->dev_type) - 1);
cJSON* devKey = cJSON_GetObjectItem(item, "devKey"); // dev_key
if (devKey && devKey->type == cJSON_String) strncpy(dev->dev_key, devKey->valuestring, sizeof(dev->dev_key) - 1);
else strncpy(dev->dev_key, "N/A", sizeof(dev->dev_key) - 1);
cJSON* series = cJSON_GetObjectItem(item, "series"); // dev_series
if (series && series->type == cJSON_String) strncpy(dev->dev_series, series->valuestring, sizeof(dev->dev_series) - 1);
else strncpy(dev->dev_series, "N/A", sizeof(dev->dev_series) - 1);
cJSON* port = cJSON_GetObjectItem(item, "port"); // port
if (port && port->type == cJSON_String) strncpy(dev->port, port->valuestring, sizeof(dev->port) - 1);
else strncpy(dev->port, "N/A", sizeof(dev->port) - 1);
cJSON* updateTime = cJSON_GetObjectItem(item, "updateTime"); // timestamp
if (updateTime && updateTime->type == cJSON_String) strncpy(dev->timestamp, updateTime->valuestring, sizeof(dev->timestamp) - 1);
else strncpy(dev->timestamp, "N/A", sizeof(dev->timestamp) - 1);
// 解析 monitorData 数组
cJSON* monitorData = cJSON_GetObjectItem(item, "monitorData");
if (monitorData && monitorData->type == cJSON_Array) {
int j = 0;
cJSON* monitorItem;
cJSON_ArrayForEach(monitorItem, monitorData) {
if (j >= 10){
std::cout << "一个终端最多只能有十个监测点" << std::endl;
break; // 限制为最多10个
}
cJSON* monitor_id = cJSON_GetObjectItem(monitorItem, "id"); // monitor_id
if (monitor_id && monitor_id->type == cJSON_String) strncpy(dev->line[j].monitor_id, monitor_id->valuestring, sizeof(dev->line[j].monitor_id) - 1);
else strncpy(dev->line[j].monitor_id, "N/A", sizeof(dev->line[j].monitor_id) - 1);
cJSON* monitor_name = cJSON_GetObjectItem(monitorItem, "name"); // monitor_name
if (monitor_name && monitor_name->type == cJSON_String) strncpy(dev->line[j].monitor_name, monitor_name->valuestring, sizeof(dev->line[j].monitor_name) - 1);
else strncpy(dev->line[j].monitor_name, "N/A", sizeof(dev->line[j].monitor_name) - 1);
cJSON* lineNo = cJSON_GetObjectItem(monitorItem, "lineNo"); // logical_device_seq
if (lineNo && lineNo->type == cJSON_String) strncpy(dev->line[j].logical_device_seq, lineNo->valuestring, sizeof(dev->line[j].logical_device_seq) - 1);
else strncpy(dev->line[j].logical_device_seq, "N/A", sizeof(dev->line[j].logical_device_seq) - 1);
cJSON* voltageLevel = cJSON_GetObjectItem(monitorItem, "voltageLevel"); // voltage_level
if (voltageLevel && voltageLevel->type == cJSON_String) strncpy(dev->line[j].voltage_level, voltageLevel->valuestring, sizeof(dev->line[j].voltage_level) - 1);
else strncpy(dev->line[j].voltage_level, "N/A", sizeof(dev->line[j].voltage_level) - 1);
cJSON* ptType = cJSON_GetObjectItem(monitorItem, "ptType"); // terminal_connect
if (ptType && ptType->type == cJSON_String) strncpy(dev->line[j].terminal_connect, ptType->valuestring, sizeof(dev->line[j].terminal_connect) - 1);
else strncpy(dev->line[j].terminal_connect, "N/A", sizeof(dev->line[j].terminal_connect) - 1);
// 添加监测点状态
cJSON* monitorstatus = cJSON_GetObjectItem(monitorItem, "status"); // status
if (monitorstatus && monitorstatus->type == cJSON_String) strncpy(dev->line[j].status, monitorstatus->valuestring, sizeof(dev->line[j].status) - 1);
else strncpy(dev->line[j].status, "N/A", sizeof(dev->line[j].status) - 1);
j++;
}
}
// 准备键
QString key = QString(dev->terminal_id);//用id而不是code区分有的code存在乱码
// 检查是否存在重复键
if (terminal_dev_map->contains(key)) {
std::cerr << "Duplicate terminal_code found: " << key.toStdString() << std::endl;
// 删除旧的 terminal_dev 对象以避免内存泄漏
delete terminal_dev_map->value(key);
// 移除旧的键值对
terminal_dev_map->remove(key);
// 插入新的 terminal_dev 对象
terminal_dev_map->insert(key, dev);//后续修改为只有进程号匹配上index才录入当前进程
} else {
// 插入新的 terminal_dev 对象
terminal_dev_map->insert(key, dev);//后续修改为只有进程号匹配上index才录入当前进程
//调试用
//std::cout << "i = " << i << std::endl;
//std::cout << "terminal_dev_map.size:" << terminal_dev_map->size() << std::endl;
}//如果出现重复项,日志要有体现方便排查
}
// 释放资源
cJSON_Delete(root);
free(ptr);
return 0; // 确保函数有返回值
}
int parse_device_cfg_web()
{
std::cout << "parse_device_cfg_web" << endl;
std::vector<std::string> codes; //入参集合
/*//多前置判断
if (FRONT_INST == 0 || FRONT_IP[0] == '\0') {
MULTIPLE_NODE_FLAG = 0;
cout << "set MULTIPLE_NODE_FLAG:0,because do not have FRONT_INST or FRONT_IP" << endl;
}
char front_type[2] = {""};
int mp_num = 0;
//用web接口替换前置表的读写接口中解析结果存入容器从接口直接取出容器从容器中获取需要的值写入时直接传参
if (MULTIPLE_NODE_FLAG) {
//前置表读取部分替换
QMap<QString, front_list*> front_map;
codes.push_back("info");
parse_device_web_test_front_read(&front_map,codes);
codes.clear();
// 遍历 QMap 容器
QMap<QString, front_list*>::iterator it;
for (it = front_map.begin(); it != front_map.end(); ++it) {
front_list* value = it.value();
// 确保 value 不为空
if (it.key() == "0.0.0.0" && value != nullptr) {
// 从 value 中读取 front_type保留前两个字符
strncpy(front_type, value->front_type, 2);
front_type[2] = '\0'; // 确保以空字符结尾
// 将 mp_num 从字符串转换为整数
mp_num = std::atoi(value->mp_num);
}
}
//前置表读取部分
//前置表写入部分
codes.push_back("insertfront");
codes.push_back(std::string(FRONT_IP));
codes.push_back(intToString(FRONT_INST));
codes.push_back(std::string(front_type));
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back("01"); //添加状态值
parse_device_web_test_front_write(codes);
codes.clear();
//前置表写入部分
}
cout << "mp_num:" << mp_num << " front_type:" << front_type << endl;*/
//当前前置不需要多前置前置从配置文件mykafka.ini获取到ip后将ip作为参数传送给web接口获取台账
ied_t* ied;
ied_usr_t* ied_usr;
chnl_usr_t* chnl_usr;
int count_cfg = 0; //终端台账总数
int count_real = 0; //遍历终端台账的计数器
/////////////////////////////////////////////////////////////////////////////////
/*//读取终端ext表替换为web接口
QMap<QString, terminal_ext*> terminal_ext_map;
//read_terminal_ext_pg(&terminal_ext_map);
codes.push_back("info");
parse_device_web_test_ext(&terminal_ext_map,codes);
codes.clear();
//读取终端ext表替换为web接口
//读取终端台账表总数替换为web接口
QMap<QString, terminal_dev*> terminal_dev_map;
codes.push_back("count_cfg");
parse_device_web_test_dev(&terminal_dev_map,codes);
// 遍历 QMap 容器
QMap<QString, terminal_dev*>::iterator it;
for (it = terminal_dev_map.begin(); it != terminal_dev_map.end(); ++it) {
terminal_dev* value = it.value();
// 确保 value 不为空
if (it.key() == "count_cfg" && value != nullptr) {
// 将 count 从字符串转换为整数
count_cfg = std::atoi(value->count_cfg);
}
//调试用
cout << "count_cfg:" << count_cfg << " value->count_cfg:" << value->count_cfg << endl;
}
codes.clear();
//取完count——cfg要将容器清0否则影响取台账逻辑
terminal_dev_map.clear();
//读取终端台账表总数替换为web接口
//读取终端台账表替换为web接口
codes.push_back("info");
codes.push_back(intToString(FRONT_INST));
codes.push_back(intToString(mp_num));
codes.push_back(intToString(count_cfg));
codes.push_back(intToString(MULTIPLE_NODE_FLAG));
codes.push_back(intToString(g_front_seg_num));
parse_device_web_test_dev(&terminal_dev_map,codes);
codes.clear();
if (MULTIPLE_NODE_FLAG && g_front_seg_num == 0) {
if (mp_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * mp_num;
}
else
{
count_cfg = mp_num;
}
}
else if (MULTIPLE_NODE_FLAG && g_front_seg_num != 0) {
int front_num = (count_cfg / g_front_seg_num) + 1;
if (front_num * FRONT_INST > count_cfg) {
count_cfg = count_cfg - (FRONT_INST - 1) * front_num;
}
else
{
count_cfg = front_num;
}
}*/
////////////////////////////////////////////////////////////////////////////////
//接口合并只用一个web接口获取终端台账和监测点台账
QMap<QString, terminal_dev*> terminal_dev_map;
//////////////////////////////////////////////////////////////////////////////
//测试用
//codes.push_back("code1=ledger"); //填FRONT_IP和状态可不填
//构造入参json
std::string input_jstr = "{";
input_jstr += "\"ip\":\"" + std::string(FRONT_IP) + "\",";
input_jstr += "\"runFlag\":" + TERMINAL_STATUS + "";
input_jstr += "}";
std::cout << "input_jstr: " << input_jstr << std::endl; // 输出结果
codes.push_back(input_jstr); //是否需要筛选状态直接在配置文件控制
///////////////////////////////////////////////////////////////////////////////
terminal_ledger_web(&terminal_dev_map,codes,g_front_seg_index,g_front_seg_num);
codes.clear();
//调试用
//printTerminalDevMap(terminal_dev_map);
count_cfg = terminal_dev_map.size();//容器的数量就是台账的数量
std::cout << "terminal_ledger_num:" << count_cfg << std::endl;
g_node->n_clients = count_cfg; //根据台账总数申请空间
g_node->clients = (ied_t**)apr_pcalloc(g_cfg_pool, count_cfg * sizeof(ied_t*));
for (int k = 0; k < count_cfg; k++)
g_node->clients[k] = (ied_t*)apr_pcalloc(g_cfg_pool, sizeof(ied_t));
//读取终端台账表替换为web接口
//////////////////////////////////////////////////////////////////////////////////////////////////
//读数据
try {
char terminal_id[64];
char terminal_code[64];
char org_name[64];
char maint_name[64];
char station_name[64];
char tmnl_factory[64];
char tmnl_status[64];
char dev_type[64];
char dev_key[255];
char dev_series[255];
char addr_str[64];
char port_char[64];
otl_datetime timestamp;
// 遍历终端台账容器
QMap<QString, terminal_dev*>::iterator it;
for (it = terminal_dev_map.begin(); it != terminal_dev_map.end(); ++it) {
terminal_dev* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
strncpy(terminal_id, value->terminal_id, sizeof(terminal_id) - 1);
strncpy(terminal_code, value->terminal_code, sizeof(terminal_code) - 1);
strncpy(org_name, value->org_name, sizeof(org_name) - 1);
strncpy(maint_name, value->maint_name, sizeof(maint_name) - 1);
strncpy(station_name, value->station_name, sizeof(station_name) - 1);
strncpy(tmnl_factory, value->tmnl_factory, sizeof(tmnl_factory) - 1);
strncpy(tmnl_status, value->tmnl_status, sizeof(tmnl_status) - 1);
strncpy(dev_type, value->dev_type, sizeof(dev_type) - 1);
strncpy(dev_key, value->dev_key, sizeof(dev_key) - 1);
strncpy(dev_series, value->dev_series, sizeof(dev_series) - 1);
strncpy(addr_str, value->addr_str, sizeof(addr_str) - 1);
strncpy(port_char, value->port, sizeof(port_char) - 1);
timestamp = parseTimestamp(value->timestamp);
//处理终端台账
ied = g_node->clients[count_real++];
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, MAX_CPUNO * sizeof(LD_info_t));
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
ied->cpucount = 0;
if (strlen(terminal_id) != 0) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", terminal_id);//terminal_id
cout << "ied_usr->terminal_id:" << ied_usr->terminal_id << endl;
}
if (terminal_code != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", terminal_code);//terminal_code
cout << "ied_usr->terminal_code:" << ied_usr->terminal_code << endl;
}
/*不需要这三个信息
if (org_name != NULL) {
apr_snprintf(ied_usr->org_name, sizeof(ied_usr->org_name), "%s", org_name);//org_name
cout << "ied_usr->org_name:" << ied_usr->org_name << endl;
}
if (maint_name != NULL) {
apr_snprintf(ied_usr->maint_name, sizeof(ied_usr->maint_name), "%s", maint_name);//maint_name
cout << "ied_usr->maint_name:" << ied_usr->maint_name << endl;
}
if (station_name != NULL) {
apr_snprintf(ied_usr->station_name, sizeof(ied_usr->station_name), "%s", station_name);//station_name
cout << "ied_usr->station_name:" << ied_usr->station_name << endl;
}
*/
if (tmnl_factory != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", tmnl_factory);//tmnl_factory
cout << "ied_usr->tmnl_factory:" << ied_usr->tmnl_factory << endl;
}
if (tmnl_status != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", tmnl_status);//tmnl_status
cout << "ied_usr->tmnl_status:" << ied_usr->tmnl_status << endl;
}
if (dev_type != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", dev_type);//dev_type
cout << "ied_usr->dev_type:" << ied_usr->dev_type << endl;
}
if (dev_series != NULL) {
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", dev_series);//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
else
{
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
if (dev_key != NULL) {
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", dev_key);//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
}
else
{
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
}
//lnk20241125实时数据用
ied_usr->dev_idx = count_real;
cout << "dev_idx:" << ied_usr->dev_idx << endl;
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;//channel
ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
if (addr_str != NULL) {
ied->channel[0].addr = ntohl(inet_addr(addr_str));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
else
{
ied->channel[0].addr = ntohl(inet_addr("0.0.0.0"));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
if (port_char != NULL) {
int port = 102;
if (stringToInt(port_char, &port)) {
// 转换成功portStr全为数字并且已经转换为int类型的port
ied->channel[0].port = port;//DEV_PortID
cout << "ied_usr->port:" << ied->channel[0].port << endl;//DEV_PortID
}
else {
ied->channel[0].port = 102;//DEV_PortID
cout << "ied_usr->port:" << port_char << ",非合法端口.使用默认端口:" << ied->channel[0].port << endl;//DEV_PortID
}
}
if (timestamp.year != 0) {
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
ied_usr->time = static_cast<long long>(time);
cout << "ied_usr->time:" << ied_usr->time << endl;
}
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
//调试用
//std::cout << "value:" << terminal_id <<" "<<terminal_code <<" "<<tmnl_factory <<" "<<dev_series <<" "<<dev_key <<" "<< tmnl_status <<" "<<dev_type <<" "<<addr_str <<" "<<port_char <<" "<< timestamp.year << std::endl;
// 遍历监测点信息
LD_info_t line_info;
int count_real_monitor = 0; //遍历监测点台账的计数器
//调试用
//std::cout << "n_clients:" << g_node->n_clients << std::endl;
if (g_node->n_clients <= 0) {
std::cout << "no terminal exist " << std::endl;
return APR_EBADF;
}
char monitor_id[64];
//char terminal_code[64];
char monitor_name[64];
char logical_device_seq[64];
char voltage_level[64];
char terminal_connect[64];
char monitor_status[64];
//otl_datetime timestamp;
//for (int j = 0; j < 10; ++j) { // 假设最多有10个监测点
for (int j = 0; value->line[j].monitor_id[0] != '\0'; ++j){
ledger_monitor& monitor = value->line[j];
// 检查监测点 ID 是否为空以避免访问无效数据
/*if (monitor.monitor_id[0] != '\0') {
std::cout << " Monitor ID: " << monitor.monitor_id << std::endl;
std::cout << " Terminal Code: " << monitor.terminal_code << std::endl; //应该为空json不带
std::cout << " Monitor Name: " << monitor.monitor_name << std::endl;
std::cout << " Logical Device Seq: " << monitor.logical_device_seq << std::endl;
std::cout << " Voltage Level: " << monitor.voltage_level << std::endl;
std::cout << " Terminal Connect: " << monitor.terminal_connect << std::endl;
std::cout << " Timestamp: " << monitor.timestamp << std::endl; //应该为空json不带
std::cout << " monitor_status: " << monitor.status << std::endl;*/
strncpy(monitor_id, monitor.monitor_id, sizeof(monitor_id) - 1);
//strncpy(terminal_code, monitor.terminal_code, sizeof(terminal_code) - 1); //从上级获取
strncpy(monitor_name, monitor.monitor_name, sizeof(monitor_name) - 1);
strncpy(logical_device_seq, monitor.logical_device_seq, sizeof(logical_device_seq) - 1);
strncpy(voltage_level, monitor.voltage_level, sizeof(voltage_level) - 1);
strncpy(terminal_connect, monitor.terminal_connect, sizeof(terminal_connect) - 1);
//timestamp = parseTimestamp(monitor.timestamp); //从上级获取
strncpy(monitor_status, monitor.status, sizeof(monitor_status) - 1);//添加监测点状态
//监测点台账处理
count_real_monitor++;
memset(&line_info, 0, sizeof(line_info));
line_info.line_id = count_real_monitor; //监测点排号
cout << "line_id:" << line_info.line_id << endl;
strcpy(line_info.mp_id, monitor_id);
cout << "mp_id:" << line_info.mp_id << endl;
strcpy(line_info.terminal_code, terminal_code); //从上级获取的终端号
cout << "terminal_code:" << line_info.terminal_code << endl;
if (isCharPtrEmpty(logical_device_seq)) {
line_info.cpuno = 1; //默认监测点实例号1
cout << "logical_device_seq:is null,set cpuno:"<< line_info.cpuno << endl;
}
else {
line_info.cpuno = std::atoi(logical_device_seq);
cout << "logical_device_seq:"<< line_info.cpuno << endl;
}
//cout << "cpuno:" << line_info.cpuno << endl;
strcpy(line_info.voltage_level, voltage_level);
cout << "voltage_level:" << line_info.voltage_level << endl;
strcpy(line_info.v_wiring_type, terminal_connect);
cout << "v_wiring_type:" << line_info.v_wiring_type << endl;
strcpy(line_info.monitor_status, monitor_status);
cout << "monitor_status:" << line_info.monitor_status << endl;
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900 //从上级获取的timestamp
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
line_info.time = static_cast<long long>(time);
cout << "time:" << line_info.time << endl;
strcpy(line_info.name, monitor_name);
cout << "name:" << line_info.name << endl;
line_info.read_flag = 1; //监测点有效
//ied = find_ied_from_dev_code(line_info.terminal_code); //不需要再找上级终端了,已经在终端里了
if (ied && ied->usr_ext && line_info.cpuno && (static_cast<int>(line_info.cpuno) < 10)) {
char str[256];
byte_t cpuno = line_info.cpuno;
cout << "cpuno:" << line_info.cpuno << endl;
cout << "index cpuno:" << cpuno-1 << endl;
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->LD_info[cpuno - 1] = line_info; //cpuno默认是1
ied_usr->LD_info[cpuno - 1].ied = ied;
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].rptcount = 0;
cout << "rptcount:" << ied_usr->LD_info[cpuno - 1].rptcount << endl;
if (cpuno > ied->cpucount) {
ied->cpucount = cpuno;
}
}
//}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
#if 0
ied = g_node->clients[count_real++];
ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t));
ied->usr_ext = ied_usr;
if (ied_usr == NULL)
return APR_ENOMEM;
ied_usr->last_call_wavelist_time = sGetMsTime() + g_pt61850app->giTime * 1000;
ied_usr->LD_info = (LD_info_t*)apr_pcalloc(g_init_pool, MAX_CPUNO * sizeof(LD_info_t));
if (ied_usr->LD_info == NULL)
return APR_ENOMEM;
ied_usr->dev_flag = g_DevFlag;
ied->chncount = 1;
ied->channel = (channel_t*)apr_pcalloc(g_cfg_pool, sizeof(channel_t) * ied->chncount);
ied->channel[0].ied = ied;
ied->channel[0].status = STATUS_BREAKOFF;
ied->cpucount = 0;
if (strlen(terminal_id) != 0) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", terminal_id);//terminal_id
cout << "ied_usr->terminal_id:" << ied_usr->terminal_id << endl;
}
if (terminal_code != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", terminal_code);//terminal_code
cout << "ied_usr->terminal_code:" << ied_usr->terminal_code << endl;
}
/*不需要这三个信息
if (org_name != NULL) {
apr_snprintf(ied_usr->org_name, sizeof(ied_usr->org_name), "%s", org_name);//org_name
cout << "ied_usr->org_name:" << ied_usr->org_name << endl;
}
if (maint_name != NULL) {
apr_snprintf(ied_usr->maint_name, sizeof(ied_usr->maint_name), "%s", maint_name);//maint_name
cout << "ied_usr->maint_name:" << ied_usr->maint_name << endl;
}
if (station_name != NULL) {
apr_snprintf(ied_usr->station_name, sizeof(ied_usr->station_name), "%s", station_name);//station_name
cout << "ied_usr->station_name:" << ied_usr->station_name << endl;
}
*/
if (tmnl_factory != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", tmnl_factory);//tmnl_factory
cout << "ied_usr->tmnl_factory:" << ied_usr->tmnl_factory << endl;
}
if (tmnl_status != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", tmnl_status);//tmnl_status
cout << "ied_usr->tmnl_status:" << ied_usr->tmnl_status << endl;
}
if (dev_type != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", dev_type);//dev_type
cout << "ied_usr->dev_type:" << ied_usr->dev_type << endl;
}
if (dev_series != NULL) {
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", dev_seri);//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
else
{
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}
if (dev_key != NULL) {
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", dev_key);//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
}
else
{
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
}
//合并了
/* cout << "code" << ied_usr->terminal_code << endl;
if (terminal_ext_map.contains(QString::fromUtf8(ied_usr->terminal_code))) {
terminal_ext* ext = terminal_ext_map.value(QString::fromUtf8(ied_usr->terminal_code));
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ext->terminal_key);//DEV_Key
cout << "dev_key:" << ied_usr->dev_key << endl;
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ext->terminal_identify_code);//DEV_Series
cout << "dev_series:" << ied_usr->dev_series << endl;
}
else
{
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", "");//DEV_Series
cout << "defalut dev_series:" << ied_usr->dev_series << endl;
}*/
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4;//channel
ied->channel[0].addr_str[LONGNAME - 1] = 0;//DEV_IP
if (addr_str != NULL) {
ied->channel[0].addr = ntohl(inet_addr(addr_str));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
else
{
ied->channel[0].addr = ntohl(inet_addr("0.0.0.0"));//DEV_IP
strncpy(ied->channel[0].addr_str, addr_str, LONGNAME - 1);//DEV_IP
cout << "ied_usr->addr_str:" << ied->channel[0].addr_str << endl;
}
if (port_char != NULL) {
int port = 102;
if (stringToInt(port_char, &port)) {
// 转换成功portStr全为数字并且已经转换为int类型的port
ied->channel[0].port = port;//DEV_PortID
cout << "ied_usr->port:" << ied->channel[0].port << endl;//DEV_PortID
}
else {
ied->channel[0].port = 102;//DEV_PortID
cout << "ied_usr->port:" << port_char << ",非合法端口.使用默认端口:" << ied->channel[0].port << endl;//DEV_PortID
}
}
if (timestamp.year != 0) {
//// 构造struct tm对象
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t time = std::mktime(&timeinfo);
ied_usr->time = static_cast<long long>(time);
cout << "ied_usr->time:" << ied_usr->time << endl;
}
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
//调试用
std::cout << "value:" << terminal_id <<" "<<terminal_code <<" "<<tmnl_factory <<" "<<dev_series <<" "<<dev_key <<" "<< tmnl_status <<" "<<dev_type <<" "<<addr_str <<" "<<port_char <<" "<< timestamp.year << std::endl;
}//台账循环结束
//没有多前置
/*//替换前置表更新部分
if (MULTIPLE_NODE_FLAG) {
codes.push_back("updatefront");
codes.push_back(std::string(FRONT_IP));
codes.push_back(intToString(FRONT_INST));
codes.push_back(intToString(count_real));
codes.push_back(std::string(PROGRAM_VERSION)); //和定时任务的update一样写入PROGRAM_VERSION
parse_device_web_test_front_write(codes);
codes.clear();
}
//替换前置表更新部分*/
#endif
if (count_real < count_cfg)
g_node->n_clients = count_real;
if (count_cfg != count_real)
return APR_EBADF;
cout << "dev init create count:" << count_real;
return APR_SUCCESS;
}
catch (otl_exception& e)
{
printf("\ndev tr\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
}
int parse_model_web(QMap<QString, icd_model*>* icd_model_map,const std::vector<std::string>& codes)
{
std::string parm = codes[0]; //装置型号列表,格式["型号1","型号2"...]
char* ptr=NULL;
//测试用url参数
//SendJsonAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", parm.c_str(), "",&ptr);
SendJsonAPI_web(WEB_ICD,"",parm.c_str(),&ptr);
// 检查 ptr 是否为 NULL避免 std::string 初始化失败
if (ptr == NULL) {
// 处理 ptr 为 NULL 的情况,例如日志记录或错误处理
std::cout << "Error: Received NULL response"<< std::endl;
return 1;
}
//调试用
printf("ptr:%s\n",ptr);
cJSON* root = cJSON_Parse(ptr); //json格式序列化
int retry = 0;
if (root == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
//重发多次
while(root == NULL){
// 在重试前释放之前的 ptr 以避免内存泄漏
if (ptr != NULL) {
free(ptr);
ptr = NULL;
}
//测试用url参数
//SendJsonAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", parm.c_str(), "",&ptr);
SendJsonAPI_web(WEB_ICD,"",parm.c_str(),&ptr);
if(ptr == NULL){
retry++;if(retry>3)break;
continue;
}
root = cJSON_Parse(ptr);
retry++;if(retry>3)break;
}
if (root == NULL) {
printf("web error %s\n", cJSON_GetErrorPtr());
return 1;
}
}
cJSON* codeItem = cJSON_GetObjectItem(root, "code");
cJSON* msgItem = cJSON_GetObjectItem(root, "msg");
// 使用 std::string 获取值
std::string code = (codeItem != NULL) ? codeItem->valuestring : "not found";
std::string msg = (msgItem != NULL) ? msgItem->valuestring : "not found";
// 打印结果
std::cout << "code: " << code << std::endl;
std::cout << "msg: " << msg << std::endl;
cJSON* data = cJSON_GetObjectItem(root, "data");
if (data && data->type == cJSON_Array) {
cJSON* item;
cJSON_ArrayForEach(item, data) {
icd_model* model = new icd_model;
cJSON* id = cJSON_GetObjectItem(item, "id");//model_id
if (id && id->type == cJSON_String) strncpy(model->model_id, id->valuestring, sizeof(model->model_id) - 1);
cJSON* fileName = cJSON_GetObjectItem(item, "fileName");//file_name
if (fileName && fileName->type == cJSON_String) strncpy(model->file_name, fileName->valuestring, sizeof(model->file_name) - 1);
cJSON* filePath = cJSON_GetObjectItem(item, "filePath");//新增
if (filePath && filePath->type == cJSON_String) strncpy(model->file_path, filePath->valuestring, sizeof(model->file_path) - 1);
cJSON* devType = cJSON_GetObjectItem(item, "devType");//tmnl_type
if (devType && devType->type == cJSON_String) strncpy(model->tmnl_type, devType->valuestring, sizeof(model->tmnl_type) - 1);
cJSON* updateTime = cJSON_GetObjectItem(item, "updateTime");//timestamp
if (updateTime && updateTime->type == cJSON_String) strncpy(model->timestamp, updateTime->valuestring, sizeof(model->timestamp) - 1);
// 添加到 QMap
icd_model_map->insert(model->model_id, model);
}
}
cJSON_Delete(root);
free(ptr); // 如果 SendJsonAPI_web 分配了内存,记得释放
return 0; // 确保函数有返回值
}
int parse_model_cfg_web()
{
std::vector<std::string> codes;//入参集合
QMap<QString, icd_model*> icd_model_map;
/////////////////////////////////////////////////////////////////////////
//测试用
//codes.push_back("code1=model1"); //填入终端型号列表
//使用中端型号列表构建入参json字符串
// 遍历前置所有监测点
ied_t* ied;
ied_usr_t* ied_usr;
std::cout << "g_node->n_clients" << g_node->n_clients << std::endl;
std::set<std::string> devTypes; // 用于去重的集合set
for (int t = 0; t < g_node->n_clients; t++) {
ied = (ied_t*)g_node->clients[t];
ied_usr = (ied_usr_t*)ied->usr_ext;
// 假设 dev_type 是一个字符串类型,加入集合 ,这里会去重
if (strlen(ied_usr->dev_type) > 0) {
devTypes.insert(std::string(ied_usr->dev_type));
}
}
// 手动构建 JSON 字符串
std::string input_jstr = "[";
bool first = true; // 用于处理逗号
for (std::set<std::string>::iterator it = devTypes.begin(); it != devTypes.end(); ++it) {
if (!first) {
input_jstr += ","; // 添加逗号
}
first = false; // 第一次之后设置为 false
input_jstr += "\"" + *it + "\""; // 添加字符串
}
input_jstr += "]"; // 结束 JSON 数组
std::cout << "input_jstr: " << input_jstr << std::endl; // 输出结果
if(ICD_FLAG == "1"){
codes.push_back(input_jstr); //填入终端型号列表-获取指定的icd配置文件
}
else{
codes.push_back("[]"); //不填-获取所有的icd配置文件
}
/////////////////////////////////////////////////////////////////////////
parse_model_web(&icd_model_map,codes);
codes.clear();
try {
char model_id[64];
char tmnl_type[64];
//char tmnl_factory[64];
char file_name[128];
char file_path[128];
//char timestamp[64];
otl_datetime timestamp;
// 遍历终端台账容器
QMap<QString, icd_model*>::iterator it;
for (it = icd_model_map.begin(); it != icd_model_map.end(); ++it) {
icd_model* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
strncpy(model_id, value->model_id, sizeof(model_id) - 1);
strncpy(tmnl_type, value->tmnl_type, sizeof(tmnl_type) - 1);
strncpy(file_path, value->file_path, sizeof(file_path) - 1);
strncpy(file_name, value->file_name, sizeof(file_name) - 1);
//strncpy(timestamp, value->timestamp, sizeof(timestamp) - 1);
std::cout << "model_id" << model_id << std::endl;
std::cout << "tmnl_type" << tmnl_type << std::endl;
std::cout << "filepath" << file_path << std::endl;
std::cout << "filename" << file_name << std::endl;
//lnk20241125测试用
//strncpy(tmnl_type, "PS_NET", sizeof(tmnl_type) - 1);
Set_xml_databaseinfo(model_id, tmnl_type, file_path, file_name, timestamp.year, timestamp.month, timestamp.day, timestamp.hour, timestamp.minute, timestamp.second);
}
}
return APR_SUCCESS;
}
catch (otl_exception& e)
{
printf("\nicd model\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return e.code;
}
}
//自动补招接口,暂不修改,可能不使用
#if 0
bool CheckPG_To_Recall_web(long long start, long long end, char* Monitorid)
{
QDateTime deltime_Qtime = QDateTime::fromTime_t(start);
QDateTime deltime_Qtime_end = QDateTime::fromTime_t(end);
QString tmp_chr1 = deltime_Qtime.toString("yyyy-MM-dd"); //当前天
QString start_chr1 = deltime_Qtime.toString("yyyy-MM-dd hh:mm:ss"); //当前天
QString end_chr1 = deltime_Qtime_end.toString("yyyy-MM-dd hh:mm:ss"); //当前天
int timespan = 3;//默认时间间隔
try {
std::vector<std::string> codes;//入参集合
QMap<QString, intact_list*> intact_list_map;
codes.push_back("deciderecall");
codes.push_back(tmp_chr1.toStdString());
codes.push_back(std::string(Monitorid));
parse_intact_web_test_read(&intact_list_map,codes);
codes.clear();
try {
double exp_num;
double act_num;
// 遍历终端台账容器
QMap<QString, intact_list*>::iterator it;
for (it = intact_list_map.begin(); it != intact_list_map.end(); ++it) {
intact_list* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 找到容器中对应名称并取值
exp_num = atof(value->exp_num);
act_num = atof(value->act_num);
std::cout << exp_num << " " << act_num << std::endl;
timespan = 1440 / exp_num;
printf("\n %f %f %d \n", exp_num, act_num, timespan);
}
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
//OTLDisconnect();
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
try {
long long starttime = start; //补招起始时间
long long endtime = starttime + 3599; //补招结束时间
QList<long long> timestamp_list; //数据库完整性记录时间点
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
std::vector<std::string> codes;//入参集合
QMap<QString, intact_list*> intact_list_map;
codes.push_back("handlerecall");
codes.push_back(tmp_chr1.toStdString());
codes.push_back(std::string(Monitorid));
codes.push_back(start_chr1.toStdString());
codes.push_back(end_chr1.toStdString());
parse_intact_web_test_read(&intact_list_map,codes);
codes.clear();
try {
otl_datetime timestamp;
// 遍历终端台账容器
if (intact_list_map.contains(Monitorid)) {
intact_list* value = intact_list_map.value(Monitorid); // 找到键值为 "id" 的对象
if (value != nullptr) {
// 遍历 value_time 容器并输出所有时间字符串
for (std::vector<std::string>::const_iterator it = value->value_time.begin(); it != value->value_time.end(); ++it) {
const std::string& time = *it;
std::cout << "Time: " << time << std::endl;
timestamp = parseTimestamp(time);
struct tm timeinfo;
timeinfo.tm_year = timestamp.year - 1900; // 年份需要减去1900
timeinfo.tm_mon = timestamp.month - 1; // 月份需要减去1
timeinfo.tm_mday = timestamp.day;
timeinfo.tm_hour = timestamp.hour;
timeinfo.tm_min = timestamp.minute;
timeinfo.tm_sec = timestamp.second;
time_t timestamp = std::mktime(&timeinfo);
long long stamp = static_cast<long long>(timestamp);
timestamp_list.append(stamp);
}
}
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
//OTLDisconnect();
if (timestamp_list.size() <= (60 / timespan) * 0.97) //完整性数据表无数据
{
printf("\n return ture %d %f\n", timestamp_list.size(), (60 / timespan) * 0.97);
return true;
}
else
{
printf("\n return false %d %f\n", timestamp_list.size(), (60 / timespan) * 0.97);
return false;
}
}
catch (otl_exception& e)
{
printf("\nPostgreSL\"%s\"select error,ERROR code= %d,msg= %s \n", g_strOTLConnect.c_str(), e.code, e.msg);
return false;
}
printf("\n>>>error quit!!\n");
return true;
}
#endif
//定时任务不需要定时日志清理和其他一些功能,统一放在这里修改
void OnTimerThread::run()
{
msleep(10000);
printf("OnTimerThread::run() is called ...... \n");
bool account_update = true;
bool asd = true;
//当前时间获取
apr_time_t previousTime = apr_time_now();//
apr_time_exp_t localTime;
apr_time_exp_gmt(&localTime, previousTime);
cout << "Local Time: "
<< localTime.tm_year + 1900 << "-" << localTime.tm_mon + 1 << "-" << localTime.tm_mday << " "
<< localTime.tm_hour << ":" << localTime.tm_min << ":" << localTime.tm_sec
<< endl;
//web手动补招的进程测试前置所有连接的终端连接情况
int ip_count = 0;
int telnet_count = 0;
if (g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {
//在测试连接时给台账加锁lnk20250114
pthread_mutex_lock(&mtx);
init_ping_telnet(ip_count, telnet_count);
Cout_account_information();
pthread_mutex_unlock(&mtx);//解锁
}
//单联模式
if (g_onlyIP[0] != 0)
{
printf("g_onlyIP[0]=!0 ontimer--%s--\n", g_onlyIP);
add_comm_log(const_cast<char*>("g_onlyIP[0]=!0,g_onlyIP is --%s--", g_onlyIP));
}
else
{
printf("g_onlyIP[0] == 0!");
}
int pgflag = 0;
int pgmin = 0;
int mp_num_hour = 0;
int recall_flag1 = 1; //补招标志
//添加入参容器
std::vector<std::string> codes;
while (1)
{
//进入线程时间
previousTime = apr_time_now();
apr_time_exp_gmt(&localTime, previousTime);
if (strcmp(subdir, "cfg_stat_data") == 0 || strcmp(subdir, "cfg_newhis_data") == 0) {//台账更新,多节点,通讯
//不需要更新前置表
/*//判断执行此任务时间段内是否有 任务被堵塞
if (MULTIPLE_NODE_FLAG && pgflag) {
if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
codes.push_back("updatefront");
codes.push_back(std::string(FRONT_IP));
codes.push_back(intToString(FRONT_INST));
codes.push_back(intToString(FRONT_MP_NUM));
codes.push_back(std::string(PROGRAM_VERSION));
parse_device_web_test_front_write(codes);
codes.clear();
}
pgflag = 0;
}
else if (MULTIPLE_NODE_FLAG && pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}*/
//日志记录
if (mp_num_hour != localTime.tm_hour) {
pthread_mutex_lock(&mtx);//lnk20250114
std::string mp_num_str = "";
mp_num_str.append("connected device count:");
mp_num_str.append(QString::number(FRONT_MP_NUM).toStdString());
mp_num_str.append(",g_node clients:");
mp_num_str.append(QString::number(g_node->n_clients).toStdString());
add_comm_log(const_cast<char*>(mp_num_str.c_str()));
mp_num_hour = localTime.tm_hour;
pthread_mutex_unlock(&mtx);//解锁
}
}
//不使用的代码lnk20241206
#if 0
if (strcmp(subdir, "cfg_newhis_data") == 0) {//上海定时招装置日志
static int hour_time = 0;
if (localTime.tm_hour != hour_time) {
hour_time = localTime.tm_hour;
printf(">>>cfg_newhis_data is run!!!\n");
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
long long start = stamp - (stamp % 3600) - 3600 - 3600;//开始时间 当前整点值往前推两小时
long long end = start + 3599;//结束时间
QList<RecallInfo> recallinfo_list_hour;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end;
recallinfo_list_hour.append(info);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED) {
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
if (LD_info->logcount <= 0 || LD_info->read_flag == 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
i++;
}
}
}
//全量补招将通过web下发而不是手动操作数据库
if (strcmp(subdir, "cfg_recallall_data") == 0)
{
static int recall_xml_time = 0;
if (localTime.tm_min != recall_xml_time)
{
recall_xml_time = localTime.tm_min;
//补招开始与截止时间
static long long recall_start_time = 0;
static long long recall_end_time = 0;
static int flag = 0;
if (recall_start_time == 0 && recall_end_time == 0) {//无缓存数据
//查询一条 -1状态(代补招)的记录
char front_ip[42];
cout << "start select:" << endl;
QMap<QString, front_list*> front_map;
codes.push_back("frontip");
codes.push_back("g_front_seg_index");
codes.push_back("-1");
parse_device_web_test_front_read(&front_map,codes);
codes.clear();
// 遍历 QMap 容器
QMap<QString, front_list*>::iterator it;
for (it = front_map.begin(); it != front_map.end(); ++it) {
front_list* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 从 value 中读取 front_ip
strncpy(front_ip, value->front_ip, sizeof(front_ip) - 1);
//应该只有一条记录
std::cout << "front_ip:" <<front_ip << std::endl;
}
}
if (containsDash(front_ip, 21)) {
codes.push_back("insertfront");
codes.push_back(std::string(front_ip));
codes.push_back(intToString(g_front_seg_index));
codes.push_back("03"); //前置类型
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back("-1"); //状态值
parse_device_web_test_front_write(codes);
codes.clear();
//缓存数据
cout << "front_ip=" << front_ip << endl;
QString startDate, endDate;
// 分割字符串
startDate = QString::fromAscii(front_ip).left(10); // 取前10个字符作为开始日期
qDebug() << "startDate=" << startDate << endl;
endDate = QString::fromAscii(front_ip + 11).left(10); // 从第10个字符开始取8个字符作为结束日期
qDebug() << "endDate=" << endDate << endl;
QDateTime start_dt = QDateTime::fromString(startDate, "yyyyMMddHH");
qDebug() << "start_dt=" << start_dt << endl;
recall_start_time = start_dt.toMSecsSinceEpoch() / 1000;
qDebug() << "recall_start_time=" << recall_start_time << endl;
QDateTime end_dt = QDateTime::fromString(endDate, "yyyyMMddHH");
qDebug() << "end_dt=" << end_dt << endl;
recall_end_time = end_dt.toMSecsSinceEpoch() / 1000;
qDebug() << "recall_end_time=" << recall_end_time << endl;
}
flag = 0;
}
else if (recall_start_time != 0 && recall_end_time != 0) {//有缓存数据
// 将时间戳转换为YYYYMMDD格式
QString date1 = timestampToYYYYMMDD(recall_start_time);
QString date2 = timestampToYYYYMMDD(recall_end_time);
// 拼接两个日期,并用'-'分隔
QString dateRange = date1 + "-" + date2;
qDebug() << "dateRange=" << dateRange << endl;
char front_status[4];
QMap<QString, front_list*> front_map;
codes.push_back("frontstatus");
codes.push_back(dateRange.toStdString()); //ip
codes.push_back("g_front_seg_index"); //inst
parse_device_web_test_front_read(&front_map,codes);
codes.clear();
// 遍历 QMap 容器
QMap<QString, front_list*>::iterator it;
for (it = front_map.begin(); it != front_map.end(); ++it) {
front_list* value = it.value();
// 确保 value 不为空
if (value != nullptr) {
// 从 value 中读取 front_ip
strncpy(front_status, value->front_status, sizeof(front_status) - 1);
//应该只有一条记录
std::cout << "front_status:" <<front_status << std::endl;
}
}
qDebug() << "front_status=" << front_status << endl;
//再次判断是否为执行中状态
if (strcmp(front_status, "-1") == 0) {
//状态为-1 重新插入更新记录
codes.push_back("insertfront");
codes.push_back(dateRange.toStdString());
codes.push_back(intToString(g_front_seg_index));
codes.push_back("03"); //前置类型
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back("-1"); //状态值
parse_device_web_test_front_write(codes);
codes.clear();
flag = 0;
}
else if (strcmp(front_status, "-2") == 0)
{//状态为-2 补招
flag = 1;
}
else {
flag = 0;
recall_end_time = 0;
recall_start_time = 0;
}
}
if (recall_start_time != 0 && recall_end_time != 0 && flag == 1)
{
qDebug() << "start recall time=" << recall_start_time << endl;
qDebug() << "end recall time=" << recall_end_time << endl;
long long starttime = recall_start_time; //补招起始时间
long long endtime = recall_end_time; //补招结束时间
flag = 0;
recall_start_time = 0;
recall_end_time = 0;
QList<RecallInfo> recallinfo_list; //待补招队列
QList<RecallInfo> recallinfo_list_hour; //待补招队列-以小时为最大间隔
RecallInfo info;
info.starttime = starttime;
info.endtime = endtime;
recallinfo_list.append(info);
for (int i = 0; i < recallinfo_list.size(); i++)
{
//printf("\n %lld ----- %11d\n", recallinfo_list[i].starttime, recallinfo_list[i].endtime);
long long duration = recallinfo_list[i].endtime - recallinfo_list[i].starttime;
long long max_interval = 3600;
for (long long j = 0; j <= duration; j += max_interval)
{
if (j + max_interval > duration) {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].endtime;
RecallInfo info;
info.starttime = start;
info.endtime = end;
recallinfo_list_hour.append(info);
}
else {
long long start = recallinfo_list[i].starttime + j;
long long end = recallinfo_list[i].starttime + j + max_interval;
RecallInfo info;
info.starttime = start;
info.endtime = end - 1;
recallinfo_list_hour.append(info);
}
}
}
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED)
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
printf("/home/pq mpid=%s %d\n", LD_info->mp_id, LD_info->read_flag);
if (LD_info->logcount <= 0 || LD_info->read_flag == 0) {
continue;
}
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
g_StatisticLackList_list_mutex.lock();
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
//替换成web接口 2024-10-21 lnk
// if (CheckPG_To_Recall(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
// printf("CheckPG_To_Recall == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
if (CheckPG_To_Recall_web(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
printf("CheckPG_To_Recall_web == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
continue;
}
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList.push_back(jr);
}
g_StatisticLackList_list_mutex.unlock();
}
}
i++;
}
}
}
}
//自动补招可能改为web轮询下发
if (strcmp(subdir, "cfg_his_data") == 0)
{
if (pgflag) {
//当前不需要实时更新前置表对应的监测点
/*if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
codes.push_back("his");
codes.push_back("his"); //ip
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back(intToString(FRONT_MP_NUM)); //检测点数
parse_device_web_test_front_write(codes);
codes.clear();
}*/
pgflag = 0;
}
else if (pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
static int cfg_his_data_hour_time = 0;
if (localTime.tm_hour != cfg_his_data_hour_time) {
cfg_his_data_hour_time = localTime.tm_hour;
printf(">>>cfg_his_data is run!!!\n");
long long stamp = static_cast<long long>(previousTime) / 1000000;
cout << ">>>>>>>>>The Time is: " << stamp << endl;
long long start = stamp - (stamp % 3600) - 3600 - 3600;//开始时间 当前整点值往前推两小时
long long end = start + 3599;//结束时间
QList<RecallInfo> recallinfo_list_hour;
RecallInfo info;
info.starttime = start - 10;
info.endtime = end;
recallinfo_list_hour.append(info);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
printf("\n chnl_usr->m_state ===== %d\n", chnl_usr->m_state);
//if (chnl_usr->m_state == CHANNEL_CONNECTED) {
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
cpuno++;
if (LD_info->logcount <= 0 || LD_info->read_flag == 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
//替换成web接口 2024-10-21 lnk
//if (CheckPG_To_Recall(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
//printf("CheckPG_To_Recall == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
if (CheckPG_To_Recall_web(recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id) == false) {
printf("CheckPG_To_Recall_web == false %d-%d %s\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime, LD_info->mp_id);
continue;
}
CJournalRecall jr;
jr.MonitorID = QString(LD_info->mp_id);
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
jr.STEADY = QString::number(1, 10);
jr.VOLTAGE = QString::number(1, 10);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
i++;
}
}
}
#endif
//单条补招由web触发cfg_recallhis_data进程启动时会分配一个专用的端口其他进程没有
if (strcmp(subdir, "cfg_recallhis_data") == 0)
{
if (pgflag) {
//当前不需要实时更新前置表对应的监测点
/*if (FRONT_INST != 0 && FRONT_IP[0] != '\0') {
codes.push_back("his");
codes.push_back("recallhis"); //ip
codes.push_back(std::string(PROGRAM_VERSION));
codes.push_back(intToString(FRONT_MP_NUM)); //检测点数
parse_device_web_test_front_write(codes);
codes.clear();
}*/
pgflag = 0;
}
else if (pgmin != localTime.tm_min)
{
pgmin = localTime.tm_min;
pgflag = 1;
}
}
//不使用的代码lnk20241206
#if 0
//自动补招处理
if (0 && g_node_id == HIS_DATA_BASE_NODE_ID && (localTime.tm_hour <= 12 || localTime.tm_hour >= 20) && recall_flag1 == 1) {
recall_flag1 = 0;
QString MyKafkaIniFilename = QString("../etc/") + QString("mykafka.ini"); //+QString::fromAscii(subdir)
QSettings settings(MyKafkaIniFilename, QSettings::IniFormat);
QString dateString = settings.value("Recall/select_day").toString();
QList<RecallInfo> recallinfo_list_hour;
QByteArray byteArray = dateString.toUtf8(); // 使用 UTF-8 编码
char* charArray = byteArray.data();
Get_Recall_Time(charArray, recallinfo_list_hour);
int i = 0;
while (i < g_pt61850app->chnl_counts)
{
chnl_usr_t* chnl_usr;
ied_t* ied;
ied_usr_t* ied_usr;
LD_info_t* LD_info;
int cpuno = 0;
chnl_usr = g_pt61850app->chnl_usr[i];
ied = chnl_usr->chnl->ied;
ied_usr = GET_IEDEXT_ADDR(ied);
while (cpuno < ied->cpucount)
{
LD_info = &(ied_usr->LD_info[cpuno]);
if (LD_info->logcount <= 0)
continue;
printf("/home/pq mpid=%s\n", LD_info->mp_id);
printf("\n %d ===== %d\n", recallinfo_list_hour.size(), LD_info->autorecallflag);
if (recallinfo_list_hour.size() != 0) {
if (LD_info->autorecallcount != 0) {
for (int j = 0; j < LD_info->autorecallcount; j++) {
delete LD_info->autorecall[j];
}
delete LD_info->autorecall;
LD_info->autorecallcount = 0;
}
LD_info->autorecallflag = 0;
LD_info->autorecallcount = recallinfo_list_hour.size();
LD_info->autorecall = new autorecall_t * [recallinfo_list_hour.size()];
printf("/home/pq recall mpid=%s\n", LD_info->mp_id);
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
printf("\n %lld ===== %11d\n", recallinfo_list_hour[j].starttime, recallinfo_list_hour[j].endtime);
LD_info->autorecall[j] = new autorecall_t[1];
LD_info->autorecall[j]->start = recallinfo_list_hour[j].starttime;
LD_info->autorecall[j]->end = recallinfo_list_hour[j].endtime;
}
}
cpuno++;
}
i++;
}
QDate date = QDate::fromString(dateString, "yyyy-MM-dd");
date.addDays(-1); // 一天
settings.setValue("Recall/select_day", date.toString("yyyy-MM-dd")); // 重新写入日期字符串
}
#endif
if (localTime.tm_hour > 12 && localTime.tm_hour < 20 && recall_flag1 == 0) {
recall_flag1 = 1;
}
msleep(1000);
}
printf(">>>OnTimerThread::run() is end!!!\n");
}
//补招web处理函数
/*int HandleRecall_http(const httplib::Request& req, httplib::Response& res) //接收并处理Web客户端发来的信息
{
// 打印请求的查询参数
std::cout << "Query parameters: " << std::endl;
if (req.body.empty()) {
res.status = 400; // 返回 400 Bad Request 错误
res.set_content("Missing code or parameter", "application/json");
return 10000;
}
std::cout << "Received code: " << req.body<< std::endl;
try
{
printf("来自web客户端消息\n");
cJSON* json_root = cJSON_Parse(req.body.c_str()); //json格式序列化 //第一个参数
if (json_root == NULL) {
return 10000;
}*/
int recall_json_handle(const char* jstr)
{
//不指定稳态/暂态则全部补招
int stat = 0; //都不补
int voltage= 0;
try{
std::vector<RecallParam> recallParams;
cJSON* json_root = cJSON_Parse(jstr); //json格式序列化 //第一个参数
if (json_root == NULL) {
std::cout << "json root解析错误"<< std::endl;
return 10000;
}
/*cJSON* json_code = NULL;
cJSON* json_msg = NULL;
std::vector<RecallParam> recallParams;
json_code = cJSON_GetObjectItem(json_root, "code"); //获取code
if (json_code != NULL) {
std::cout << "Received code: " << json_code->valuestring << std::endl;
}
else {
return 10000;
}
json_msg = cJSON_GetObjectItem(json_root, "msg"); //获取msg
if (json_code != NULL) {
std::cout << "Received msg: " << json_msg->valuestring << std::endl;
}
else {
return 10000;
}*/
// 获取 "data" 数组
//cJSON* dataArray = cJSON_GetObjectItem(json_root, "data");
// 遍历数组的每个对象
if (json_root->type == cJSON_Array) {
for (cJSON* item = json_root->child; item != nullptr; item = item->next) {
// 获取 monitorId 数组
cJSON* monitorIdArray = cJSON_GetObjectItem(item, "monitorId");
cJSON* timeIntervalArray = cJSON_GetObjectItem(item, "timeInterval");
//判断dataType是否为空
cJSON* datatype = cJSON_GetObjectItem(item, "dataType");
//添加异常判断防止崩溃
if(monitorIdArray == NULL || timeIntervalArray == NULL || datatype == NULL ){
std::cout << "json内容解析错误 "<< std::endl;
return 10000;
}
if(strcmp(datatype->valuestring, "") != 0)//非空
{
stat = (strcmp(datatype->valuestring, "0") == 0) ? 1 : 0;//稳态
voltage= (strcmp(datatype->valuestring, "1") == 0) ? 1 : 0;//暂态
}
else //空或其他
{
stat = 1;
voltage= 1;
}
//调试用
if(monitorIdArray != nullptr && monitorIdArray->child != nullptr)std::cout << "monitorIdArray的成员为"<< monitorIdArray->child->valuestring << std::endl;
if(monitorIdArray != nullptr && monitorIdArray->child == nullptr)std::cout << "monitorIdArray没有成员"<< std::endl;
//monitorIdArray有数据的情况
if (monitorIdArray != nullptr && monitorIdArray->type == cJSON_Array && timeIntervalArray->type == cJSON_Array && monitorIdArray->child != nullptr) {
// 遍历 monitorId 数组
for (cJSON* idItem = monitorIdArray->child; idItem != nullptr; idItem = idItem->next) {
QString monitorId = QString(idItem->valuestring);
//添加判断数组中当前监测点是否属于本进程20241230防止出现非本进程的监测点触发补招
int mppair = 0;
ied_t* ied;
ied_usr_t* ied_usr;
for (int t = 0; t < g_node->n_clients; t++){
ied = (ied_t*)g_node->clients[t];
ied_usr = (ied_usr_t*)ied->usr_ext;
for (int m = 0; m<10; m++){//最多10个
if(strcmp(ied_usr->LD_info[m].mp_id,"") == 0)continue;//跳过空的
if(strcmp(ied_usr->LD_info[m].mp_id,monitorId.toStdString().c_str()) == 0){//匹配上了
mppair = 1;
break;//找到就退出监测点循环
}
}
if(mppair == 1)break;//找到就退出终端循环
}
if(mppair == 0)continue;//当前进程的监测点都没有找到这个检测点号,说明不是本进程的监测点,处理数组的下一个监测点
//调试用
std::cout << "find mpid:" << monitorId.toStdString() << "in this process,mppair=" << mppair <<std::endl;
// 遍历 timeInterval 数组
for (cJSON* timeItem = timeIntervalArray->child; timeItem != nullptr; timeItem = timeItem->next) {
QString timeInterval = QString(timeItem->valuestring);
QString start = timeInterval.left(timeInterval.indexOf("~"));
QString end = timeInterval.mid(timeInterval.indexOf("~") + 1);
// 创建 RecallParam 对象并添加到列表中
RecallParam param;
param.mp_id = monitorId;
param.start = start;
param.end = end;
param.stat = stat;
param.voltage = voltage;
recallParams.push_back(param);
}
}
}
//monitorIdArray为空的情况
else if (monitorIdArray != nullptr && monitorIdArray->type == cJSON_Array && monitorIdArray->child == nullptr) {
// monitorIdArray 为空
std::cout << "monitorIdArray is null" << std::endl;
//所有监测点补招
// 遍历前置所有监测点
ied_t* ied;
ied_usr_t* ied_usr;
std::cout << "g_node->n_clients" << g_node->n_clients << std::endl;
for (int t = 0; t < g_node->n_clients; t++){
ied = (ied_t*)g_node->clients[t];
ied_usr = (ied_usr_t*)ied->usr_ext;
for (int m = 0; m<10; m++){
if(strcmp(ied_usr->LD_info[m].mp_id,"") == 0)continue;
std::cout << "ied_usr->LD_info[m].mp_id" << m << " "<< ied_usr->LD_info[m].mp_id << std::endl;
QString monitorId = QString(ied_usr->LD_info[m].mp_id);
// 遍历 timeInterval 数组
for (cJSON* timeItem = timeIntervalArray->child; timeItem != nullptr; timeItem = timeItem->next) {
QString timeInterval = QString(timeItem->valuestring);
QString start = timeInterval.left(timeInterval.indexOf("~"));
QString end = timeInterval.mid(timeInterval.indexOf("~") + 1);
// 创建 RecallParam 对象并添加到列表中
RecallParam param;
param.mp_id = monitorId;
param.start = start;
param.end = end;
param.stat = stat;
param.voltage = voltage;
recallParams.push_back(param);
}
}
}
}
else{
std::cout << "monitorIdArray 不存在或类型不正确" << std::endl;
}
}
}
cJSON_Delete(json_root); //web入参处理结束
//遍历容器取出所有补招
for (std::vector<RecallParam>::iterator it = recallParams.begin(); it != recallParams.end(); ++it) {
QList<RecallInfo> recallinfo_list_hour;
char start_time[64];
char end_time[64];
QString mp_id;
mp_id = it->mp_id;
apr_snprintf(start_time, sizeof(start_time), "%s", it->start.toStdString().c_str());//start_time
apr_snprintf(end_time, sizeof(end_time), "%s", it->end.toStdString().c_str());//end_time
qDebug() << "mp_id" << mp_id << " " << "start_time" << start_time << " " << "end_time" << " " << "stat" << it->stat << " " << "voltage" << it->voltage<< end_time;
Get_Recall_Time_Char(start_time, end_time, recallinfo_list_hour);
for (int j = 0; j < recallinfo_list_hour.size(); j++) {
CJournalRecall jr;
jr.MonitorID = mp_id;
jr.StartTime = QDateTime::fromTime_t(recallinfo_list_hour[j].starttime).toString("yyyy-MM-dd hh:mm:ss");
jr.EndTime = QDateTime::fromTime_t(recallinfo_list_hour[j].endtime).toString("yyyy-MM-dd hh:mm:ss");
//现在暂态稳态根据web获取
//jr.STEADY = QString::number(1, 10); // 将整数 1 转换为字符串并赋值
//jr.VOLTAGE = QString::number(1, 10);// 将整数 1 转换为字符串并赋值
//调试用
//std::cout << "stat" << it->stat << "voltage" << it->voltage << std::endl;
jr.STEADY = QString::number(it->stat);
jr.VOLTAGE = QString::number(it->voltage);
g_StatisticLackList_list_mutex.lock();
g_StatisticLackList.push_back(jr);
g_StatisticLackList_list_mutex.unlock();
}
}
}
catch (exception& e)
{
printf("处理客户端发送的消息错误,原因:%s\n", e.what());
return 10004;
}
return 000000;
}
int rtdata_http(const char* jstr)
{
}
// 声明外部函数http功能用库链接单独编译
#ifdef __cplusplus
extern "C" {
#endif
void httprun();
const char* getReceivedData(int fun);
void threadmsgweb(int fun);
bool threadmsghttp(int fun);
#ifdef __cplusplus
}
#endif
#if 0
void RecallJsonResponse(int result) {
char* ptr=NULL;
// 创建 JSON 对象
cJSON* json_response = cJSON_CreateObject();
// 添加字段
if(result == 000000){
cJSON_AddStringToObject(json_response, "code", "A0000");
cJSON_AddStringToObject(json_response, "msg", "数据补招执行成功");
}
else{
cJSON_AddStringToObject(json_response, "code", "A0002");
cJSON_AddStringToObject(json_response, "msg", "数据补招执行失败");
}
cJSON_AddNullToObject(json_response, "data"); // 设置为 null
// 将 JSON 对象转换为字符串
char* json_string = cJSON_Print(json_response);
std::cout << json_string << std::endl;
//发送回复给对方,只发一次
SendJsonAPI_web("调用方", "", json_string ,&ptr);
// 清理
cJSON_Delete(json_response);
free(json_string); // 释放打印字符串的内存
}
#endif
void WebhttpThread::run()
{
int ret = 1;
printf("WebhttpThread::run() is called ...... \n");
while(1){
//补招进程
if (!threadmsghttp(1) && g_node_id == RECALL_HIS_DATA_BASE_NODE_ID) {//http处理一条消息,状态变为false不再处理消息http此时可能有消息来但是不处理后这个线程开始读取数据
const char* data = getReceivedData(1);//从http中取数据,指针
std::cout << "recall data cfg:" << data <<std::endl;
pthread_mutex_lock(&mtx);
ret = recall_json_handle(data);//处理补招指令
pthread_mutex_unlock(&mtx);
threadmsgweb(1);//读取数据后开启http消息处理此时有消息来才会处理处理完状态变更等下一次循环
}
//3s数据进程
if (!threadmsghttp(2) && g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {//http处理一条消息,状态变为false不再处理消息http此时可能有消息来但是不处理后这个线程开始读取数据
const char* data = getReceivedData(2);//从http中取数据,指针
std::cout << "rt data cfg:" << data <<std::endl;
ret = rtdata_http(data);//处理补招指令
threadmsgweb(2);//读取数据后开启http消息处理此时有消息来才会处理处理完状态变更等下一次循环
}
}
printf("WebhttpThread::run() is end ...... \n");
}
void httpThread::run()
{
printf("httpThread::run() is called ...... \n");
std::cout << "Server started at" << HTTP_IP << ":" << HTTP_PORT << std::endl;
httprun(); //开始运行http监听所有ip端口10004
printf("httpThread::run() is end ...... \n");
}
//在类中定义测试线程任务lnk20250107
//不使用简单的循环线程而是启动一个app不仅执行循环线程而且可以连接输入
/*void mqtestThread::run()
{
printf("mqtestThread::run() is called ...... \n");
while(1)
{
if(G_TEST_NUM != 0){
rocketmq_test_300(G_TEST_NUM,g_front_seg_index);
QThread::sleep(60); // 每次发送间隔1分钟
}
}
printf("mqtestThread::run() is end ...... \n");
}*/
void curltest()
{
char* ptr=NULL;
std::string code = std::string("code1=recall");
SendWebAPI_web("http://192.168.1.149:8091/powerQuality/getProperties", code.c_str(), &ptr);
}
// Base64 编码函数,将输入的字符串编码为 Base64 格式 //实现json中的文件流
std::string base64_encode(const std::string& in) {
// Base64 字符集,由 64 个字符组成
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
std::string out; // 输出字符串
int val = 0; // 当前值
int valb = -6; // 值的位偏移量,初始为 -6
// 遍历输入字符串的每一个字符
for (std::string::const_iterator it = in.begin(); it != in.end(); ++it) {
// 将字符的 ASCII 值左移 8 位并加到 val 中
val = (val << 8) + *it;
valb += 8; // 更新位偏移量,每个字符占 8 位
// 当 valb 大于等于 0 时,说明有足够的位数可以进行编码
while (valb >= 0) {
// 将 val 的高 6 位转化为 Base64 字符,并添加到输出中
out.push_back(base64_chars[(val >> valb) & 0x3F]);
valb -= 6; // 每次编码后,位偏移量减少 6 位
}
}
// 如果还有剩余的位数,补充 '=' 字符
while (valb > -6) {
out.push_back('=');
valb -= 6; // 每次添加一个 '=',位偏移量减少 6 位
}
return out; // 返回编码后的字符串
}
void handleUploadResponse(const std::string& response, char* wavepath) {
// 解析 JSON 响应
cJSON* json_data = cJSON_Parse(response.c_str());
if (json_data == nullptr) {
std::cerr << "Error parsing response: " << cJSON_GetErrorPtr() << std::endl;
return;
}
// 提取字段
cJSON* codeItem = cJSON_GetObjectItem(json_data, "code");
cJSON* msgItem = cJSON_GetObjectItem(json_data, "msg");
cJSON* dataItem = cJSON_GetObjectItem(json_data, "data");
if (codeItem && dataItem) {
std::string code = codeItem->valuestring;
std::cout << "Response Code: " << code << std::endl;
std::string msg = (msgItem != NULL) ? msgItem->valuestring : "not found";
std::cout << "Message: " << msg << std::endl;
cJSON* nameItem = cJSON_GetObjectItem(dataItem, "name");
cJSON* fileNameItem = cJSON_GetObjectItem(dataItem, "fileName");
cJSON* urlItem = cJSON_GetObjectItem(dataItem, "url");
if (nameItem && fileNameItem && urlItem) {
std::string name = nameItem->valuestring;
std::string fileName = fileNameItem->valuestring;
std::string url = urlItem->valuestring;
// 输出信息
std::cout << "File Path: " << name << std::endl;
std::cout << "Uploaded File Name: " << fileName << std::endl;
std::cout << "File URL: " << url << std::endl;
//记录返回的文件路径和文件名
strcpy(wavepath, nameItem->valuestring);
}
} else {
std::cerr << "Error: Missing expected fields in JSON response." << std::endl;
}
// 释放 JSON 对象
cJSON_Delete(json_data);
}
//这是json结构发送的方式
/*void SendFileWeb(const std::string& strUrl, const char* localpath, const char* cloudpath, char* wavepath) {
// 从本地路径读取文件内容
std::ifstream file(localpath, std::ios::binary);
if (!file) {
std::cerr << "Failed to open file: " << localpath << std::endl;
return;
}
std::ostringstream ss;
ss << file.rdbuf();
std::string fileContent = ss.str();//文件流
std::string encodedFile = base64_encode(fileContent);//文件流编码
// 创建 JSON 对象 实现入参要求
cJSON* json_root = cJSON_CreateObject();
cJSON_AddItemToObject(json_root, "multipartFile", cJSON_CreateString(encodedFile.c_str()));
cJSON_AddItemToObject(json_root, "path", cJSON_CreateString(cloudpath));//远端路径
cJSON_AddItemToObject(json_root, "isReserveName", cJSON_CreateBool(true)); // 布尔值
char* szjson = cJSON_Print(json_root);
std::cout << ">>> json: " << szjson << std::endl;
// curl 初始化
CURL* curl = curl_easy_init();
if (curl) {
// 设置请求为 POST 请求
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, szjson);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_slist_append(NULL, "Content-Type: application/json"));
// 设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
std::string resPost0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&resPost0);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply_web); // 设置数据接收和写入函数
// 执行请求
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "lnk web failed: " << curl_easy_strerror(res) << std::endl;
} else {
std::cout << "lnk web success, response: " << resPost0 << std::endl;
handleUploadResponse(resPost0,wavepath); // 处理响应
}
// 清理
free(szjson);
} else {
std::cerr << ">>> curl init failed" << std::endl;
}
curl_easy_cleanup(curl);
cJSON_Delete(json_root);
}*/
//这是dataform发送方式
void SendFileWeb(const std::string& strUrl, const char* localpath, const char* cloudpath, char* wavepath) {
// 初始化 curl
CURL* curl = curl_easy_init();
if (curl) {
// 设置请求 URL 和 POST 请求
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1);
// 创建表单数据
curl_httppost* formpost = nullptr;
curl_httppost* lastptr = nullptr;
// 添加文件字段,直接从本地路径读取文件内容
curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "file",
CURLFORM_FILE, localpath,
CURLFORM_END);
// 添加 `path` 字段
curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "path",
CURLFORM_COPYCONTENTS, cloudpath,
CURLFORM_END);
// 添加 `isReserveName` 字段
curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "isReserveName",
CURLFORM_COPYCONTENTS, "true",
CURLFORM_END);
// 设置表单数据到请求
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
// 设置头信息
struct curl_slist* header_list = nullptr;
header_list = curl_slist_append(header_list, "Content-Type: multipart/form-data");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
// 设置超时时间
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
// 设置写入响应数据的函数
std::string resPost0;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&resPost0);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply_web);
// 执行请求
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "http web failed: " << curl_easy_strerror(res) << std::endl;
} else {
std::cout << "http web success, response: " << resPost0 << std::endl;
handleUploadResponse(resPost0, wavepath); // 处理响应
}
// 清理
curl_formfree(formpost); // 释放表单数据
curl_slist_free_all(header_list); // 释放头部列表
curl_easy_cleanup(curl);
} else {
std::cerr << ">>> curl init failed" << std::endl;
}
}
void SOEFileWeb(char* localpath,char* cloudpath, char* wavepath)
{
//示例ip更换为实际ip即可
SendFileWeb(WEB_FILEUPLOAD,localpath,cloudpath,wavepath);
}
void SOEFileWeb_test()
{
char localpath[128] = {"./file_test.txt"};
char cloudpath[128] = {"/comtrade/file_test.txt"};
char wavepath[128] = {""};
SOEFileWeb(localpath,cloudpath,wavepath);
std::cout << "wavepath" << wavepath << std::endl;
}
/*/////////////////////////////////////////////////////////lnk10-24根据web接口修改/////////////////////////////////////////////////////////////*/
/*封装C可调用的台账更新函数 */////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//3-写入台账内容//////////////////////////////
int update_one_terminal_ledger(terminal* update, int i,ied_t* ied,int terminal_index)
{
chnl_usr_t* chnl_usr = NULL;
ied_usr_t* ied_usr = NULL;
ied_usr = (ied_usr_t*)ied->usr_ext;
// 将 update[i] 中的数据写入到 ied_usr 中
if (strlen(update[i].terminal_id) != 0) {
apr_snprintf(ied_usr->terminal_id, sizeof(ied_usr->terminal_id), "%s", update[i].terminal_id);
printf("ied_usr->terminal_id: %s\n", ied_usr->terminal_id);
}
if (update[i].terminal_code != NULL) {
apr_snprintf(ied_usr->terminal_code, sizeof(ied_usr->terminal_code), "%s", update[i].terminal_code);
printf("ied_usr->terminal_code: %s\n", ied_usr->terminal_code);
}
if (update[i].tmnl_factory != NULL) {
apr_snprintf(ied_usr->tmnl_factory, sizeof(ied_usr->tmnl_factory), "%s", update[i].tmnl_factory);
printf("ied_usr->tmnl_factory: %s\n", ied_usr->tmnl_factory);
}
if (update[i].tmnl_status != NULL) {
apr_snprintf(ied_usr->tmnl_status, sizeof(ied_usr->tmnl_status), "%s", update[i].tmnl_status);
printf("ied_usr->tmnl_status: %s\n", ied_usr->tmnl_status);
}
if (update[i].dev_type != NULL) {
apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", update[i].dev_type);
printf("ied_usr->dev_type: %s\n", ied_usr->dev_type);
}
if (update[i].dev_series != NULL) {
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", update[i].dev_series);
printf("ied_usr->dev_series: %s\n", ied_usr->dev_series);
} else {
apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", ""); // 默认为空字符串
printf("ied_usr->dev_series (default): %s\n", ied_usr->dev_series);
}
if (update[i].dev_key != NULL) {
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", update[i].dev_key);
printf("ied_usr->dev_key: %s\n", ied_usr->dev_key);
} else {
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", ""); // 默认为空字符串
printf("ied_usr->dev_key (default): %s\n", ied_usr->dev_key);
}
ied_usr->dev_idx = terminal_index; // 最新的一个终端排号
printf("dev_idx: %d\n", ied_usr->dev_idx);
ied->channel[0].channel_type = CHANNEL_TYPE_IPV4; // channel
ied->channel[0].addr_str[LONGNAME - 1] = 0; // DEV_IP
if (update[i].addr_str != NULL) {
ied->channel[0].addr = ntohl(inet_addr(update[i].addr_str)); // DEV_IP
strncpy(ied->channel[0].addr_str, update[i].addr_str, LONGNAME - 1); // DEV_IP
printf("ied_usr->addr_str: %s\n", ied->channel[0].addr_str);
} else {
ied->channel[0].addr = ntohl(inet_addr("0.0.0.0")); // DEV_IP
strncpy(ied->channel[0].addr_str, update[i].addr_str, LONGNAME - 1); // DEV_IP
printf("ied_usr->addr_str: %s\n", ied->channel[0].addr_str);
}
if (update[i].port != NULL) {
int port = 102;
if (stringToInt(update[i].port, &port)) {
// 转换成功portStr全为数字并且已经转换为int类型的port
ied->channel[0].port = port; // DEV_PortID
printf("ied_usr->port: %d\n", ied->channel[0].port); // DEV_PortID
} else {
ied->channel[0].port = 102; // DEV_PortID
printf("ied_usr->port: %s, 非合法端口. 使用默认端口: %d\n", update[i].port, ied->channel[0].port); // DEV_PortID
}
}
if (update[i].timestamp != NULL && strlen(update[i].timestamp) > 0) {
// 构造struct tm对象
struct tm timeinfo = {0}; // 初始化为0
// 假设时间字符串格式为 "YYYY-MM-DD HH:MM:SS"
// 使用sscanf从字符串中提取各个时间字段
if (sscanf(update[i].timestamp, "%4d-%2d-%2d %2d:%2d:%2d",
&timeinfo.tm_year, &timeinfo.tm_mon, &timeinfo.tm_mday,
&timeinfo.tm_hour, &timeinfo.tm_min, &timeinfo.tm_sec) == 6) {
// 将年份从1900开始计算
timeinfo.tm_year -= 1900;
// 月份从0开始计算减去1
timeinfo.tm_mon -= 1;
// 对tm_isdst进行初始化通常可以设置为-1由mktime自动判断
timeinfo.tm_isdst = -1;
// 使用mktime将struct tm转换为time_t
time_t raw_time = mktime(&timeinfo);
// 判断mktime是否成功
if (raw_time != -1) {
ied_usr->time = (long long)raw_time;
printf("ied_usr->time: %lld\n", ied_usr->time);
} else {
printf("Error: mktime failed.\n");
}
} else {
printf("Error: sscanf failed. Invalid timestamp format.\n");
return -1;
}
}
chnl_usr = (chnl_usr_t*)apr_pcalloc(g_init_pool, sizeof(chnl_usr_t));
ied->channel[0].connect = chnl_usr;
chnl_usr->chnl = &(ied->channel[0]);
chnl_usr->chnl_id = 0;
chnl_usr->m_state = CHANNEL_DISCONNECTED;
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
g_pt61850app->chnl_counts++;
// 将 monitorData 中的数据写入到 LD_info 中
int count_real_monitor = 0; //遍历监测点台账的计数器
int j;
for (j = 0; j < 10 && update[i].line[j].monitor_id[0] != '\0'; ++j) {
monitor monitor_data = update[i].line[j];
//监测点计数
count_real_monitor++;
// 初始化 LD_info
LD_info_t line_info;
memset(&line_info, 0, sizeof(line_info));
char logical_device_seq[64];
// 填充监测点信息
strncpy(line_info.mp_id, monitor_data.monitor_id, sizeof(line_info.mp_id) - 1);
strncpy(line_info.name, monitor_data.monitor_name, sizeof(line_info.name) - 1);
strncpy(line_info.voltage_level, monitor_data.voltage_level, sizeof(line_info.voltage_level) - 1);
strncpy(line_info.v_wiring_type, monitor_data.terminal_connect, sizeof(line_info.v_wiring_type) - 1);
strncpy(line_info.monitor_status, monitor_data.status, sizeof(line_info.monitor_status) - 1);
strncpy(line_info.terminal_code, monitor_data.terminal_code, sizeof(line_info.terminal_code) - 1);
strncpy(logical_device_seq, monitor_data.logical_device_seq, sizeof(logical_device_seq) - 1);
if (isCharPtrEmpty(logical_device_seq)) {
line_info.cpuno = 1; // 默认监测点实例号1
printf("logical_device_seq: is null, set cpuno: %d\n", line_info.cpuno);
} else {
line_info.cpuno = atoi(logical_device_seq);
printf("logical_device_seq: %d\n", line_info.cpuno);
}
line_info.line_id = count_real_monitor; // 记录终端排号
printf("line_id: %d\n", line_info.line_id);
printf("mp_id: %d\n", line_info.mp_id);
printf("terminal_code: %s\n", line_info.terminal_code);
printf("voltage_level: %d\n", line_info.voltage_level);
printf("v_wiring_type: %d\n", line_info.v_wiring_type);
printf("monitor_status: %d\n", line_info.monitor_status);
printf("name: %s\n", line_info.name);
// 填充时间戳
if (update[i].timestamp[0] != '\0') {
struct tm timeinfo;
char timestamp[64];
// 假设update[i].timestamp格式为 "YYYY-MM-DD HH:MM:SS"
// 例如:"2023-01-14 12:34:56"
sscanf(update[i].timestamp, "%4d-%2d-%2d %2d:%2d:%2d",
&timeinfo.tm_year, &timeinfo.tm_mon, &timeinfo.tm_mday,
&timeinfo.tm_hour, &timeinfo.tm_min, &timeinfo.tm_sec);
// 将年份从1900年开始计算
timeinfo.tm_year -= 1900;
// 月份从0开始减1
timeinfo.tm_mon -= 1;
// 对tm_isdst进行初始化通常可以设置为-1由mktime自动判断
timeinfo.tm_isdst = -1;
// 使用mktime将struct tm转换为time_t
time_t raw_time = mktime(&timeinfo);
// 判断mktime是否成功
if (raw_time != -1) {
line_info.time = (long long)raw_time;
printf("time: %lld\n", line_info.time);
} else {
printf("Error: mktime failed.\n");
return -1;
}
}
line_info.read_flag = 1; //监测点有效
// 填充 LD_info
if (ied && ied->usr_ext && line_info.cpuno && ((int)line_info.cpuno < 10)) {
char str[256];
byte_t cpuno = line_info.cpuno;
printf("cpuno: %d\n", line_info.cpuno);
printf("index cpuno: %d\n", cpuno - 1);
ied_usr = (ied_usr_t*)ied->usr_ext;
ied_usr->LD_info[cpuno - 1] = line_info; // cpuno默认是1
ied_usr->LD_info[cpuno - 1].ied = ied;
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);
ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);
ied_usr->LD_info[cpuno - 1].rptcount = 0;
printf("rptcount: %d\n", ied_usr->LD_info[cpuno - 1].rptcount);
if (cpuno > ied->cpucount) {
ied->cpucount = cpuno;
}
}
// ied_usr->LD_info[j] = line_info;
printf("Monitor Info [ID: %s, Name: %s] saved in LD_info\n", line_info.mp_id, line_info.name);
}
return 0;
}
//3-写入台账内容///////////////////////////////////
//4-配置映射文件//////////////////////////////
//4-配置映射文件///////////////////////////////////
//5-报告块初始化//////////////////////////////
//5-报告块初始化///////////////////////////////////
//6-init_rem_dib_table//////////////////////////////
//6-init_rem_dib_table///////////////////////////////////
/*封装C可调用的台账更新函数 */////////////////////////////////////////////////////////////////////////////////////////////////////////////////////