Files
microser/json/save2json.cpp

2929 lines
89 KiB
C++
Raw Normal View History

2025-01-16 16:17:01 +08:00
/**
* @file: $RCSfile: save2json.cpp,v $
* @brief: $IEC 61850 Protocol
*
* @version: $Revision: 1.21 $
* @date: $Date: 2020/10/27 08:51:07 $
* @author: $Author: lizhongming $
* @state: $State: Exp $
*
* @latest: $Id: save2json.cpp,v 1.21 2020/10/27 08:51:07 lizhongming Exp $
*
*/
using namespace std;
#include <iostream>
#include <stdio.h>
#include <assert.h>
#include <fstream> // std::filebuf
#include <string.h>
#include <sstream>
#include "qdebug.h"
#include <QSettings>
#include <QDateTime>
#include <QDir>
#include <QMap>//CZY 2023-08-17 WW 2023<32><33>3<EFBFBD><33>13<31><33>17:21:02 <20><><EFBFBD>Ӷ<EFBFBD>ICD֧<44><D6A7>
#include <apr_uuid.h>
#include <apr_strings.h>
#include "../mms/db_interface.h"
#include "../json/save2json.h"
#include "../json/mms_json_inter.h"
#include "kafka_producer.h"
/*lnk10-11 */
//#include "../include/rocketmq/SimpleProducer.h"
#include "../include/rocketmq/CPushConsumer.h"
#include <vector>
#include "../json/cjson.h" //<2F><>json
#include <sstream> //<2F><><EFBFBD><EFBFBD>xml
#include <fstream> //<2F><><EFBFBD><EFBFBD>xml
bool createXmlFile(int devindex, int mpindex, bool realData, bool soeData, int limit,std::string type);
extern int recall_json_handle(const char* jstr);
extern std::string intToString(int number);
//extern int stringToInt(const char* str, int* result);
int StringToInt(const std::string& str);
extern pthread_mutex_t mtx;//lnk20250115
2025-01-16 19:16:26 +08:00
2025-01-16 16:17:01 +08:00
#ifdef __cplusplus
extern "C" {
#include "../mms/rdb_client.h"
#include "node.h"//lnk20241223
#include "mvl_defs.h"
#include "mms_vvar.h"
#endif /* __cplusplus */
extern unsigned int g_node_id;
extern int g_front_seg_index;
extern char subdir[128];
extern int comtrade_remain_file_num;
extern node_t* g_node; //lnk20241223
extern LD_info_t* find_LD_info_only_from_mp_id(char* mp_id);//lnk20241223
2025-01-16 19:16:26 +08:00
extern void print_terminal(const terminal* tmnl);
2025-01-16 16:17:01 +08:00
#ifdef __cplusplus
}
#endif
#ifndef nullptr
#define nullptr NULL
#endif
extern QMutex kafka_data_list_mutex;
extern QList<Ckafka_data_t> kafka_data_list;
extern QMutex oss_data_list_mutex;
extern QList<oss_data_t> oss_data_list;
extern int FILE_FLAG;
KafkaSendThread myThrd;
//WW 2023-08-22 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>̺߳<DFB3>WebSokcet<65>߳<EFBFBD>
SQLExcuteThread sqlThrd; //Sqlִ<6C><D6B4><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WebSocketThread socketThrd; //Web Socket<65>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WebhttpThread webhttpThrd; //Web http<74>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lnk202411
httpThread httpThrd; //Web http<74>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lnk202411
//mqtestThread mqtestThrd; //mqtest<73>߳<EFBFBD> lnk202412
//mqtestThread mqtestThrd(nullptr); //mqtest<73>߳<EFBFBD> lnk202412
mqconsumerThread mqconsumerThrd;//mq<6D><71><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>lnk20241213
OnTimerThread onTimerThrd;//<2F><>ʱ<EFBFBD>߳<EFBFBD>
extern QMutex Sql_data_list_mutex; //Sqlִ<6C><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern QList<QString> Sql_data_list; //Sqlִ<6C><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern int g_iOTLFlag; //Sql<71>Ƿ<EFBFBD>ִ<EFBFBD>б<EFBFBD>־(0-<2D><>ִ<EFBFBD>У<EFBFBD>1-ִ<><D6B4>)
extern int g_iSqlListSize; //Sqlִ<6C><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD> ע<><D7A2>Sql<71><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>
extern int FILE_FLAG;
extern int SEND_FLAG;
extern char* BROKER_LIST;
extern char* TOPIC_STAT;
extern char* TOPIC_PST;
extern char* TOPIC_PLT;
extern char* TOPIC_EVENT;
extern char* TOPIC_ALARM;
extern char* TOPIC_SNG;
extern char* TOPIC_RTDATA;//lnk20241220
extern char* UDS_UPLOAD_URL;
extern char g_onlyIP[255]; //ֱ<><D6B1>ij<EFBFBD><C4B3>IP<49><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//WW 2023-08-22 end
//lnk20241216<31><36><EFBFBD><EFBFBD>mq<6D><71><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern std::string G_MQCONSUMER_IPPORT;//rocketmq ip+port
extern std::string G_MQCONSUMER_TOPIC_RT;//topie_realtimedata
extern std::string G_MQCONSUMER_TAG_RT;//tag
extern std::string G_MQCONSUMER_KEY_RT;//key
extern std::string G_MQCONSUMER_TOPIC_UD;//topie_update
extern std::string G_MQCONSUMER_TAG_UD;//tag
extern std::string G_MQCONSUMER_KEY_UD;//key
extern std::string G_MQCONSUMER_TOPIC_RC;//topie_recall
extern std::string G_MQCONSUMER_TAG_RC;//tag
extern std::string G_MQCONSUMER_KEY_RC;//key
extern std::string G_MQCONSUMER_TOPIC_SET;//topie_recall
extern std::string G_MQCONSUMER_TAG_SET;//tag
extern std::string G_MQCONSUMER_KEY_SET;//key
2025-02-26 16:39:10 +08:00
extern std::string G_MQCONSUMER_TOPIC_LOG;//topie_log
extern std::string G_MQCONSUMER_TAG_LOG;//tag
extern std::string G_MQCONSUMER_KEY_LOG;//key
extern std::string G_LOG_TOPIC;//topie
extern std::string G_LOG_TAG;//tag
extern std::string G_LOG_KEY;//key
bool showinshellflag =false;
2025-01-16 16:17:01 +08:00
#define APRTIME_8H (28800000000ULL)
#define APRTIME_1H (3600000000ULL)
///////////////////////////////////////////////////////////////////////////////
const int MAX_LIST_SIZE = 16;
static QMap<int, QList<long long> > real_data_report_map;
static QMap<QString, json_block_data*> json_data_map;//CZY 2023-08-17 ww 2023<32><33>3<EFBFBD><33>13<31><33>17:23:17<31><37>չMap<61><70><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static QMap<QString, json_block_data*> json_flicker_data_map;//CZY 2023-09-11 չMap<61><70><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static QMap<QString, json_block_data*> json_pst_data_map;//CZY 2023-09-11 չMap<61><70><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int urcbRealDataHasReceived(int dev_index, LD_info_t* LD_info, long long Time)
{
QList<long long>& ts_list = real_data_report_map[LD_info->line_id];
bool bFind = ts_list.contains(Time); //ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (bFind == false) {
ts_list.append(Time);
if (ts_list.size() > MAX_LIST_SIZE)
ts_list.removeFirst();
//lnk20241223ÿ<33>յ<EFBFBD>һ<EFBFBD><D2BB>ʵʱ<CAB5><CAB1><EFBFBD>ݾͼ<DDBE><CDBC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int real_report_count = 0;
real_report_count = get_real_report_count(LD_info);
//<2F><><EFBFBD><EFBFBD>
std::cout << "real_report_count is" << real_report_count << std::endl;
std::cout << "mp limit is" << LD_info->limit << std::endl;
if(real_report_count >= LD_info->limit){
std::cout << "real_report_count reach limit!!!"<< std::endl;
//<2F><><EFBFBD><EFBFBD>delete.xml
if (!createXmlFile(dev_index, LD_info->line_id, 0, 0, 0,"delete")) {
std::cerr << "Failed to create delete XML file!!!." << std::endl;
}
}
return 0; //û<><C3BB><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
}
else
return 1; //<2F><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
}
//////////////////////////////////////////////////////////////////////////
void add_comm_log(char* log_str)
{
QDateTime now = QDateTime::currentDateTime();
QString level_str = QString("[info]");
QString head_str = QString("");
QString tail_str = QString("");
#ifdef __GNUC__
QString com_log_fn("/usr/local/saslog/");
#else
QString com_log_fn("../etc/log/");
#endif
if (g_node_id == STAT_DATA_BASE_NODE_ID)
com_log_fn += "comm_100_stat.txt";
else if (g_node_id == THREE_SECS_DATA_BASE_NODE_ID)
com_log_fn += "comm_200_3s.txt";
else if (g_node_id == SOE_COMTRADE_BASE_NODE_ID)
com_log_fn += "comm_300_comtrade.txt";
else if (g_node_id == HIS_DATA_BASE_NODE_ID)
com_log_fn += "comm_400_his.txt";
else if (g_node_id == NEW_HIS_DATA_BASE_NODE_ID) {
com_log_fn.append(QString("comm_400_his_%1.txt").arg(g_front_seg_index));
}
else if(g_node_id == RECALL_HIS_DATA_BASE_NODE_ID)
com_log_fn += "comm_600_recall.txt";
else if (g_node_id == RECALL_ALL_DATA_BASE_NODE_ID) {
com_log_fn.append(QString("comm_700_allrecall_%1.txt").arg(g_front_seg_index));
}
else
com_log_fn += "comm_x00_unknown.txt";
QFile file(com_log_fn);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
return;
QTextStream out(&file);
out << (now.toString("yyyy-MM-dd hh:mm:ss") + " " + level_str + " " + QString::fromAscii(log_str)) << endl;
}
void add_sng_log(char* log_str)
{
QDateTime now = QDateTime::currentDateTime();
QString level_str = QString("[info]");
QString head_str = QString("");
QString tail_str = QString("");
#ifdef __GNUC__
QString com_log_fn("/usr/local/saslog/");
#else
QString com_log_fn("../etc/log/");
#endif
com_log_fn += "sng_kafka_json.txt";
QFile file(com_log_fn);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
return;
QTextStream out(&file);
out << (now.toString("yyyy-MM-dd hh:mm:ss") + " " + level_str + " " + QString::fromAscii(log_str)) << endl;
}
void add_stat_kafka_json_log(char* log_str)
{
QDateTime now = QDateTime::currentDateTime();
QString level_str = QString("[info]");
QString head_str = QString("");
QString tail_str = QString("");
#ifdef __GNUC__
QString com_log_fn("/usr/local/saslog/");
#else
QString com_log_fn("../etc/log/");
#endif
com_log_fn += "stat_kafka_json.txt";
QFile file(com_log_fn);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
return;
QTextStream out(&file);
out << (now.toString("yyyy-MM-dd hh:mm:ss") + " " + level_str + " " + QString::fromAscii(log_str)) << endl;
}
////////////////////////////////////////////////////////////////////////////
/*void TrimLeft(std::string &s)
{
const std::string &space =" \f\n\t\r\v";
s.erase(0, s.find_first_not_of(space));
}
void TrimRight(std::string &s)
{
const std::string &space =" \f\n\t\r\v";
s.erase(s.find_last_not_of(space) + 1);
}
void Trim(std::string &s)
{
const std::string &space =" \f\n\t\r\v";
s.erase(0, s.find_first_not_of(space));
s.erase(s.find_last_not_of(space) + 1);
}
int is_rpt_Time_exact_hour()
{
apr_time_t hour_time_t = g_db_info->TimeID[RPT_IDX]/APRTIME_8H*APRTIME_8H;
if (g_db_info->TimeID[RPT_IDX]==hour_time_t)
return TRUE;
else
return FALSE;
} */
//char uuid_str[APR_UUID_FORMATTED_LENGTH+1];
//int iii;
//for (iii=0;iii<10;iii++) {
// apr_uuid_t uuid;
// apr_uuid_get(&uuid);
// apr_uuid_format(uuid_str,&uuid);
// printf("uuid_str=%s \n",uuid_str);
//}
//////////////////////////////////////////////////////////////////////////
/*<2A><><EFBFBD><EFBFBD>rocketmq<6D><71><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk10-10*/
void my_rocketmq_send(Ckafka_data_t& data)
{
static std::string topic;
static std::string cfg_His_tp;
static std::string cfg_PLT_tp;
static std::string cfg_PST_tp;
static std::string cfg_Evt_tp;
static std::string cfg_Alm_tp;
static std::string cfg_Rt_tp;
static bool init = false;
if (!init) {
2025-01-16 16:17:01 +08:00
cfg_His_tp = TOPIC_STAT;
cfg_PLT_tp = TOPIC_PLT;
cfg_PST_tp = TOPIC_PST;
cfg_Evt_tp = TOPIC_EVENT;
cfg_Alm_tp = TOPIC_ALARM;
cfg_Rt_tp = TOPIC_RTDATA;
init = true;
2025-01-16 16:17:01 +08:00
}
std::string key = data.mp_id.toStdString();
std::string senddata = data.strText.toStdString();
if (data.strTopic == "HISDATA")
{
topic = cfg_His_tp;
}
else if (data.strTopic == "PLT")
{
topic = cfg_PLT_tp;
}
else if (data.strTopic == "PST")
{
topic = cfg_PST_tp;
}
else if (data.strTopic == "Event")
{
topic = cfg_Evt_tp;
}
else if (data.strTopic == "Alm")
{
topic = cfg_Alm_tp;
}
else if (data.strTopic == "RTDATA")//lnk20241220
{
topic = cfg_Rt_tp;
}
else
{
topic = data.strTopic.toStdString();
2025-02-27 16:28:04 +08:00
2025-01-16 16:17:01 +08:00
}
if (g_onlyIP[0] != 0)
{
//<2F><><EFBFBD><EFBFBD>ģʽ
add_sng_log(data.strText.toAscii().data());
}
rocketmq_producer_send(const_cast<char*>(senddata.c_str()),const_cast<char*>(topic.c_str()));
//printf("\nrocketmq send, monitor_id:[%s] topic:[%s] Success\n", key.c_str(), topic.c_str());
}
void my_kafka_send(Ckafka_data_t& data)
{
#ifdef __GNUC__
static FeKafkaProducer kafkaProducer;
#endif
int retsize = -1;
static std::string topic;
static std::string cfg_His_tp;
static std::string cfg_PLT_tp;
static std::string cfg_PST_tp;
static std::string cfg_Evt_tp;
static std::string cfg_Alm_tp;
static std::string cfg_Sng_tp;
static bool init = false;
if (!init) {
2025-01-16 16:17:01 +08:00
cfg_His_tp = TOPIC_STAT;
cfg_PLT_tp = TOPIC_PLT;
cfg_PST_tp = TOPIC_PST;
cfg_Evt_tp = TOPIC_EVENT;
cfg_Alm_tp = TOPIC_ALARM;
cfg_Sng_tp = TOPIC_SNG;
//QString topic_cfg = settings.value("Kafka/topic","").toString();
//printf("!!!!!!!!!kafka producer init Failed(%s)\n", cfg_tp);
cout << cfg_His_tp << endl;
//std::string brokerlist = brl_cfg.toStdString();//"10.240.16.145:6667,10.240.16.146:6667,10.240.16.147:6667,10.240.16.148:6667,10.240.16.149:6667";
std::string brokerlist = BROKER_LIST;
//topic = topic_cfg.toStdString();//"test";
#ifdef __GNUC__
if (kafkaProducer.init(brokerlist)) {
printf("kafka producer init success(%s)\n", brokerlist.c_str());
/*bool ret = kafkaProducer.create_topic(topic);
if(ret)
printf("create topic OK \n");
else
printf("create topic Failed \n");*/
}
else
printf("kafka producer init Failed(%s)\n", brokerlist.c_str());
#endif
init = true;
2025-01-16 16:17:01 +08:00
}
char tmp_str[256];
apr_snprintf(tmp_str, sizeof(tmp_str), "%d", data.monitor_id);
std::string key = std::string(tmp_str);
//std::string key_mp_id = data.mp_id.toStdString();
//key = data.monitor_id;
std::string senddata = data.strText.toStdString();
if (data.strTopic == "HISDATA")
{
topic = cfg_His_tp;
}
else if (data.strTopic == "PLT")
{
topic = cfg_PLT_tp;
}
else if (data.strTopic == "PST")
{
topic = cfg_PST_tp;
}
else if (data.strTopic == "Event")
{
topic = cfg_Evt_tp;
add_stat_kafka_json_log(data.strText.toAscii().data());
}
else if (data.strTopic == "Alm")
{
topic = cfg_Alm_tp;
}
else
{
topic = data.strTopic.toStdString();
}
//QDateTime currentTime = QDateTime::currentDateTime();
//QTime time = currentTime.time();
//if (time >= QTime(23, 30) || time < QTime(01, 00)) {
// // The current time is between 23:00 and 00:30
// add_sng_log(data.strText.toAscii().data());
//}
//add_sng_log(data.strText.toAscii().data());
if (g_onlyIP[0] != 0)
{
//<2F><><EFBFBD><EFBFBD>ģʽ
//topic = cfg_Evt_tp;
//key = "2606L20071";
//senddata = "{\"DATA_TYPE\":\"02\" , \"Monitor\":\"2606123456\" , \"Value\":{\"TIME\":\"1699576200000\", \"F_S\":{\"A\":{ \"PST\":\"0.000000\",\"FLUC\":\"343917.750000\",\"FLUCF\":\"374275.000000\" }, \"B\":{ \"PST\":\"0.000000\",\"FLUC\":\"222171.156250\",\"FLUCF\":\"369039.000000\" }, \"C\":{ \"PST\":\"0.000000\",\"FLUC\":\"208060.968750\",\"FLUCF\":\"369239.000000\" }}}}";
//senddata = "{\"DATA_TYPE\":\"04\",\"Monitor\":\"2606L20071\",\"Value\":{\"FLAG\":1,\"TIME\":1700193136480,\"VOLTAGE\":{\"MAG\":95.181,\"DUR\":54,\"STARTTIME\":1700193136480,\"ENDTIME\":1700193136634,\"DISKIND\":\"01\",\"WAVEFILE\":\"PQ_PQLD1_000392_20231117_115216_580\",\"PHASIC\":\"B\"}}}";
add_sng_log(data.strText.toAscii().data());
//char* cstr = new char[senddata.length() + 1];
//std::strcpy(cstr, senddata.c_str());
//add_sng_log(cstr);
//delete[] cstr; // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
}
#ifdef __GNUC__
//send data
retsize = kafkaProducer.send(senddata.c_str(), senddata.length(), topic, RdKafka::Topic::PARTITION_UA, &key);
#endif
if (retsize > 0) {
printf("\nkafka send, monitor_id:[%s] topic:[%s] Success,return length %d\n", key.c_str(), topic.c_str(), retsize);
}
else
printf("\nFailed kafka send, monitor_id:[%s] topic:[%s]\n", key.c_str(), topic.c_str());
//printf("\n--------------------------------------\n%s\n--------------------------------------\n",senddata.c_str() ); // WW 2023-08-16
}
void my_datahub_send(Ckafka_data_t& data)
{
static std::string topic;
static std::string cfg_His_tp;
static std::string cfg_PLT_tp;
static std::string cfg_PST_tp;
static std::string cfg_Evt_tp;
static std::string cfg_Alm_tp;
static bool init = false;
if (!init) {
2025-01-16 16:17:01 +08:00
//QString MyKafkaIniFilename = QString("../etc/") + QString("mykafka.ini"); //+QString::fromAscii(subdir)
//QSettings settings(MyKafkaIniFilename, QSettings::IniFormat);
//QString brl_cfg = settings.value("Kafka/brokerlist", "").toString();
//QString topic_his = settings.value("Kafka/HisTopic", "").toString();
//QString topic_plt = settings.value("Kafka/PLTTopic", "").toString();
//QString topic_pst = settings.value("Kafka/PSTTopic", "").toString();
//QString topic_evt = settings.value("Kafka/EventTopic", "").toString();
//QString topic_alm = settings.value("Kafka/AlmTopic", "").toString();
//cfg_His_tp = topic_his.toStdString();
//cfg_PLT_tp = topic_plt.toStdString();
//cfg_PST_tp = topic_pst.toStdString();
//cfg_Evt_tp = topic_evt.toStdString();
//cfg_Alm_tp = topic_alm.toStdString();
cfg_His_tp = TOPIC_STAT;
cfg_PLT_tp = TOPIC_PLT;
cfg_PST_tp = TOPIC_PST;
cfg_Evt_tp = TOPIC_EVENT;
cfg_Alm_tp = TOPIC_ALARM;
init = true;
2025-01-16 16:17:01 +08:00
}
std::string key = data.mp_id.toStdString();
std::string senddata = data.strText.toStdString();
if (data.strTopic == "HISDATA")
{
topic = cfg_His_tp;
}
else if (data.strTopic == "PLT")
{
topic = cfg_PLT_tp;
}
else if (data.strTopic == "PST")
{
topic = cfg_PST_tp;
}
else if (data.strTopic == "Event")
{
topic = cfg_Evt_tp;
}
else if (data.strTopic == "Alm")
{
topic = cfg_Alm_tp;
}
else
{
topic = data.strTopic.toStdString();
}
if (g_onlyIP[0] != 0)
{
//<2F><><EFBFBD><EFBFBD>ģʽ
add_sng_log(data.strText.toAscii().data());
}
DataHub_Send_Datahub(const_cast<char*>(topic.c_str()), const_cast<char*>(senddata.c_str()));
printf("\ndatahub send, monitor_id:[%s] topic:[%s] Success\n", key.c_str(), topic.c_str());
}
void concatenate_and_separate(char str1[], char str2[], QString* result) {
QString qstr1 = QString(str1);
QString qstr2 = QString(str2);
*result = qstr1 + "-" + qstr2;
}
void KafkaSendThread::run()
{
//<2F>߳̿<DFB3>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lnk20241211
InitializeProducer();
printf("\nKafkaSendThread::run() is called ...... \n\n");
while (1) {
Ckafka_data_t data;
bool data_gotten;
data_gotten = false;
kafka_data_list_mutex.lock();
if (!kafka_data_list.isEmpty()) {
data_gotten = true;
data = kafka_data_list.takeFirst();
}
kafka_data_list_mutex.unlock();
if (data_gotten) {
static uint32_t count = 0;
printf("BEGIN my_kafka_send no.%i -------->>>>>>>>>>>> %s \n", count,
QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toAscii().data());
if (SEND_FLAG == 1) //kafka<6B><61><EFBFBD><EFBFBD>
{
my_kafka_send(data);
}
else if (SEND_FLAG == 2)//datahub<75><62><EFBFBD><EFBFBD>
{
my_datahub_send(data);
//DataHub_Send_Datahub();
}
else if (SEND_FLAG == 3)//rocketmq<6D><71><EFBFBD><EFBFBD>lnk10-11
{
my_rocketmq_send(data);
}
else //δ<><CEB4><EFBFBD><EFBFBD> Ĭ<><C4AC>mq<6D><71><EFBFBD><EFBFBD>
{
my_rocketmq_send(data);
}
printf("END my_kafka_send no.%i -------->>>>>>>>>>>> %s \n\n", count++,
QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toAscii().data());
}
2025-02-25 16:33:11 +08:00
//lnk20250225<32><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
Ckafka_data_t log_send;
2025-02-26 16:39:10 +08:00
log_send.strTopic = QString::fromStdString(G_LOG_TOPIC);
2025-02-25 16:33:11 +08:00
bool log_gotten;
log_gotten = false;
if(!showinshellflag){
if (debugOutputEnabled) {
// <20><><EFBFBD><EFBFBD> normalOutputEnabled <20><> warnOutputEnabled <20><>Ϊ 0<><30><EFBFBD><EFBFBD> errorOutputEnabled Ϊ 1<><31>ȡ errorList <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> errorList <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pthread_mutex_lock(&debugListMutex);
if (!debugList.empty()) {
log_gotten = true;
log_send.strText = QString::fromStdString(errorList.front());
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>
if (log_send.strText.trimmed().isEmpty()) {
debugList.pop_front(); // ֱ<>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
log_gotten = false; // <20><><EFBFBD><EFBFBD>û<EFBFBD>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־
} else {
debugList.pop_front(); // ֻ<>зǿհ<C7BF><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
pthread_mutex_unlock(&errorListMutex);
2025-02-26 16:39:10 +08:00
}
else if (normalOutputEnabled) {
// <20><><EFBFBD><EFBFBD> normalOutputEnabled Ϊ 1<><31><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD> normalList <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> normalList <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pthread_mutex_lock(&normalListMutex);
if (!normalList.empty()) {
//qDebug() << "flag of list:" << normalOutputEnabled << " " << warnOutputEnabled << " " << errorOutputEnabled << " " << "warnList size: " << warnList.size() << "normalList size: " << normalList.size() << "errorList size: " << errorList.size()<<endl;
log_gotten = true;
log_send.strText = QString::fromStdString(normalList.front());
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>
if (log_send.strText.trimmed().isEmpty()) {
normalList.pop_front(); // ֱ<>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
log_gotten = false; // <20><><EFBFBD><EFBFBD>û<EFBFBD>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־
} else {
normalList.pop_front(); // ֻ<>зǿհ<C7BF><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
pthread_mutex_unlock(&normalListMutex);
} else if (warnOutputEnabled) {
// <20><><EFBFBD><EFBFBD> normalOutputEnabled Ϊ 0<><30><EFBFBD><EFBFBD> warnOutputEnabled Ϊ 1<><31><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD> warnList <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> warnList <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pthread_mutex_lock(&warnListMutex);
if (!warnList.empty()) {
log_gotten = true;
log_send.strText = QString::fromStdString(warnList.front());
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>
if (log_send.strText.trimmed().isEmpty()) {
warnList.pop_front(); // ֱ<>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
log_gotten = false; // <20><><EFBFBD><EFBFBD>û<EFBFBD>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־
} else {
warnList.pop_front(); // ֻ<>зǿհ<C7BF><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
pthread_mutex_unlock(&warnListMutex);
} else if (errorOutputEnabled) {
// <20><><EFBFBD><EFBFBD> normalOutputEnabled <20><> warnOutputEnabled <20><>Ϊ 0<><30><EFBFBD><EFBFBD> errorOutputEnabled Ϊ 1<><31>ȡ errorList <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> errorList <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pthread_mutex_lock(&errorListMutex);
if (!errorList.empty()) {
log_gotten = true;
log_send.strText = QString::fromStdString(errorList.front());
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>
if (log_send.strText.trimmed().isEmpty()) {
errorList.pop_front(); // ֱ<>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
log_gotten = false; // <20><><EFBFBD><EFBFBD>û<EFBFBD>л<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>־
} else {
errorList.pop_front(); // ֻ<>зǿհ<C7BF><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
pthread_mutex_unlock(&errorListMutex);
2025-02-26 16:39:10 +08:00
}
}
2025-02-26 16:39:10 +08:00
if (log_gotten) {
2025-02-27 16:28:04 +08:00
//qDebug() << "send log to topic:" << log_send.strTopic << endl;
2025-02-26 16:39:10 +08:00
static uint32_t count = 0;
2025-02-27 16:28:04 +08:00
//printf("BEGIN current log send no.%i -------->>>>>>>>>>>> %s \n", count,QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toAscii().data());
2025-02-26 16:39:10 +08:00
my_rocketmq_send(log_send);
}
2025-01-16 16:17:01 +08:00
/*if (data_gotten) {
LD_info_t* LD_info = find_LD_info_only_from_mp_id(data.mp_id.toAscii().data());
ied_t* ied;
ied = find_ied_from_dev_code(LD_info->terminal_code);
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);
int cpuno;
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
LD_info = &(ied_usr->LD_info[cpuno]);
data.mp_id.clear();
data.mp_id.append(LD_info->mp_id);
static uint32_t count = 0;
printf("BEGIN my_kafka_send no.%i -------->>>>>>>>>>>> %s \n", count,
QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toAscii().data());
my_kafka_send(data);
printf("END my_kafka_send no.%i -------->>>>>>>>>>>> %s \n\n", count++,
QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toAscii().data());
}
}*/
//lnk 20241031 <20><><EFBFBD>ټ<EFBFBD>¼ƥ<C2BC><C6A5><EFBFBD>ʡ<EFBFBD><CAA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1>
/*
oss_data_t ossdata;
bool oss_data_gotten;
oss_data_gotten = false;
oss_data_list_mutex.lock();
if (!oss_data_list.isEmpty()) {
oss_data_gotten = true;
ossdata = oss_data_list.takeFirst();
}
oss_data_list_mutex.unlock();
if (oss_data_gotten) {
char file_name[256];
memset(file_name, 0, 256);
sprintf(file_name, "%s", ossdata.filename.toAscii().data());
char save_name[256];
memset(save_name, 0, 256);
sprintf(save_name, "%s", ossdata.savename.toAscii().data());
QString uuid_file_name;
std::ofstream file(save_name); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬴<EFBFBD><F3A3ACB4><EFBFBD><EFBFBD>ļ<EFBFBD> example.txt
if (file.is_open()) { // <20>ж<EFBFBD><D0B6>ļ<EFBFBD><C4BC>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
file << ossdata.data.toAscii().data() << "\n";
file.close(); // <20>ر<EFBFBD><D8B1>ļ<EFBFBD>
}
else {
cout << "Unable to open file\n" << endl;
}
if (FILE_FLAG == 1) {
PutOSS(file_name, save_name);
char* file;
// ʹ<><CAB9>strrchr<68>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>'/'<27><>λ<EFBFBD><CEBB>
char* last_slash = strrchr(file_name, '/');
if (last_slash != NULL) {
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>'/'֮<><D6AE><EFBFBD>IJ<EFBFBD><C4B2>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
file = last_slash + 1;
}
else {
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>'/'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
file = file_name;
}
concatenate_and_separate(file_name, file, &uuid_file_name);
}
else if (FILE_FLAG == 2) {
OBSFile(save_name, file_name, "putObject");
char* file;
// ʹ<><CAB9>strrchr<68>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>'/'<27><>λ<EFBFBD><CEBB>
char* last_slash = strrchr(file_name, '/');
if (last_slash != NULL) {
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>'/'֮<><D6AE><EFBFBD>IJ<EFBFBD><C4B2>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
file = last_slash + 1;
}
else {
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>'/'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
file = file_name;
}
concatenate_and_separate(file_name, file, &uuid_file_name);
}
else if (FILE_FLAG == 3) {
char* fileName = (char*)malloc(65 * sizeof(char));
char* uuid = (char*)malloc(65 * sizeof(char));
WebAPI_Uds_Upload(UDS_UPLOAD_URL, save_name, uuid, fileName);
concatenate_and_separate(uuid, fileName, &uuid_file_name);
free(fileName);
free(uuid);
}
else {
}
*/
//lnk 20241031 <20><><EFBFBD>ټ<EFBFBD>¼ƥ<C2BC><C6A5><EFBFBD>ʡ<EFBFBD><CAA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><D4A1>
/*
if (ossdata.log_name=="comm") {
char tnml_code[128];
memset(tnml_code, 0, 128);
sprintf(tnml_code, "%s", ossdata.id.toAscii().data());
errorlog_pgsql(tnml_code, ossdata.time, uuid_file_name);
}
else if (ossdata.log_name == "reason") {
QString pgsql;
pgsql.append(errorlog_num_pgsql(ossdata.id, ossdata.time, uuid_file_name, ossdata.list_num));
cout << pgsql.toAscii().data() << endl;
}
else if (ossdata.log_name == "match") {
QString pqsql;
pqsql.append(errorlog_datamatch_pgsql(ossdata.id, ossdata.time, ossdata.base_mat_num, ossdata.adv_mat_num, ossdata.base_act_num, ossdata.adv_act_num, uuid_file_name));
cout << pqsql.toAscii().data() << endl;
}
std::remove(save_name);
}
else {
msleep(1);
}*/
} //while(1) {
//<2F>߳̽<DFB3><CCBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ShutdownAndDestroyProducer();//lnk20241211
}
//lnk20241213<31><33><EFBFBD>в<EFBFBD><D0B2><EFBFBD>///////////////////////////////////////////////////////////////////////////////////////////////
// <20><>ȡ 'data' <20><><EFBFBD><EFBFBD><E9B2A2><EFBFBD><EFBFBD>Ϊ<EFBFBD>µ<EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD> (<28><><EFBFBD><EFBFBD> std::string)
std::string extractDataJson(const char* inputJson) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
cJSON* root = cJSON_Parse(inputJson);
if (root == NULL) {
std::cerr << "Error parsing JSON" << std::endl;
return "";
}
2025-02-14 16:44:38 +08:00
// <20><>ȡ "messageBody" <20><><EFBFBD><EFBFBD>
cJSON* messageJson = cJSON_GetObjectItem(root, "messageBody");
if (messageJson == NULL || messageJson->type != cJSON_String) {
std::cerr << "'messageJson' is missing or is not an cJSON_String" << std::endl;
2025-02-08 17:04:39 +08:00
cJSON_Delete(root);
2025-02-18 17:10:22 +08:00
return "";
2025-02-14 16:44:38 +08:00
}
// <20><><EFBFBD><EFBFBD> messageBody <20>е<EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-17 16:58:14 +08:00
const char* messageBodyStr = messageJson->valuestring;
if (messageBodyStr == nullptr || strlen(messageBodyStr) == 0) {
std::cerr << "Failed to parse 'messageBody' JSON or it's empty." << std::endl;
cJSON_Delete(root);
2025-02-18 17:10:22 +08:00
return "";
2025-02-17 16:58:14 +08:00
}
cJSON* messageBody = cJSON_Parse(messageBodyStr); // <20><><EFBFBD><EFBFBD> messageBody <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-14 16:44:38 +08:00
if (messageBody == NULL) {
std::cerr << "Failed to parse 'messageBody' JSON." << std::endl;
cJSON_Delete(root);
2025-02-18 17:10:22 +08:00
return "";
2025-02-08 17:04:39 +08:00
}
2025-01-16 16:17:01 +08:00
// <20><>ȡ "data" <20><><EFBFBD><EFBFBD>
2025-02-14 16:44:38 +08:00
cJSON* data = cJSON_GetObjectItem(messageBody, "data");
2025-01-16 16:17:01 +08:00
if (data == NULL || data->type != cJSON_Array) {
std::cerr << "'data' is missing or is not an array" << std::endl;
cJSON_Delete(root);
return "";
}
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> JSON <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD> "data" <20><><EFBFBD><EFBFBD>
cJSON* newJson = cJSON_CreateArray(); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>
// <20><> "data" <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cJSON* dataItem = NULL;
cJSON_ArrayForEach(dataItem, data) {
cJSON_AddItemToArray(newJson, cJSON_Duplicate(dataItem, 1));
}
// <20><><EFBFBD>µ<EFBFBD> JSON <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
char* newJsonString = cJSON_Print(newJson);
if (newJsonString == NULL) {
std::cerr << "Error printing new JSON" << std::endl;
cJSON_Delete(root);
cJSON_Delete(newJson);
return "";
}
// ת<><D7AA>Ϊ std::string <20><><EFBFBD><EFBFBD>
std::string result(newJsonString);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
free(newJsonString);
cJSON_Delete(root);
cJSON_Delete(newJson);
return result; // <20><><EFBFBD><EFBFBD> std::string <20><><EFBFBD>͵Ľ<CDB5><C4BD><EFBFBD>
}
//ʵʱ<CAB5><CAB1><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>//////////////////////////////////////////////////////////////////////////////////////////////////////////
// <20><>ȡ JSON <20><>Ϣ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
bool parseJsonMessageRT(const std::string& body, std::string& devSeries, std::string& line, bool& realData, bool& soeData, int& limit)
{
// <20><><EFBFBD><EFBFBD> JSON <20><><EFBFBD><EFBFBD>
cJSON* root = cJSON_Parse(body.c_str());
if (root == NULL) {
std::cerr << "Failed to parse JSON message." << std::endl;
return false;
}
2025-02-14 16:44:38 +08:00
// <20><>ȡ "messageBody" <20><><EFBFBD><EFBFBD>
cJSON* messageJson = cJSON_GetObjectItem(root, "messageBody");
if (messageJson == NULL || messageJson->type != cJSON_String) {
std::cerr << "'messageJson' is missing or is not an cJSON_String" << std::endl;
2025-02-08 17:04:39 +08:00
cJSON_Delete(root);
2025-02-14 16:44:38 +08:00
return false;
}
// <20><><EFBFBD><EFBFBD> messageBody <20>е<EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-17 16:58:14 +08:00
const char* messageBodyStr = messageJson->valuestring;
if (messageBodyStr == nullptr || strlen(messageBodyStr) == 0) {
std::cerr << "Failed to parse 'messageBody' JSON or it's empty." << std::endl;
cJSON_Delete(root);
return false;
}
cJSON* messageBody = cJSON_Parse(messageBodyStr); // <20><><EFBFBD><EFBFBD> messageBody <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-14 16:44:38 +08:00
if (messageBody == NULL) {
std::cerr << "Failed to parse 'messageBody' JSON." << std::endl;
cJSON_Delete(root);
return false;
2025-02-08 17:04:39 +08:00
}
2025-01-16 16:17:01 +08:00
// <20><>ȡ<EFBFBD>ֶ<EFBFBD>
2025-02-14 16:44:38 +08:00
cJSON* devSeriesItem = cJSON_GetObjectItem(messageBody, "devSeries");
cJSON* lineItem = cJSON_GetObjectItem(messageBody, "line");
cJSON* realDataItem = cJSON_GetObjectItem(messageBody, "realData");
cJSON* soeDataItem = cJSON_GetObjectItem(messageBody, "soeData");
cJSON* limitItem = cJSON_GetObjectItem(messageBody, "limit");
2025-01-16 16:17:01 +08:00
if (devSeriesItem && lineItem && realDataItem && soeDataItem && limitItem) {
devSeries = devSeriesItem->valuestring;
line = lineItem->valuestring;
realData = realDataItem->valueint;
soeData = soeDataItem->valueint;
limit = limitItem->valueint;
} else {
std::cerr << "Missing expected fields in JSON message." << std::endl;
cJSON_Delete(root);
return false;
}
cJSON_Delete(root); // <20><><EFBFBD><EFBFBD> JSON <20><><EFBFBD><EFBFBD>
return true;
}
// <20><><EFBFBD><EFBFBD> XML <20><><EFBFBD>ݵĺ<DDB5><C4BA><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>ɾ<EFBFBD><C9BE>
std::string createnewXmlContent(int devindex, int mpindex, bool realData, bool soeData, int limit)
{
std::ostringstream xmlContent;
xmlContent << "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n"
<< "<Trigger3S>\n"
<< " <New>\n"
<< " <Trigger Line=\"" << mpindex << "\" "
<< "RealData=\"" << (realData ? "true" : "false") << "\" "
<< "DevSeries=\"" << devindex << "\" "
<< "Limit=\"" << limit << "\" "
<< "Count=\"0\" "
<< "SOEData=\"" << (soeData ? "true" : "false") << "\"/>\n"
<< " </New>\n"
<< "</Trigger3S>\n";
return xmlContent.str();
}
std::string createdeleteXmlContent(int devindex, int mpindex)
{
std::ostringstream xmlContent;
xmlContent << "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n"
<< "<Trigger3S>\n"
<< " <Delete>\n"
<< " <Trigger Line=\"" << mpindex << "\" "
<< "RealData=\"false\" "
<< "DevSeries=\"" << devindex << "\" "
<< "Limit=\"0\" "
<< "Count=\"0\" "
<< "SOEData=\"false\"/>\n"
<< " </Delete>\n"
<< "</Trigger3S>\n";
return xmlContent.str();
}
// д<><D0B4> XML <20><><EFBFBD>ݵ<EFBFBD><DDB5>ļ<EFBFBD><C4BC>ĺ<EFBFBD><C4BA><EFBFBD>
bool writeToFile(const std::string& filePath, const std::string& xmlContent)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4> XML <20><><EFBFBD><EFBFBD>
std::ofstream outFile(filePath.c_str()); // ʹ<><CAB9> c_str() ת<><D7AA>Ϊ const char*
if (outFile.is_open()) {
outFile << xmlContent; // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
outFile.close();
std::cout << "XML file created at: " << filePath << std::endl;
return true;
} else {
std::cerr << "Failed to open file for writing: " << filePath << std::endl;
return false;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>µ<EFBFBD> XML <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool createXmlFile(int devindex, int mpindex, bool realData, bool soeData, int limit,std::string type)
{
std::string xmlContent = "";
std::string directory = "";
std::string filePath = "";
if(type == "new"){
// <20><><EFBFBD><EFBFBD> XML <20><><EFBFBD><EFBFBD>
xmlContent = createnewXmlContent(devindex, mpindex, realData, soeData, limit);
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
directory = "../etc/trigger3s/";
filePath = directory + "newtrigger.xml";
}
else if(type == "delete"){
// <20><><EFBFBD><EFBFBD> XML <20><><EFBFBD><EFBFBD>
xmlContent = createdeleteXmlContent(devindex, mpindex);
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
directory = "../etc/trigger3s/";
filePath = directory + "deletetrigger.xml";
}
else{
std::cerr << "Failed to create xmlfile,type error: " << std::endl;
return false;
}
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
if (system(("mkdir -p " + directory).c_str()) != 0) {
std::cerr << "Failed to create directory: " << directory << std::endl;
return false;
}
// <20><> XML <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>
return writeToFile(filePath, xmlContent);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//lnk20250108<30><38><EFBFBD≯<EFBFBD><CCB8>²<EFBFBD><C2B2><EFBFBD>
// <20><><EFBFBD>ڹرս<D8B1><D5BD>̼<EFBFBD><CCBC><EFBFBD><EFBFBD>Ķ˿<C4B6>
extern int server_socket; //Web Socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
void close_listening_socket() {
if (server_socket != -1) {
// <20>ر<EFBFBD>socket
close(server_socket);
std::cout << "Server socket closed successfully!" << std::endl;
server_socket = -1; // <20><><EFBFBD><EFBFBD> server_socket
} else {
std::cout << "No server socket to close!" << std::endl;
}
}
2025-02-08 17:04:39 +08:00
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ip<69><70>ʽ
bool isValidIP(const std::string &ip) {
std::vector<std::string> parts;
std::stringstream ss(ip);
std::string part;
// ʹ<><CAB9> "." <20><>Ϊ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD> IP <20><>ַ<EFBFBD>ָ<EFBFBD><D6B8>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>
while (getline(ss, part, '.')) {
parts.push_back(part);
}
// IP <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 <20><><EFBFBD><EFBFBD>
if (parts.size() != 4) {
return false;
}
// У<><D0A3>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><> 255 ֮<><D6AE>
for (size_t i = 0; i < parts.size(); ++i) {
// У<><D0A3>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
for (size_t j = 0; j < parts[i].size(); ++j) {
if (!isdigit(parts[i][j])) {
return false;
}
}
// ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>Χ<EFBFBD><CEA7>
int num = atoi(parts[i].c_str());
if (num < 0 || num > 255) {
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><E3A3A8> 01<30><31>001 <20>ȣ<EFBFBD>
if (parts[i].length() > 1 && parts[i][0] == '0') {
return false;
}
}
return true;
}
2025-01-16 16:17:01 +08:00
//ִ<>нű<D0BD><C5B1><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>
void execute_bash(string fun,int process_num,string type)
{
// Ϊ char <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF>
char p_num_str[20];
// ʹ<><CAB9> sprintf ת<><D7AA>
std::sprintf(p_num_str, "%d", process_num);
const char* script = "/FeProject/bin/set_process.sh";//ʹ<><CAB9>setsid<69><64>ֹ<EFBFBD>˿<EFBFBD>ռ<EFBFBD><D5BC>
const char* param1 = fun.c_str();
const char* param2 = p_num_str;
const char* param3 = type.c_str();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char command[256];
snprintf(command, sizeof(command), "%s %s %s %s &", script, param1, param2, param3);
std::cout << "command:" << command <<std::endl;
// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
system(command);
}
2025-02-08 17:04:39 +08:00
//ִ<>нű<D0BD><C5B1><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>
2025-02-14 16:44:38 +08:00
void execute_bash_debug(string fun,string ip,string type,int proindex)
2025-02-08 17:04:39 +08:00
{
const char* script = "/FeProject/bin/set_debug.sh";//ʹ<><CAB9>setsid<69><64>ֹ<EFBFBD>˿<EFBFBD>ռ<EFBFBD><D5BC>
const char* param1 = fun.c_str();
const char* param2 = ip.c_str();
const char* param3 = type.c_str();
2025-02-14 16:44:38 +08:00
// <20><> proindex ת<><D7AA>Ϊ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
char param4[32];
snprintf(param4, sizeof(param4), "%d", proindex);
2025-02-08 17:04:39 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char command[256];
2025-02-14 16:44:38 +08:00
snprintf(command, sizeof(command), "%s %s %s %s &", script, param1, param2, param3,param4);
2025-02-08 17:04:39 +08:00
std::cout << "command:" << command <<std::endl;
// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
system(command);
}
2025-01-16 16:17:01 +08:00
void parse_set(const std::string& json_str) {
// <20><><EFBFBD><EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
cJSON* root = cJSON_Parse(json_str.c_str());
if (root == nullptr) {
std::cout << "Error parsing JSON." << std::endl;
return;
}
2025-02-14 16:44:38 +08:00
// <20><>ȡ "messageBody" <20><><EFBFBD><EFBFBD>
cJSON* messageJson = cJSON_GetObjectItem(root, "messageBody");
if (messageJson == NULL || messageJson->type != cJSON_String) {
std::cerr << "'messageJson' is missing or is not an cJSON_String" << std::endl;
2025-02-08 17:04:39 +08:00
cJSON_Delete(root);
return ;
}
2025-02-14 16:44:38 +08:00
// <20><><EFBFBD><EFBFBD> messageBody <20>е<EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-17 16:58:14 +08:00
const char* messageBodyStr = messageJson->valuestring;
if (messageBodyStr == nullptr || strlen(messageBodyStr) == 0) {
std::cerr << "Failed to parse 'messageBody' JSON or it's empty." << std::endl;
cJSON_Delete(root);
return;
}
cJSON* messageBody = cJSON_Parse(messageBodyStr); // <20><><EFBFBD><EFBFBD> messageBody <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-14 16:44:38 +08:00
if (messageBody == NULL) {
std::cerr << "Failed to parse 'messageBody' JSON." << std::endl;
cJSON_Delete(root);
return ;
}
2025-01-16 16:17:01 +08:00
// <20><>ȡ code <20>ֶ<EFBFBD>
2025-02-14 16:44:38 +08:00
cJSON* code = cJSON_GetObjectItem(messageBody, "code");
2025-01-16 16:17:01 +08:00
if (code == nullptr) {
std::cout << "Missing 'code' in JSON." << std::endl;
cJSON_Delete(root);
return;
}
2025-02-14 16:44:38 +08:00
cJSON* index = cJSON_GetObjectItem(messageBody, "index");
2025-01-16 16:17:01 +08:00
if (index == nullptr) {
std::cout << "Missing 'index' in JSON." << std::endl;
cJSON_Delete(root);
return;
}
//<2F>ж<EFBFBD><D0B6>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>̺ţ<CCBA>
2025-02-17 16:58:14 +08:00
int index_value = index->valueint;
//string index_value_str = index->valuestring;
//int index_value = StringToInt(index_value_str);
2025-01-16 16:17:01 +08:00
2025-02-08 17:04:39 +08:00
//<2F><><EFBFBD>̺<EFBFBD>Ϊ0<CEAA>Ľ<EFBFBD><C4BD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD>Ϣ
2025-01-16 16:17:01 +08:00
if (index_value != g_front_seg_index && g_front_seg_index !=0) {
std::cout << "msg index:"<< index_value <<"doesnt match self index:" << g_front_seg_index << std::endl;
cJSON_Delete(root);
return;
}
//<2F><><EFBFBD>̺<EFBFBD>Ϊ0<CEAA><30><EFBFBD>߽<EFBFBD><DFBD>̺<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>
std::cout << "msg index:"<< index_value <<" self index:" << g_front_seg_index << std::endl;
// <20><><EFBFBD><EFBFBD> code <20>ֶ<EFBFBD>ִֵ<D6B5>в<EFBFBD>ͬ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>߼<EFBFBD>
std::string code_str = code->valuestring;
if (code_str == "set_process") {
if(g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1){
std::cout << "cfg_stat_data process" << g_front_seg_index <<" handle this msg" << std::endl;
// <20><><EFBFBD><EFBFBD> set_process
2025-02-14 16:44:38 +08:00
cJSON* data = cJSON_GetObjectItem(messageBody, "data");
2025-01-16 16:17:01 +08:00
if (data != nullptr && data->type == cJSON_Array) {
int data_size = cJSON_GetArraySize(data);
for (int i = 0; i < data_size; i++) {
cJSON* item = cJSON_GetArrayItem(data, i);
std::string fun = cJSON_GetObjectItem(item, "fun")->valuestring;
int processNum = cJSON_GetObjectItem(item, "processNum")->valueint;
std::string frontType = cJSON_GetObjectItem(item, "frontType")->valuestring;
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((fun == "reset" || fun == "add") &&
(processNum >=1 && processNum < 10) &&
(frontType == "stat" || frontType == "recall" || frontType == "all")){
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD>нű<D0BD><C5B1><EFBFBD><EFBFBD><EFBFBD>
if(fun == "reset"){
close_listening_socket();
}
execute_bash(fun, processNum, frontType);
std::cout << "!!!!!!!!!!!!!!!! execute mark:" << i << " !!!!!!!!!!!!!!!" <<std::endl;
}
else{
std::cout << "param is not executable" <<std::endl;
}
}
std::cout << "this msg should only execute once" <<std::endl;
}
}
else{
std::cout << "only cfg_stat_data index 1 can control process,this process not handle this msg" << std::endl;
}
}
2025-02-08 17:04:39 +08:00
else if (code_str == "set_debug"){
if(g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1){
std::cout << "cfg_stat_data process" << g_front_seg_index <<" handle this msg" << std::endl;
// <20><><EFBFBD><EFBFBD> set_process
2025-02-14 16:44:38 +08:00
cJSON* data = cJSON_GetObjectItem(messageBody, "data");
2025-02-08 17:04:39 +08:00
if (data != nullptr && data->type == cJSON_Array) {
int data_size = cJSON_GetArraySize(data);
for (int i = 0; i < data_size; i++) {
cJSON* item = cJSON_GetArrayItem(data, i);
std::string fun = cJSON_GetObjectItem(item, "fun")->valuestring;
std::string ip = cJSON_GetObjectItem(item, "ip")->valuestring;
std::string frontType = cJSON_GetObjectItem(item, "frontType")->valuestring;
2025-02-14 16:44:38 +08:00
int proindex = cJSON_GetObjectItem(item, "proindex")->valueint;
2025-02-08 17:04:39 +08:00
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((fun == "start" || fun == "delete") &&
isValidIP(ip) &&
2025-02-14 16:44:38 +08:00
(frontType == "stat" || frontType == "recall" || frontType == "3s" || frontType == "comtrade") &&
(proindex >= 10 && proindex < 100)){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĽ<C3B5><C4BD>̺<EFBFBD>Ӧ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD>10С<30><D0A1>100
execute_bash_debug(fun, ip, frontType,proindex);
2025-02-08 17:04:39 +08:00
std::cout << "!!!!!!!!!!!!!!!! execute mark:" << i << " !!!!!!!!!!!!!!!" <<std::endl;
}
else{
std::cout << "param is not executable" <<std::endl;
}
}
std::cout << "this msg should only execute once" <<std::endl;
}
}
else{
std::cout << "only cfg_stat_data index 1 can control process,this process not handle this msg" << std::endl;
}
}
2025-01-16 16:17:01 +08:00
else{
std::cout << "set process code str error" <<std::endl;
}
// <20>ͷ<EFBFBD> JSON <20><><EFBFBD><EFBFBD>
cJSON_Delete(root);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//lnk20250103̨<33>˸<EFBFBD><CBB8>²<EFBFBD><C2B2><EFBFBD>
// ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD> XML <20>ַ<EFBFBD><D6B7><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>
void add_indent(std::stringstream& stream, int level) {
for (int i = 0; i < level; ++i) {
stream << " "; // ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 <20><><EFBFBD>ո<EFBFBD>
}
}
std::string prepare_update(const std::string& code_str, const terminal& json_data)
{
std::cout << "prepare update" << std::endl;
std::stringstream xmlStream;
int indentLevel = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ڵ<EFBFBD>
add_indent(xmlStream, indentLevel);
xmlStream << "<ledger_update>" << std::endl;
indentLevel++;
if (code_str == "ledger_modify" || code_str == "add_terminal") {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> modify <20><><EFBFBD><EFBFBD>
if (code_str == "ledger_modify") {
add_indent(xmlStream, indentLevel);
xmlStream << "<modify>" << std::endl;
indentLevel++;
}
else {
add_indent(xmlStream, indentLevel);
xmlStream << "<add>" << std::endl;
indentLevel++;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
add_indent(xmlStream, indentLevel);
xmlStream << "<terminalData>" << std::endl;
indentLevel++;
add_indent(xmlStream, indentLevel);
xmlStream << "<id>" << json_data.terminal_id << "</id>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<ip>" << json_data.addr_str << "</ip>" << std::endl; // Assuming `addr_str` for IP
add_indent(xmlStream, indentLevel);
xmlStream << "<devType>" << json_data.dev_type << "</devType>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<maintName>" << json_data.maint_name << "</maintName>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<orgName>" << json_data.org_name << "</orgName>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<port>" << json_data.port << "</port>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<stationName>" << json_data.station_name << "</stationName>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<terminalCode>" << json_data.terminal_code << "</terminalCode>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<updateTime>" << json_data.timestamp << "</updateTime>" << std::endl; // Assuming `timestamp`
add_indent(xmlStream, indentLevel);
xmlStream << "<manufacturer>" << json_data.tmnl_factory << "</manufacturer>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<status>" << json_data.tmnl_status << "</status>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<series>" << json_data.dev_series << "</series>" << std::endl;
2025-02-10 17:03:15 +08:00
//lnk20250210
add_indent(xmlStream, indentLevel);
xmlStream << "<processNo>" << json_data.processNo << "</processNo>" << std::endl;
2025-01-16 16:17:01 +08:00
add_indent(xmlStream, indentLevel);
xmlStream << "<devKey>" << json_data.dev_key << "</devKey>" << std::endl;
// monitorData <20><><EFBFBD><EFBFBD>
for (int i = 0; json_data.line[i].monitor_id[0] != '\0'; i++) {
const monitor& monitor = json_data.line[i];
add_indent(xmlStream, indentLevel);
xmlStream << "<monitorData" << (i + 1) << ">" << std::endl;
indentLevel++;
add_indent(xmlStream, indentLevel);
xmlStream << "<id>" << monitor.monitor_id << "</id>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<name>" << monitor.monitor_name << "</name>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<lineNo>" << monitor.logical_device_seq << "</lineNo>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<voltageLevel>" << monitor.voltage_level << "</voltageLevel>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<ptType>" << monitor.terminal_connect << "</ptType>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<timestamp>" << monitor.timestamp << "</timestamp>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<terminal_code>" << monitor.terminal_code << "</terminal_code>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<status>" << monitor.status << "</status>" << std::endl;
indentLevel--;
add_indent(xmlStream, indentLevel);
xmlStream << "</monitorData>" << std::endl;
}
indentLevel--;
add_indent(xmlStream, indentLevel);
xmlStream << "</terminalData>" << std::endl;
// <20><><EFBFBD><EFBFBD> modify <20><> add <20><>ǩ
if (code_str == "ledger_modify") {
2025-01-16 19:16:26 +08:00
indentLevel--;
2025-01-16 16:17:01 +08:00
add_indent(xmlStream, indentLevel);
xmlStream << "</modify>" << std::endl;
2025-01-16 19:16:26 +08:00
2025-01-16 16:17:01 +08:00
}
else {
2025-01-16 19:16:26 +08:00
indentLevel--;
2025-01-16 16:17:01 +08:00
add_indent(xmlStream, indentLevel);
xmlStream << "</add>" << std::endl;
2025-01-16 19:16:26 +08:00
2025-01-16 16:17:01 +08:00
}
} else if (code_str == "delete_terminal") {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> delete <20><><EFBFBD><EFBFBD>
add_indent(xmlStream, indentLevel);
xmlStream << "<delete>" << std::endl;
indentLevel++;
add_indent(xmlStream, indentLevel);
xmlStream << "<terminalData>" << std::endl;
indentLevel++;
add_indent(xmlStream, indentLevel);
xmlStream << "<id>" << json_data.terminal_id << "</id>" << std::endl;
indentLevel--;
add_indent(xmlStream, indentLevel);
xmlStream << "</terminalData>" << std::endl;
indentLevel--;
add_indent(xmlStream, indentLevel);
xmlStream << "</delete>" << std::endl;
}
else {
std::cerr << "code_str error" << std::endl;
return "";
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
indentLevel--;
add_indent(xmlStream, indentLevel);
xmlStream << "</ledger_update>" << std::endl;
return xmlStream.str(); // <20><><EFBFBD>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD> XML <20>ַ<EFBFBD><D6B7><EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>string<6E>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
int StringToInt(const std::string& str) {
std::stringstream ss(str);
int number;
ss >> number; // <20><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ɹ<EFBFBD>
if (ss.fail()) {
std::cerr << "Conversion failed!" << std::endl;
return 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD>񷵻<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʶʧ<CAB6>ܵ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>-1
}
return number;
}
2025-02-25 16:33:11 +08:00
// <20><><EFBFBD><EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
2025-02-26 16:39:10 +08:00
void parse_log(const std::string& json_str) {
2025-02-25 16:33:11 +08:00
// <20><><EFBFBD><EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
cJSON* root = cJSON_Parse(json_str.c_str());
if (root == nullptr) {
std::cout << "Error parsing JSON." << std::endl;
return;
}
// <20><>ȡ "messageBody" <20><><EFBFBD><EFBFBD>
cJSON* messageJson = cJSON_GetObjectItem(root, "messageBody");
if (messageJson == NULL || messageJson->type != cJSON_String) {
std::cerr << "'messageJson' is missing or is not an cJSON_String" << std::endl;
cJSON_Delete(root);
return ;
}
// <20><><EFBFBD><EFBFBD> messageBody <20>е<EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
const char* messageBodyStr = messageJson->valuestring;
if (messageBodyStr == nullptr || strlen(messageBodyStr) == 0) {
std::cerr << "Failed to parse 'messageBody' JSON or it's empty." << std::endl;
cJSON_Delete(root);
return;
}
cJSON* messageBody = cJSON_Parse(messageBodyStr); // <20><><EFBFBD><EFBFBD> messageBody <20>ַ<EFBFBD><D6B7><EFBFBD>
if (messageBody == NULL) {
std::cerr << "Failed to parse 'messageBody' JSON." << std::endl;
cJSON_Delete(root);
return ;
}
// <20><>ȡ code <20>ֶ<EFBFBD>
cJSON* code = cJSON_GetObjectItem(messageBody, "code");
if (code == nullptr) {
std::cout << "Missing 'code' in JSON." << std::endl;
cJSON_Delete(root);
return;
}
cJSON* index = cJSON_GetObjectItem(messageBody, "index");
if (index == nullptr) {
std::cout << "Missing 'index' in JSON." << std::endl;
cJSON_Delete(root);
return;
}
//<2F>ж<EFBFBD><D0B6>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>̺ţ<CCBA>
int index_value = index->valueint;
//string index_value_str = index->valuestring;
//int index_value = StringToInt(index_value_str);
//<2F><><EFBFBD>̺<EFBFBD>Ϊ0<CEAA>Ľ<EFBFBD><C4BD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (index_value != g_front_seg_index) {
std::cout << "msg index:"<< index_value <<"doesnt match self index:" << g_front_seg_index << std::endl;
cJSON_Delete(root);
return;
}
//<2F><><EFBFBD>̺<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>
std::cout << "msg index:"<< index_value <<" self index:" << g_front_seg_index << std::endl;
// <20><><EFBFBD><EFBFBD> code <20>ֶ<EFBFBD>ִֵ<D6B5>в<EFBFBD>ͬ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>߼<EFBFBD>
std::string code_str = code->valuestring;
if (code_str == "set_log") {
// <20><><EFBFBD><EFBFBD> set_process
cJSON* data = cJSON_GetObjectItem(messageBody, "data");
if (data != nullptr && data->type == cJSON_Array) {
int data_size = cJSON_GetArraySize(data);
for (int i = 0; i < data_size; i++) {
cJSON* item = cJSON_GetArrayItem(data, i);
std::string fun = cJSON_GetObjectItem(item, "fun")->valuestring;
std::string level = cJSON_GetObjectItem(item, "level")->valuestring;
std::string frontType = cJSON_GetObjectItem(item, "frontType")->valuestring;
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(frontType == subdir){
if(fun == "open"){
2025-02-26 16:39:10 +08:00
if (level == "ERROR"){
2025-02-25 16:33:11 +08:00
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
redirectErrorOutput(true);
}
2025-02-26 16:39:10 +08:00
else if (level == "WARN"){
2025-02-25 16:33:11 +08:00
// <20><><EFBFBD>ø澯<C3B8><E6BEAF><EFBFBD><EFBFBD>
redirectWarnOutput(true);
}
2025-02-26 16:39:10 +08:00
else if (level == "NORMAL"){
2025-02-25 16:33:11 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
redirectNormalOutput(true);
}
else if (level == "DEBUG"){
// <20><><EFBFBD><EFBFBD> debug (ֻ<>浽 debugList<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ն<EFBFBD>)
redirectDebugOutput(true);
}
2025-02-25 16:33:11 +08:00
else{
2025-02-26 16:39:10 +08:00
std::cout << "level error" <<std::endl;
2025-02-25 16:33:11 +08:00
}
}
else{
2025-02-26 16:39:10 +08:00
if (level == "ERROR"){
2025-02-25 16:33:11 +08:00
// <20>رմ<D8B1><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
redirectErrorOutput(false);
}
2025-02-26 16:39:10 +08:00
else if (level == "WARN"){
2025-02-25 16:33:11 +08:00
// <20><><EFBFBD>ø澯<C3B8><E6BEAF><EFBFBD><EFBFBD>
redirectWarnOutput(false);
}
2025-02-26 16:39:10 +08:00
else if (level == "NORMAL"){
2025-02-25 16:33:11 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
redirectNormalOutput(false);
}
else if (level == "DEBUG"){
redirectDebugOutput(false);
}
2025-02-25 16:33:11 +08:00
else{
redirectDebugOutput(false);
2025-02-27 16:28:04 +08:00
redirectErrorOutput(false);
redirectWarnOutput(false);
redirectNormalOutput(false);
std::cout << "close all log" <<std::endl;
2025-02-25 16:33:11 +08:00
}
}
}
else{
std::cout << "front type doesnt match" <<std::endl;
}
}
std::cout << "this msg should only execute once" <<std::endl;
}
2025-02-26 16:39:10 +08:00
}
2025-02-25 16:33:11 +08:00
// <20>ͷ<EFBFBD> JSON <20><><EFBFBD><EFBFBD>
cJSON_Delete(root);
}
2025-01-16 16:17:01 +08:00
// <20><><EFBFBD><EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
void parse_control(const std::string& json_str, const std::string& output_dir) {
// <20><><EFBFBD><EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
cJSON* root = cJSON_Parse(json_str.c_str());
if (root == nullptr) {
std::cout << "Error parsing JSON." << std::endl;
return;
}
2025-02-14 16:44:38 +08:00
// <20><>ȡ "messageBody" <20><><EFBFBD><EFBFBD>
cJSON* messageJson = cJSON_GetObjectItem(root, "messageBody");
if (messageJson == NULL || messageJson->type != cJSON_String) {
std::cerr << "'messageJson' is missing or is not an cJSON_String" << std::endl;
2025-02-08 17:04:39 +08:00
cJSON_Delete(root);
return ;
}
2025-02-14 16:44:38 +08:00
// <20><><EFBFBD><EFBFBD> messageBody <20>е<EFBFBD> JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-17 16:58:14 +08:00
const char* messageBodyStr = messageJson->valuestring;
if (messageBodyStr == nullptr || strlen(messageBodyStr) == 0) {
std::cerr << "Failed to parse 'messageBody' JSON or it's empty." << std::endl;
cJSON_Delete(root);
return;
}
cJSON* messageBody = cJSON_Parse(messageBodyStr); // <20><><EFBFBD><EFBFBD> messageBody <20>ַ<EFBFBD><D6B7><EFBFBD>
2025-02-14 16:44:38 +08:00
if (messageBody == NULL) {
std::cerr << "Failed to parse 'messageBody' JSON." << std::endl;
cJSON_Delete(root);
return ;
}
2025-01-16 16:17:01 +08:00
// <20><>ȡ code <20>ֶ<EFBFBD>
2025-02-14 16:44:38 +08:00
cJSON* code = cJSON_GetObjectItem(messageBody, "code");
2025-01-16 16:17:01 +08:00
if (code == nullptr) {
std::cout << "Missing 'code' in JSON." << std::endl;
cJSON_Delete(root);
return;
}
2025-02-14 16:44:38 +08:00
cJSON* index = cJSON_GetObjectItem(messageBody, "index");
2025-01-16 16:17:01 +08:00
if (index == nullptr) {
std::cout << "Missing 'index' in JSON." << std::endl;
cJSON_Delete(root);
return;
}
//<2F>ж<EFBFBD><D0B6>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>̺ţ<CCBA>
2025-02-17 16:58:14 +08:00
int index_value = index->valueint;
//string index_value_str = index->valuestring;
//int index_value = StringToInt(index_value_str);
2025-01-16 16:17:01 +08:00
//<2F><><EFBFBD>̺<EFBFBD>Ϊ0<CEAA>Ľ<EFBFBD><C4BD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (index_value != g_front_seg_index && g_front_seg_index !=0) {
std::cout << "msg index:"<< index_value <<"doesnt match self index:" << g_front_seg_index << std::endl;
cJSON_Delete(root);
return;
}
//<2F><><EFBFBD>̺<EFBFBD>Ϊ0<CEAA><30><EFBFBD>߽<EFBFBD><DFBD>̺<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>
std::cout << "msg index:"<< index_value <<" self index:" << g_front_seg_index << std::endl;
// <20><><EFBFBD><EFBFBD> code <20>ֶ<EFBFBD>ִֵ<D6B5>в<EFBFBD>ͬ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>߼<EFBFBD>
std::string code_str = code->valuestring;
if (code_str == "add_terminal" || code_str == "ledger_modify") {
std::cout << "add or update ledger" <<std::endl;
// <20><><EFBFBD><EFBFBD> add_terminal <20><> ledger_modify
2025-02-14 16:44:38 +08:00
cJSON* data = cJSON_GetObjectItem(messageBody, "data");
2025-01-16 16:17:01 +08:00
if (data != nullptr && data->type == cJSON_Array) {
int data_size = cJSON_GetArraySize(data);
for (int i = 0; i < data_size; i++) {
cJSON* item = cJSON_GetArrayItem(data, i);
terminal json_data;
// <20><><EFBFBD><EFBFBD> terminal_dev <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cJSON* id = cJSON_GetObjectItem(item, "id"); // terminal_id
if (id && id->type == cJSON_String)
std::strncpy(json_data.terminal_id, id->valuestring, sizeof(json_data.terminal_id) - 1);
else
std::strncpy(json_data.terminal_id, "N/A", sizeof(json_data.terminal_id) - 1);
cJSON* name = cJSON_GetObjectItem(item, "name"); // terminal_code
if (name && name->type == cJSON_String)
std::strncpy(json_data.terminal_code, name->valuestring, sizeof(json_data.terminal_code) - 1);
else
std::strncpy(json_data.terminal_code, "N/A", sizeof(json_data.terminal_code) - 1);
cJSON* org_name = cJSON_GetObjectItem(item, "org_name"); // org_name
if (org_name && org_name->type == cJSON_String)
std::strncpy(json_data.org_name, org_name->valuestring, sizeof(json_data.org_name) - 1);
else
std::strncpy(json_data.org_name, "N/A", sizeof(json_data.org_name) - 1);
cJSON* maint_name = cJSON_GetObjectItem(item, "maint_name"); // maint_name
if (maint_name && maint_name->type == cJSON_String)
std::strncpy(json_data.maint_name, maint_name->valuestring, sizeof(json_data.maint_name) - 1);
else
std::strncpy(json_data.maint_name, "N/A", sizeof(json_data.maint_name) - 1);
cJSON* station_name = cJSON_GetObjectItem(item, "stationName"); // station_name
if (station_name && station_name->type == cJSON_String)
std::strncpy(json_data.station_name, station_name->valuestring, sizeof(json_data.station_name) - 1);
else
std::strncpy(json_data.station_name, "N/A", sizeof(json_data.station_name) - 1);
cJSON* manufacturer = cJSON_GetObjectItem(item, "manufacturer"); // tmnl_factory
if (manufacturer && manufacturer->type == cJSON_String)
std::strncpy(json_data.tmnl_factory, manufacturer->valuestring, sizeof(json_data.tmnl_factory) - 1);
else
std::strncpy(json_data.tmnl_factory, "N/A", sizeof(json_data.tmnl_factory) - 1);
cJSON* status = cJSON_GetObjectItem(item, "status"); // tmnl_status
if (status && status->type == cJSON_String)
std::strncpy(json_data.tmnl_status, status->valuestring, sizeof(json_data.tmnl_status) - 1);
else
std::strncpy(json_data.tmnl_status, "N/A", sizeof(json_data.tmnl_status) - 1);
cJSON* dev_type = cJSON_GetObjectItem(item, "devType"); // dev_type
if (dev_type && dev_type->type == cJSON_String)
std::strncpy(json_data.dev_type, dev_type->valuestring, sizeof(json_data.dev_type) - 1);
else
std::strncpy(json_data.dev_type, "N/A", sizeof(json_data.dev_type) - 1);
cJSON* dev_key = cJSON_GetObjectItem(item, "devKey"); // dev_key
if (dev_key && dev_key->type == cJSON_String)
std::strncpy(json_data.dev_key, dev_key->valuestring, sizeof(json_data.dev_key) - 1);
else
std::strncpy(json_data.dev_key, "N/A", sizeof(json_data.dev_key) - 1);
cJSON* dev_series = cJSON_GetObjectItem(item, "series"); // dev_series
if (dev_series && dev_series->type == cJSON_String)
std::strncpy(json_data.dev_series, dev_series->valuestring, sizeof(json_data.dev_series) - 1);
else
std::strncpy(json_data.dev_series, "N/A", sizeof(json_data.dev_series) - 1);
2025-02-10 17:03:15 +08:00
//lnk20250210̨<30>˽<EFBFBD><CBBD>̺<EFBFBD>
cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNoתΪ<D7AA>ַ<EFBFBD><D6B7><EFBFBD>
if (processNo && processNo->type == cJSON_Number) snprintf(json_data.processNo, sizeof(json_data.processNo), "%d", processNo->valueint);
else strncpy(json_data.processNo, "N/A", sizeof(json_data.processNo) - 1);
2025-01-16 16:17:01 +08:00
cJSON* ip = cJSON_GetObjectItem(item, "ip"); // addr_str
if (ip && ip->type == cJSON_String)
std::strncpy(json_data.addr_str, ip->valuestring, sizeof(json_data.addr_str) - 1);
else
std::strncpy(json_data.addr_str, "N/A", sizeof(json_data.addr_str) - 1);
cJSON* port = cJSON_GetObjectItem(item, "port"); // port
if (port && port->type == cJSON_String)
std::strncpy(json_data.port, port->valuestring, sizeof(json_data.port) - 1);
else
std::strncpy(json_data.port, "N/A", sizeof(json_data.port) - 1);
cJSON* updateTime = cJSON_GetObjectItem(item, "updateTime"); // timestamp
if (updateTime && updateTime->type == cJSON_String)
std::strncpy(json_data.timestamp, updateTime->valuestring, sizeof(json_data.timestamp) - 1);
else
std::strncpy(json_data.timestamp, "N/A", sizeof(json_data.timestamp) - 1);
// monitorData <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䵽 line <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cJSON* monitorData = cJSON_GetObjectItem(item, "monitorData");
if (monitorData != nullptr && monitorData->type == cJSON_Array) {
int monitorData_size = cJSON_GetArraySize(monitorData);
for (int j = 0; j < monitorData_size && j < 10; j++) { // <20><><EFBFBD><EFBFBD> 10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cJSON* monitor_item = cJSON_GetArrayItem(monitorData, j);
monitor monitor_data;
cJSON* monitor_id = cJSON_GetObjectItem(monitor_item, "id"); // monitor_id
if (monitor_id && monitor_id->type == cJSON_String)
std::strncpy(monitor_data.monitor_id, monitor_id->valuestring, sizeof(monitor_data.monitor_id) - 1);
else
std::strncpy(monitor_data.monitor_id, "N/A", sizeof(monitor_data.monitor_id) - 1);
cJSON* monitor_name = cJSON_GetObjectItem(monitor_item, "name"); // monitor_name
if (monitor_name && monitor_name->type == cJSON_String)
std::strncpy(monitor_data.monitor_name, monitor_name->valuestring, sizeof(monitor_data.monitor_name) - 1);
else
std::strncpy(monitor_data.monitor_name, "N/A", sizeof(monitor_data.monitor_name) - 1);
cJSON* voltage_level = cJSON_GetObjectItem(monitor_item, "voltageLevel"); // voltage_level
if (voltage_level && voltage_level->type == cJSON_String)
std::strncpy(monitor_data.voltage_level, voltage_level->valuestring, sizeof(monitor_data.voltage_level) - 1);
else
std::strncpy(monitor_data.voltage_level, "N/A", sizeof(monitor_data.voltage_level) - 1);
cJSON* monitor_status = cJSON_GetObjectItem(monitor_item, "status"); // status
if (monitor_status && monitor_status->type == cJSON_String)
std::strncpy(monitor_data.status, monitor_status->valuestring, sizeof(monitor_data.status) - 1);
else
std::strncpy(monitor_data.status, "N/A", sizeof(monitor_data.status) - 1);
2025-01-16 19:16:26 +08:00
cJSON* lineNo = cJSON_GetObjectItem(monitor_item, "lineNo"); // logical_device_seq
2025-01-16 16:17:01 +08:00
if (lineNo && lineNo->type == cJSON_String)
2025-01-16 19:16:26 +08:00
2025-01-16 16:17:01 +08:00
std::strncpy(monitor_data.logical_device_seq, lineNo->valuestring, sizeof(monitor_data.logical_device_seq) - 1);
2025-01-16 19:16:26 +08:00
else
2025-01-16 16:17:01 +08:00
std::strncpy(monitor_data.logical_device_seq, "N/A", sizeof(monitor_data.logical_device_seq) - 1);
2025-01-16 19:16:26 +08:00
cJSON* ptType = cJSON_GetObjectItem(monitor_item, "ptType"); // terminal_connect
2025-01-16 16:17:01 +08:00
if (ptType && ptType->type == cJSON_String)
2025-01-16 19:16:26 +08:00
2025-01-16 16:17:01 +08:00
std::strncpy(monitor_data.terminal_connect, ptType->valuestring, sizeof(monitor_data.terminal_connect) - 1);
2025-01-16 19:16:26 +08:00
else
2025-01-16 16:17:01 +08:00
std::strncpy(monitor_data.terminal_connect, "N/A", sizeof(monitor_data.terminal_connect) - 1);
std::strncpy(monitor_data.timestamp, json_data.timestamp, sizeof(monitor_data.timestamp) - 1);
std::strncpy(monitor_data.terminal_code, json_data.terminal_code, sizeof(monitor_data.terminal_code) - 1);
// <20><><EFBFBD>䵽 line <20><><EFBFBD><EFBFBD>
json_data.line[j] = monitor_data;
}
}
2025-01-16 19:16:26 +08:00
print_terminal(&json_data);
2025-01-16 16:17:01 +08:00
// ׼<><D7BC> XML <20><><EFBFBD>ݲ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>
std::string xmlContent = prepare_update(code_str, json_data);
if (xmlContent != "") {
std::cout << "write to xml in /FeProject/etc/ledger_update" <<std::endl;
char nodeid[20];
std::sprintf(nodeid, "%u", g_node_id); // "%u" <20><><EFBFBD><EFBFBD> unsigned int
std::string nodeid_str(nodeid);
std::string frontindex_str = intToString(g_front_seg_index);
std::string file_name = output_dir + "/" + nodeid_str + "_" + frontindex_str + "_" + json_data.terminal_id + "_" + code_str + ".xml";
writeToFile(file_name, xmlContent);
}
}
}
}
else if (code_str == "delete_terminal") {
std::cout << "delete ledger" <<std::endl;
// <20><><EFBFBD><EFBFBD> delete_terminal
2025-02-14 16:44:38 +08:00
cJSON* data = cJSON_GetObjectItem(messageBody, "data");
2025-01-16 16:17:01 +08:00
if (data != nullptr && data->type == cJSON_Array) {
int data_size = cJSON_GetArraySize(data);
for (int i = 0; i < data_size; i++) {
cJSON* item = cJSON_GetArrayItem(data, i);
// ֻ<><D6BB><EFBFBD><EFBFBD> id <20>ֶ<EFBFBD>
cJSON* id = cJSON_GetObjectItem(item, "id");
if (id != nullptr) {
terminal json_data;
std::strncpy(json_data.terminal_id, cJSON_GetObjectItem(item, "id")->valuestring, sizeof(json_data.terminal_id) - 1);
// ׼<><D7BC> XML <20><><EFBFBD>ݲ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>
std::string xmlContent = prepare_update(code_str, json_data);
if(xmlContent != ""){
char nodeid[20];
std::sprintf(nodeid, "%u", g_node_id); // "%u" <20><><EFBFBD><EFBFBD> unsigned int
std::string nodeid_str(nodeid);
std::string frontindex_str = intToString(g_front_seg_index);
std::string file_name = output_dir + "/" + nodeid_str + "_" + frontindex_str + "_" + json_data.terminal_id + "_delete_terminal.xml";
writeToFile(file_name, xmlContent);
}
}
}
}
}
else{
std::cout << "code_str error" <<std::endl;
}
// <20>ͷ<EFBFBD> JSON <20><><EFBFBD><EFBFBD>
cJSON_Delete(root);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
int find_dev_index_from_dev_id(std::string dev_id)
{
ied_t* ied = NULL;
int iedno;
ied_usr_t* ied_usr = NULL;
for (iedno = 0; iedno < g_node->n_clients; iedno++) {
ied = g_node->clients[iedno];
ied_usr = (ied_usr_t*)ied->usr_ext;
if (ied_usr && strcmp(ied_usr->terminal_id, dev_id.c_str()) == 0) {
return ied_usr->dev_idx;
}
}
return 0;
}
int find_mp_index_from_mp_id(std::string line)
{
LD_info_t* LD_info = NULL;
LD_info = find_LD_info_only_from_mp_id((char*)line.c_str());
if(LD_info == NULL){
return 0;
}
else{
return LD_info->line_id;
}
}
int myMessageCallbackrtdata(CPushConsumer* consumer, CMessageExt* msg)
{
if (msg == NULL) {
std::cerr << "Received null message." << std::endl;
return E_RECONSUME_LATER;
}
const char* body = GetMessageBody(msg);
const char* key = GetMessageKeys(msg);
if (body == NULL) {
std::cerr << "Message body is NULL." << std::endl;
return E_RECONSUME_LATER;
}
else{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A3AC>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2><EFBFBD>ݣ<EFBFBD>
std::cout << "rt data Callback received message: " << body << std::endl;
if (key) {
std::cout << "Message Key: " << key << std::endl;
}
else {
std::cout << "Message Key: N/A" << std::endl;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string devid, line;
bool realData, soeData;
int limit;
// <20><><EFBFBD><EFBFBD> JSON <20><><EFBFBD><EFBFBD>
if (!parseJsonMessageRT(body, devid, line, realData, soeData, limit)) {
std::cerr << "Failed to parse the JSON message." << std::endl;
return E_RECONSUME_LATER;
}
//mq<6D><71><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ѯ̨<D1AF><CCA8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-02-24 16:45:42 +08:00
pthread_mutex_lock(&mtx); std::cout << "update ledger xml hold lock !!!!!!!!!!!" << std::endl;
2025-01-16 16:17:01 +08:00
int dev_index = find_dev_index_from_dev_id(devid);
int mp_index = find_mp_index_from_mp_id(line);
2025-02-24 16:45:42 +08:00
pthread_mutex_unlock(&mtx); std::cout << "update ledger xml free lock !!!!!!!!!!!" << std::endl;
2025-01-16 16:17:01 +08:00
if(dev_index == 0 || mp_index == 0){
std::cerr << "dev index or mp index is 0" << std::endl;
return E_RECONSUME_LATER;
}
// <20><><EFBFBD><EFBFBD> XML <20>ļ<EFBFBD>
if (!createXmlFile(dev_index, mp_index, realData, soeData, limit,"new")) {
std::cerr << "Failed to create the XML file." << std::endl;
return E_RECONSUME_LATER;
}
}
// <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
return E_CONSUME_SUCCESS;
}
int myMessageCallbackupdate(CPushConsumer* consumer, CMessageExt* msg)
{
if (msg == NULL) {
std::cerr << "Received null message." << std::endl;
return E_RECONSUME_LATER;
}
const char* body = GetMessageBody(msg);
const char* key = GetMessageKeys(msg);
if (body == NULL) {
std::cerr << "Message body is NULL." << std::endl;
return E_RECONSUME_LATER;
}
else{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A3AC>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2><EFBFBD>ݣ<EFBFBD>
std::cout << "ledger update Callback received message: " << body << std::endl;
if (key) {
std::cout << "Message Key: " << key << std::endl;
}
else {
std::cout << "Message Key: N/A" << std::endl;
}
//<2F><><EFBFBD><EFBFBD>̨<EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD>Ϣ
std::string updatefilepath = "/home/pq/FeProject/etc/ledgerupdate";
parse_control(body,updatefilepath);
}
// <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
return E_CONSUME_SUCCESS;
}
int myMessageCallbackset(CPushConsumer* consumer, CMessageExt* msg)
{
if (msg == NULL) {
std::cerr << "Received null message." << std::endl;
return E_RECONSUME_LATER;
}
const char* body = GetMessageBody(msg);
const char* key = GetMessageKeys(msg);
if (body == NULL) {
std::cerr << "Message body is NULL." << std::endl;
return E_RECONSUME_LATER;
}
else{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A3AC>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2><EFBFBD>ݣ<EFBFBD>
std::cout << "process Callback received message: " << body << std::endl;
if (key) {
std::cout << "Message Key: " << key << std::endl;
}
else {
std::cout << "Message Key: N/A" << std::endl;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD>Ϣ
parse_set(body);
}
// <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
return E_CONSUME_SUCCESS;
}
2025-02-25 16:33:11 +08:00
int myMessageCallbacklog(CPushConsumer* consumer, CMessageExt* msg)
{
if (msg == NULL) {
std::cerr << "Received null message." << std::endl;
return E_RECONSUME_LATER;
}
const char* body = GetMessageBody(msg);
const char* key = GetMessageKeys(msg);
if (body == NULL) {
std::cerr << "Message body is NULL." << std::endl;
return E_RECONSUME_LATER;
}
else{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A3AC>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2><EFBFBD>ݣ<EFBFBD>
std::cout << "process Callback received message: " << body << std::endl;
if (key) {
std::cout << "Message Key: " << key << std::endl;
}
else {
std::cout << "Message Key: N/A" << std::endl;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD>Ϣ
parse_log(body);
}
// <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
return E_CONSUME_SUCCESS;
}
2025-01-16 16:17:01 +08:00
int myMessageCallbackrecall(CPushConsumer* consumer, CMessageExt* msg)
{
//<2F><><EFBFBD><EFBFBD>
std::cout << "myMessageCallbackrecall"<< std::endl;
if (msg == NULL) {
std::cerr << "Received null message." << std::endl;
return E_RECONSUME_LATER;
}
const char* body = GetMessageBody(msg);
const char* key = GetMessageKeys(msg);
if (body == NULL) {
std::cerr << "Message body is NULL." << std::endl;
return E_RECONSUME_LATER;
}
else{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A3AC>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2><EFBFBD>ݣ<EFBFBD>
std::cout << "recall Callback received message: " << body << std::endl;
if (key) {
std::cout << "Message Key: " << key << std::endl;
}
else {
std::cout << "Message Key: N/A" << std::endl;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string result = extractDataJson(body); // ʹ<><CAB9> std::string <20><><EFBFBD><EFBFBD> malloc
//<2F><><EFBFBD><EFBFBD>
std::cout << "extractDataJson:"<< result.c_str() <<std::endl;
if (!result.empty()) {
2025-02-24 16:45:42 +08:00
pthread_mutex_lock(&mtx); std::cout << "recall mq hold lock !!!!!!!!!!!" << std::endl;
2025-01-16 16:17:01 +08:00
recall_json_handle(result.c_str()); // ʹ<><CAB9> c_str() <20><>ȡ const char* <20><><EFBFBD><EFBFBD>
2025-02-24 16:45:42 +08:00
pthread_mutex_unlock(&mtx); std::cout << "recall mq free lock !!!!!!!!!!!" << std::endl;
2025-01-16 16:17:01 +08:00
}
else{
std::cerr << "recall data is NULL." << std::endl;
}
}
// <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
return E_CONSUME_SUCCESS;
}
2025-02-25 16:33:11 +08:00
2025-01-16 16:17:01 +08:00
void mqconsumerThread::run()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD>
std::string consumerName = std::string(subdir) + intToString(g_front_seg_index); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
std::string nameServer = G_MQCONSUMER_IPPORT; // NameServer<65><72>ַ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A1A2>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
std::vector<Subscription> subscriptions;
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 //lnk20241230ֻ<30><D6BB>ʵʱ<CAB5><CAB1><EFBFBD>̻ᶩ<CCBB><E1B6A9>ʵʱtopic<69><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱtopic<69>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
if(g_node_id == THREE_SECS_DATA_BASE_NODE_ID){
subscriptions.push_back(Subscription(G_MQCONSUMER_TOPIC_RT, G_MQCONSUMER_TAG_RT, myMessageCallbackrtdata));
}
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 //<2F><><EFBFBD>н<EFBFBD><D0BD>̶<EFBFBD><CCB6><EFBFBD><E1B6A9>̨<EFBFBD>˸<EFBFBD><CBB8><EFBFBD>topic<69><63><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ܽ<EFBFBD><DCBD>̵<EFBFBD>̨<EFBFBD>˲<EFBFBD><CBB2>ܻ<EFBFBD><DCBB><EFBFBD>Ӱ<EFBFBD><D3B0>
subscriptions.push_back(Subscription(G_MQCONSUMER_TOPIC_UD, G_MQCONSUMER_TAG_UD, myMessageCallbackupdate));
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3 //lnk20241230ֻ<30>в<EFBFBD><D0B2>н<EFBFBD><D0BD>̻ᶩ<CCBB>IJ<EFBFBD><C4B2><EFBFBD>topic<69><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>topic<69>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(g_node_id == RECALL_HIS_DATA_BASE_NODE_ID){
subscriptions.push_back(Subscription(G_MQCONSUMER_TOPIC_RC, G_MQCONSUMER_TAG_RC, myMessageCallbackrecall));
}
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4 //lnk20250108ֻ<38><D6BB><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>topic<69><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>topic<69>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(g_node_id == STAT_DATA_BASE_NODE_ID && g_front_seg_index == 1){
subscriptions.push_back(Subscription(G_MQCONSUMER_TOPIC_SET, G_MQCONSUMER_TAG_SET, myMessageCallbackset));
}
2025-02-25 16:33:11 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5 //<2F><><EFBFBD>н<EFBFBD><D0BD>̶<EFBFBD><CCB6><EFBFBD><E1B6A9><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>topic<69><63><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ܽ<EFBFBD><DCBD>̵<EFBFBD><CCB5><EFBFBD>־<EFBFBD><D6BE><EFBFBD>Ͳ<EFBFBD><CDB2>ܻ<EFBFBD><DCBB><EFBFBD>Ӱ<EFBFBD><D3B0>
subscriptions.push_back(Subscription(G_MQCONSUMER_TOPIC_LOG, G_MQCONSUMER_TAG_LOG, myMessageCallbacklog));
2025-01-16 16:17:01 +08:00
try {
rocketmq_consumer_receive(consumerName, nameServer, subscriptions);
}
catch (const std::exception& e) {
std::cerr << "Exception during consumerUD setup: " << e.what() << std::endl;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::cout << "Consumer is running. " << std::endl;
//<2F><><EFBFBD><EFBFBD><EFBFBD>̵߳<DFB3><CCB5><EFBFBD>
//ShutdownAndDestroyConsumer();
}
//CZY 2023-08-23 get double class voltage level, if false will return 0;
double get_voltage_level(char voltage_level_char[]) {
try
{
int n = atoi(voltage_level_char);
switch (n)
{
case 1://<2F><><EFBFBD><EFBFBD>6V
return 0.006;
case 2://<2F><><EFBFBD><EFBFBD>12V
return 0.012;
case 3://<2F><><EFBFBD><EFBFBD>24V
return 0.024;
case 4://<2F><><EFBFBD><EFBFBD>36V
return 0.036;
case 5://<2F><><EFBFBD><EFBFBD>48V
return 0.048;
case 6://<2F><><EFBFBD><EFBFBD>110V
return 0.11;
case 7://<2F><><EFBFBD><EFBFBD>220V
return 0.22;
case 8://<2F><><EFBFBD><EFBFBD>380V<30><56><EFBFBD><EFBFBD>400V<30><56>
return 0.38;
case 9://<2F><><EFBFBD><EFBFBD>660V
return 0.66;
case 10://<2F><><EFBFBD><EFBFBD>1000V<30><56><EFBFBD><EFBFBD>1140V<30><56>
return 1;
case 11://<2F><><EFBFBD><EFBFBD>600V
return 0.6;
case 12://<2F><><EFBFBD><EFBFBD>750V
return 0.75;
case 13://<2F><><EFBFBD><EFBFBD>1500V
return 1.5;
case 14://<2F><><EFBFBD><EFBFBD>2000V
return 2.0;
case 15://<2F><><EFBFBD><EFBFBD>2500V
return 2.5;
case 20://<2F><><EFBFBD><EFBFBD>3kV
return 3;
case 21://<2F><><EFBFBD><EFBFBD>6kV
return 6;
case 22://<2F><><EFBFBD><EFBFBD>10kV
return 10;
case 23://<2F><><EFBFBD><EFBFBD>15.75kV
return 15.75;
case 24://<2F><><EFBFBD><EFBFBD>20kV
return 20;
case 25://<2F><><EFBFBD><EFBFBD>35kV
return 35;
case 30://<2F><><EFBFBD><EFBFBD>66kV
return 66;
case 31://<2F><><EFBFBD><EFBFBD>72.5kV
return 72.5;
case 32://<2F><><EFBFBD><EFBFBD>110kV
return 110;
case 33://<2F><><EFBFBD><EFBFBD>220kV
return 220;
case 34://<2F><><EFBFBD><EFBFBD>330kV
return 330;
case 35://<2F><><EFBFBD><EFBFBD>500kV
return 500;
case 36://<2F><><EFBFBD><EFBFBD>750kV
return 750;
case 37://<2F><><EFBFBD><EFBFBD>1000kV
return 1000;
case 51://ֱ<><D6B1>6V
return 0.006;
case 52://ֱ<><D6B1>12V
return 0.012;
case 53://ֱ<><D6B1>24V
return 0.024;
case 54://ֱ<><D6B1>36V
return 0.036;
case 55://ֱ<><D6B1>48V
return 0.048;
case 56://ֱ<><D6B1>110V
return 0.11;
case 60://ֱ<><D6B1>220V
return 0.22;
case 70://ֱ<><D6B1>600V
return 0.6;
case 71://ֱ<><D6B1>750V
return 0.75;
case 72://ֱ<><D6B1>1500V
return 1.5;
case 73://ֱ<><D6B1>3000V
return 3.0;
case 76://ֱ<><D6B1>35kV
return 35;
case 77://ֱ<><D6B1>30kV
return 30;
case 78://ֱ<><D6B1>50kV
return 50;
case 80://ֱ<><D6B1>120kV
return 120;
case 81://ֱ<><D6B1>125kV
return 125;
case 82://ֱ<><D6B1>400kV
return 400;
case 83://ֱ<><D6B1>500kV
return 500;
case 84://ֱ<><D6B1>660kV
return 660;
case 85://ֱ<><D6B1>800kV
return 800;
case 86://ֱ<><D6B1>1000kV
return 1000;
case 87://ֱ<><D6B1>200kV
return 200;
case 88://ֱ<><D6B1>320kV<6B><56>
return 320;
default:
return 0;
break;
}
}
catch (const std::exception&)
{
//error
return 0;
}
}
void try_start_kafka_thread()
{
static int kafka_thread_created = 0;
if (!kafka_thread_created) {
myThrd.start();
kafka_thread_created = 1;
}
}
//lnk20241213
void try_start_mqconsumer_thread()
{
static int mqconsumer_thread_created = 0;
if (!mqconsumer_thread_created) {
mqconsumerThrd.start();
mqconsumer_thread_created = 1;
}
}
/////////////////////////////////////////////////////////////////////////
json_block_data json_blkd;
//void init_json_block_data()
//{
// json_blkd.monitorId = -1;
// json_blkd.func_type = g_node_id;
// //flag <20><>Ʒ<EFBFBD>ʣ<EFBFBD> <20><EFBFBD><ECB3A3>1<EFBFBD><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
// json_blkd.flag = 0; // //<2F>޳<EFBFBD><DEB3><EFBFBD><EFBFBD>ǣ<EFBFBD>1<EFBFBD><31><EFBFBD>޳<EFBFBD><DEB3><EFBFBD>0<EFBFBD>޳<EFBFBD><DEB3><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD>޳<EFBFBD>
// json_blkd.mms_str_map.clear();
//}
//CZY 2023-08-17 WW 2022<32><32>12<31><32>6<EFBFBD><36>14:09:08 <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>ICD֧<44><D6A7>
//json_block_data json_blkd; //jsonƴ<6E>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>е<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>ICD<43>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>LDInfo<66><EFBFBD>д洢<D0B4><E6B4A2><EFBFBD><EFBFBD>֤һ<D6A4><D2BB><EFBFBD><EFBFBD>·һ<C2B7><D2BB>jsonƴ<6E>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void init_json_block_data(char mp_id[], char voltage_level[], int flicker_flag)//WW 2023<32><33>3<EFBFBD><33>13<31><33>16:38:41 <20><>ICD<43>޸<EFBFBD>
{
// <20><> char[] ת<><D7AA>Ϊ std::string
//QString keyString(mp_id);
json_block_data* pdata;
if (flicker_flag == 1) {
if (!json_flicker_data_map.contains(mp_id))
{
pdata = new json_block_data();
json_flicker_data_map.insert(mp_id, pdata);
}
pdata = json_flicker_data_map.value(mp_id);
}
else if (flicker_flag == 0) {
if (!json_data_map.contains(mp_id))
{
pdata = new json_block_data();
json_data_map.insert(mp_id, pdata);
}
pdata = json_data_map.value(mp_id);
}
else if (flicker_flag == 2) {
if (!json_pst_data_map.contains(mp_id))
{
pdata = new json_block_data();
json_pst_data_map.insert(mp_id, pdata);
}
pdata = json_pst_data_map.value(mp_id);
}
if (pdata == NULL)
return;
pdata->monitorId = -1;
QString tmp;
tmp.append(mp_id);
pdata->mp_id = tmp;
pdata->func_type = g_node_id;
//flag <20><>Ʒ<EFBFBD>ʣ<EFBFBD> <20><EFBFBD><ECB3A3>1<EFBFBD><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
pdata->flag = 0; // //<2F>޳<EFBFBD><DEB3><EFBFBD><EFBFBD>ǣ<EFBFBD>1<EFBFBD><31><EFBFBD>޳<EFBFBD><DEB3><EFBFBD>0<EFBFBD>޳<EFBFBD><DEB3><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD>޳<EFBFBD>
pdata->mms_str_map.clear();
pdata->voltage_level = get_voltage_level(voltage_level); //CZY 2023-08-23 add voltage_level
}
//0. json<6F><6E><EFBFBD>ɿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
//int json_block_create_start(int MonitorId )
//{
// try_start_kafka_thread();
//
// init_json_block_data();
// json_blkd.monitorId = MonitorId;
// printf("\n\n---------- json_block_create_start: MonitorId=%d \n",MonitorId);
// return TRUE;
//}
int json_block_create_start(char voltage_level[], char monid_char[], int flicker_flag, char temcode[], int line_id)//WW 2023<32><33>3<EFBFBD><33>13<31><33>16:38 : 41 <20><>ICD<43>޸<EFBFBD>
{
try_start_kafka_thread();
//WW 2023-08-22 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>߳<EFBFBD>
//try_start_sql_thread();//lnk2024118<31><38><EFBFBD><EFBFBD>Ҫsql<71>߳<EFBFBD>
//WW end
init_json_block_data(monid_char, voltage_level, flicker_flag);
json_block_data* pdata;
if (flicker_flag == 1) {
if (!json_flicker_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_flicker_data_map.value(monid_char);
}
else if (flicker_flag == 0)
{
if (!json_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_data_map.value(monid_char);
}
else if (flicker_flag == 2)
{
if (!json_pst_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_pst_data_map.value(monid_char);
}
if (pdata != NULL)
{
pdata->dev_type.append(temcode);
pdata->monitorId = line_id;
if (strlen(monid_char) != 0) {
QString tmp;
tmp.append(monid_char);
pdata->mp_id = tmp;
}
else {
monid_char = "not define";
QString tmp;
tmp.append(monid_char);
pdata->mp_id = tmp;
}
}
printf("\n\n---------- json_block_create_start: mp_id=%s,voltage_level=%s,line_id=%d \n", monid_char, voltage_level, line_id);
return TRUE;
}
//1. json<6F><6E><EFBFBD>ɿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
//int json_block_create_time(int MonitorId , long long Time)
//{
// json_blkd.time = Time;
// printf("\njson_block_create_time: MonitorId=%d,Time=%lld \n",MonitorId,Time);
// return TRUE;
//}
int json_block_create_time(char monid_char[], long long Time, int flicker_flag)//WW 2023<32><33>3<EFBFBD><33>13<31><33>16:38:41 <20><>ICD<43>޸<EFBFBD>
{
json_block_data* pdata;
if (flicker_flag == 1) {
if (!json_flicker_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_flicker_data_map.value(monid_char);
}
else if (flicker_flag == 0)
{
if (!json_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_data_map.value(monid_char);
}
else if (flicker_flag == 2)
{
if (!json_pst_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_pst_data_map.value(monid_char);
}
if (pdata != NULL)
pdata->time = Time;
printf("\njson_block_create_time: mp_id=%s,Time=%lld \n", monid_char, Time);
return TRUE;
}
//int json_block_create_flag(int MonitorId , int flag)
//{
// json_blkd.flag = flag;
// printf("\njson_block_create_flag: MonitorId=%d,flag=%d \n",MonitorId,flag);
// return TRUE;
//}
int json_block_create_flag(char monid_char[], int flag, int flicker_flag)//WW 2023<32><33>3<EFBFBD><33>13<31><33>16:38:41 <20><>ICD<43>޸<EFBFBD>
{
json_block_data* pdata;
if (flicker_flag == 1) {
if (!json_flicker_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_flicker_data_map.value(monid_char);
}
else if (flicker_flag == 0)
{
if (!json_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_data_map.value(monid_char);
}
else if (flicker_flag == 2)
{
if (!json_pst_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_pst_data_map.value(monid_char);
}
if (pdata != NULL)
pdata->flag = flag;
printf("\njson_block_create_flag: mp_id=%s,flag=%d \n", monid_char, flag);
return TRUE;
}
//2. json<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻص<DDBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
//int json_block_create_data(int MonitorId , char* mms_str , double v )
//{
// static int count = 0;
// //WW2023-08-16 ȥ<><C8A5>logע<67><D7A2>
// //printf("#");
// //if ( ((count++ %1000)==0) || (count <2000) )
// // printf("\n%d:json_block_create_data: MonitorId=%d,mms_str=%s,v=%f \n",count,MonitorId,mms_str,v);
//
// json_blkd.mms_str_map.insert(QString::fromAscii(mms_str), v);
// return TRUE;
//}
int json_block_create_data(char monid_char[], char* mms_str, double v, int flicker_flag)//WW 2023<32><33>3<EFBFBD><33>13<31><33>16:38:41 <20><>ICD<43>޸<EFBFBD>
{
json_block_data* pdata;
if (flicker_flag == 1) {
if (!json_flicker_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_flicker_data_map.value(monid_char);
}
else if (flicker_flag == 0)
{
if (!json_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_data_map.value(monid_char);
}
else if (flicker_flag == 2)
{
if (!json_pst_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
return 0;
pdata = json_pst_data_map.value(monid_char);
}
static int count = 0;
if (pdata != NULL)
{
pdata->mms_str_map.insert(QString::fromAscii(mms_str), v);
if (strstr(mms_str, "MMXU2$MX$PhV"))
printf("---------- json_block_create_data: mp_id= %s ,mms_str=%s value=%fkV----------\n", monid_char, mms_str, v);
}
return TRUE;
}
//3. json<6F><6E><EFBFBD>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int json_block_create_end(int MonitorId )
//{
// printf("\n---------- json_block_create_end: MonitorId=%d \n\n\n",MonitorId);
//
// return transfer_json_block_data(&json_blkd);
//}
2025-02-14 16:44:38 +08:00
//lnk2024-8-16<31><36><EFBFBD>ӽ<EFBFBD><D3BD>߲<EFBFBD><DFB2><EFBFBD>
int json_block_create_end(char v_wiring_type[], char monid_char[], int flicker_flag)//WW 2023<32><33>3<EFBFBD><33>13<31><33>16:38:41 <20><>ICD<43>޸<EFBFBD>
2025-01-16 16:17:01 +08:00
{
json_block_data* pdata;
if (flicker_flag == 1) {
if (!json_flicker_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
{
printf("---------- json_block_create_end: mp_id= %s json_flicker_data_map can't find MonitorId----------\n", monid_char);
return 1;
}
pdata = json_flicker_data_map.value(monid_char);
}
else if (flicker_flag == 0)
{
if (!json_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
{
printf("---------- json_block_create_end: mp_id= %s json_data_map can't find MonitorId----------\n", monid_char);
return 1;
}
pdata = json_data_map.value(monid_char);
}
else if (flicker_flag == 2)
{
if (!json_pst_data_map.contains(monid_char))//δ<><EFBFBD><E9B5BD><EFBFBD><EFBFBD>
{
printf("---------- json_block_create_end: mp_id= %s json_pst_data_map can't find MonitorId----------\n", monid_char);
return 1;
}
pdata = json_pst_data_map.value(monid_char);
}
//int ret = transfer_json_block_data(pdata, DevKind);//CZY 2023-08-17 <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
if (pdata->mms_str_map.count() == 0) {
if (flicker_flag == 1) {
json_flicker_data_map.remove(monid_char);
}
else if (flicker_flag == 0)
{
json_data_map.remove(monid_char);
}
else if (flicker_flag == 2)
{
json_pst_data_map.remove(monid_char);
}
printf("---------- json_block_create_end: pdata->mms_str_map.count() == 0 ----------\n");
return 1;
}
2025-02-14 16:44:38 +08:00
//lnk2024-8-16<31><36><EFBFBD>ӽ<EFBFBD><D3BD>߲<EFBFBD><DFB2><EFBFBD>
int ret = transfer_json_block_data(v_wiring_type, pdata);
2025-01-16 16:17:01 +08:00
if (pdata != NULL)
delete pdata;
if (flicker_flag == 1) {
json_flicker_data_map.remove(monid_char);
}
else if (flicker_flag == 0)
{
json_data_map.remove(monid_char);
}
else if (flicker_flag == 2)
{
json_pst_data_map.remove(monid_char);
}
printf("---------- json_block_create_end: MonitorId= %s ----------\n", monid_char);
return ret;
}
//#define STATUS_NORMAL 0 /**< <20><><EFBFBD><EFBFBD> */
//ƴ<><C6B4>Kafka Producer<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD>
//{"DATA_TYPE":"03", "TIME":"1542960911734", "1268918860":["CommResume"]}
void prcess_monitor_comm_2_json(int monitor_id, int status, long long tm)
{
Ckafka_data_t data;
QString status_str = (status == 0) ? "CommResume" : "CommInterrupt";
try_start_kafka_thread();
data.monitor_id = monitor_id;
data.strTopic = "RTDATASOE";
data.strText = QString("{\"DATA_TYPE\":\"03\", \"TIME\":\"%1\", \"%2\":[\"%3\"]}")
.arg(tm).arg(monitor_id).arg(status_str);
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD> //װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1268918860
QString str = data.strTopic + " " + data.strText;
printf("prcess_monitor_comm_2_json: %s \n", str.toStdString().c_str());
kafka_data_list_mutex.lock();
kafka_data_list.append(data);
kafka_data_list_mutex.unlock();
}
//////////////////////////////////////////////////////////////////////////////
//int transfer_json_block_data(json_block_data *data)
//{
// Ckafka_data_t kafka_data;
// kafka_data.patition_id = 0;
// kafka_data.strText = QString("Time=%1").arg(data->time);
//
// kafka_data_list_mutex.lock();
// kafka_data_list.append(kafka_data);
// kafka_data_list_mutex.unlock();
// return TRUE;
//}
void clear_old_comtrade_files()
{
if (g_node_id != SOE_COMTRADE_BASE_NODE_ID)
return;
QString full_fn_str;
QString dir_name("../comtrade/");
QDir directory_comtrade(dir_name);
QStringList fileNames = directory_comtrade.entryList(QDir::Files | QDir::NoDotAndDotDot, QDir::Time);
if (fileNames.size() <= comtrade_remain_file_num)
return;
for (QStringList::size_type i = comtrade_remain_file_num; i != fileNames.size(); ++i) {
full_fn_str = dir_name + fileNames.at(i);
QFile::remove(full_fn_str);
}
}
/////////////////////////////////////////////
//using namespace std;
int process_login_verify()
{
int length = 64;
char password[64 + 1];
char* p = NULL;
int count = 0;
char encode_password[256];
//password = "njcnpqs@2018"
const char* passwordConfirm = "1c0e4e104de596846648ba495bd32601";
memset(password, 0, sizeof(password));
printf("Please input password : \n");
p = password;
count = 0;
system("stty -echo");
std::cin.getline(password, 64);
system("stty echo");
//while (((*p = getch()) != 13) && count < length) {
// //putch('*');
// //fflush(stdin);
// p++;
// count++;
//}
password[length] = '\0';
//printf("input typed password : %s \n",password);
MyGetSM4Code(password, (unsigned char*)"epri.sgcc.com.cn", encode_password);
//printf("encode_password : %s ,should be %s \n",encode_password,passwordConfirm);
return (strcmp(encode_password, passwordConfirm));
}
////////////////////////////////////////////
///////////////////////////////////////////
//WW 2023-08-22 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>̺߳<DFB3>WebSokcet<65>߳<EFBFBD>
void SQLExcuteThread::run()
{
//if (THREE_SECS_DATA_BASE_NODE_ID == g_node_id)//3<><33><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><E4B2BB>Ҫд<D2AA><D0B4>
//return;
if (1 != g_iOTLFlag) {
Sql_data_list.clear();
return;
}
static uint32_t connect_state = 0;
static uint32_t sql_count = 0;//2024-04-01
const char* pSql = nullptr;
printf("SqlExcuteThread::run() is called ...... \n\n");
while (1)
{
msleep(1);
if (!Sql_data_list.isEmpty())
{
if (0 == sql_count++ % 300)
{
//db.connected
int rtState = OTLDbconnected();
//int rtState = db.connected;
if (rtState == 0 || connect_state != 0) {
OTLDisconnect();
int ret = OTLConnect();
if (ret != 0 && ret != 32031) {
bool bExit = false;
for (int i = 0; i < 3; i++) {
OTLDisconnect();
ret = OTLConnect();
if (ret != 0 && ret != 32031) {
if (2 == i)
bExit = true;
else
printf(">>>Postgresql reconnect %d times,errorcode= %d \n", i + 1, ret);
}
}
if (bExit) {
printf(">>>Postgresql reconnect 3 times,errorcode= %d,end thread!\n", ret);
sleep(30);
continue;
//return;
}
}
}
}
// printf("(д<><D0B4>)Sqlִ<6C><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sql_data_list<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>= %d<><64>ʵ<EFBFBD><CAB5>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>= %d \n", g_iSqlListSize, Sql_data_list.size());
Sql_data_list_mutex.lock();
std::string strSql = Sql_data_list.takeFirst().toStdString();
printf("get one sql \n");
if (strSql.length() < 11)
{
// printf("(д<><D0B4>)Sqlִ<6C><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sql_data_listʣ<74><CAA3>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>= %d<><64><EFBFBD><EFBFBD>ǰִ<C7B0><D6B4>Sql= %s<><73>continue<75><65>һ<EFBFBD><D2BB><EFBFBD>䣡\n", Sql_data_list.count(), strSql.c_str());
continue;
}
pSql = strSql.c_str();
Sql_data_list_mutex.unlock();
//printf("BEGIN my_sql_excute no.%i -------->>>>>>>> %s \n", count, QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toAscii().data());
/*if (2 == Log_Enable)
printf("<><D0B4>)Sqlִ<6C><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sql_data_listʣ<74><CAA3>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>= %i<><69><EFBFBD><EFBFBD>ǰִ<C7B0><D6B4>Sql.%i= %s \n", Sql_data_list.count(), count, pSql);*/
printf("write one sql %s \n", pSql);
int rt = write_to_db(pSql);
connect_state = rt;
printf("connect state %d \n", connect_state);
//if (0 == rt)
//{
// if (1 == Log_Enable)
// printf("(д<><D0B4>)Sqlִ<6C>гɹ<D0B3>.%i \n", count);
// else
// printf("(д<><D0B4>)Sqlִ<6C>гɹ<D0B3>.%i<><69>Sql= %s \n", count, pSql);
//}
//printf("END my_sql_excute no.%i -------->>>>>>>> %s \n\n", count++, QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toAscii().data());
}
}
printf(">>>SqlExcuteThread::run() is end!!!\n");
}
void try_start_sql_thread()
{
static int sql_thread_created = 0;
if (!sql_thread_created) {
//if (2 == Log_Enable)
// printf(">>><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sqlִ<6C><D6B4><EFBFBD>̣߳<DFB3>\n");
sqlThrd.start();
sql_thread_created = 1;
}
}
void try_start_socket_thread()
{
static int socket_thread_created = 0;
if (!socket_thread_created) {
//if (2 == Log_Enable)
// printf(">>><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Web Socket<65>̣߳<DFB3>\n");
socketThrd.start();
socket_thread_created = 1;
}
}
//lnk20241029
void try_start_web_http_thread()
{
static int webhttp_thread_created = 0;
if (!webhttp_thread_created) {
webhttpThrd.start();
webhttp_thread_created = 1;
}
}
void try_start_http_thread()
{
static int http_thread_created = 0;
if (!http_thread_created) {
httpThrd.start();
http_thread_created = 1;
}
}
//lnk20241202
int try_start_mqtest_thread(int argc, char *argv[])
{
//<2F><>ʹ<EFBFBD>ü򵥵<C3BC>ѭ<EFBFBD><D1AD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>app<70><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>ѭ<EFBFBD><D1AD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD>ҿ<EFBFBD><D2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*static int mqtest_thread_created = 0;
if (!mqtest_thread_created) {
mqtestThrd.start();
mqtest_thread_created = 1;
}*/
QCoreApplication a(argc, argv);
// <20><><EFBFBD><EFBFBD> QThread <20><> Worker <20><><EFBFBD><EFBFBD>
QThread *thread = new QThread();
Worker *worker = new Worker();
// <20><> Worker <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD> QThread <20><>
worker->moveToThread(thread);
// <20><><EFBFBD><EFBFBD><EFBFBD>źźͲ<C5BA>
QObject::connect(thread, SIGNAL(started()), worker, SLOT(startServer()));
QObject::connect(worker, SIGNAL(serverError()), thread, SLOT(quit()));
QObject::connect(worker, SIGNAL(serverError()), worker, SLOT(deleteLater()));
QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
// <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
thread->start();
//std::cout << "start_mqtest"<<std::endl;
// ȷ<><C8B7><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>˳<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>߳<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ȷ<EFBFBD>˳<EFBFBD>
QObject::connect(&a, SIGNAL(aboutToQuit()), thread, SLOT(quit()));
return a.exec();
}
void try_start_ontimer_thread()
{
static int ontimer_thread_created = 0;
if (!ontimer_thread_created) {
//if (2 == Log_Enable)
// printf(">>><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Web Socket<65>̣߳<DFB3>\n");
onTimerThrd.start();
ontimer_thread_created = 1;
}
}
//WW 2023-08-22 end
///////////////////////////////////////////
//ZW 2024-01-31 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>Ż<EFBFBD>
static QMap<QString, int> mvl_type_ctrl_map;//ZW 2024-01-31 <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>λ<EFBFBD>ȡ<EFBFBD><C8A1>ģ<EFBFBD><C4A3>
static int mvl_type_ctrl_map_size;//<2F><><EFBFBD><EFBFBD>
//static std::map<int, int> myMap;
//<2F><><EFBFBD><EFBFBD>doname<6D><65>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
void add_mvl_type_ctrl(char doname[], int ctrl)
{
//printf("\nadd_mvl_type_ctrl: %s\n", doname);
//printf("\nadd_mvl_type_ctrl: %p////%p\n", &ctrl,&copy);
if (!mvl_type_ctrl_map.contains(doname))
{
//MVL_TYPE_CTRL* copy = ctrl;
mvl_type_ctrl_map.insert(doname, ctrl);
}
//printf("\nadd_mvl_type_ctrl: %p\n", &doname);
}
//ɾ<><C9BE>map<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
void del_mvl_type_ctrl()
{
for (QMap<QString, int>::iterator it = mvl_type_ctrl_map.begin(); it != mvl_type_ctrl_map.end(); ++it) {
QString key = it.key();
int value = it.value();
mvl_type_id_destroy(value);
}
mvl_type_ctrl_map.clear();
}
int get_mvl_type_ctrl_map_size()
{
return mvl_type_ctrl_map.count();
}
//<2F><><EFBFBD>Ҷ<EFBFBD>Ӧdoname<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>map<61><70>
int sel_mvl_type_ctrl_flag(char doname[])
{
if (mvl_type_ctrl_map.contains(doname))
{
return mvl_type_ctrl_map.value(doname);
}
else
{
return -1;
}
}
//ZW 2024-01-31 end