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"
# 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 ) ;
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
2025-03-04 17:29:04 +08:00
extern int INITFLAG ;
2025-01-16 16:17:01 +08:00
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>
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
mqconsumerThread mqconsumerThrd ; //mq<6D> <71> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ߳<EFBFBD> lnk20241213
OnTimerThread onTimerThrd ; //<2F> <> ʱ<EFBFBD> ߳<EFBFBD>
2025-04-30 10:22:57 +08:00
2025-01-16 16:17:01 +08:00
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
2025-02-28 16:28:15 +08:00
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 ;
}
//////////////////////////////////////////////////////////////////////////
/*<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 ;
2025-02-13 11:51:05 +08:00
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 ;
2025-02-13 11:51:05 +08:00
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 ( ) ) ) ;
}
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 ;
2025-02-13 11:51:05 +08:00
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 ;
cout < < cfg_His_tp < < endl ;
2025-04-29 15:05:36 +08:00
std : : string brokerlist = BROKER_LIST ;
2025-01-16 16:17:01 +08:00
# 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
2025-02-13 11:51:05 +08:00
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 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 ( ) ;
}
if ( g_onlyIP [ 0 ] ! = 0 )
{
add_sng_log ( data . strText . toAscii ( ) . data ( ) ) ;
}
# ifdef __GNUC__
retsize = kafkaProducer . send ( senddata . c_str ( ) , senddata . length ( ) , topic , RdKafka : : Topic : : PARTITION_UA , & key ) ;
# endif
if ( retsize > 0 ) {
printf ( " \n kafka send, monitor_id:[%s] topic:[%s] Success,return length %d \n " , key . c_str ( ) , topic . c_str ( ) , retsize ) ;
}
else
printf ( " \n Failed kafka send, monitor_id:[%s] topic:[%s] \n " , key . c_str ( ) , topic . c_str ( ) ) ;
}
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 ;
2025-02-13 11:51:05 +08:00
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 ;
2025-02-13 11:51:05 +08:00
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 ( " \n datahub 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 ( " \n KafkaSendThread::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 ) ;
}
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 ;
2025-02-28 16:28:15 +08:00
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 ;
2025-03-05 17:47:47 +08:00
log_send . strText = QString : : fromStdString ( debugList . front ( ) ) ; //<2F> <> ȷ<EFBFBD> <C8B7> list<73> <74> ȷ
2025-02-28 16:28:15 +08:00
// <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>
}
}
2025-03-03 18:20:00 +08:00
pthread_mutex_unlock ( & debugListMutex ) ;
2025-02-26 16:39:10 +08:00
}
2025-02-28 16:28:15 +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 ( ) ) {
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-28 16:28:15 +08:00
}
2025-02-26 16:39:10 +08:00
if ( log_gotten ) {
static uint32_t count = 0 ;
my_rocketmq_send ( log_send ) ;
}
2025-01-16 16:17:01 +08:00
2025-03-26 10:51:18 +08:00
QThread : : msleep ( 1 ) ; // <20> <> <EFBFBD> <EFBFBD> CPU <20> <> תlnk20250326
2025-04-29 15:05:36 +08:00
}
2025-01-16 16:17:01 +08:00
2025-03-26 10:51:18 +08:00
2025-01-16 16:17:01 +08:00
//<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-03-06 10:32:40 +08:00
snprintf ( command , sizeof ( command ) , " %s %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 ) ;
2025-03-05 17:47:47 +08:00
std : : string fun = cJSON_GetObjectItem ( item , " fun " ) - > valuestring ? cJSON_GetObjectItem ( item , " fun " ) - > valuestring : " NULL " ;
std : : string ip = cJSON_GetObjectItem ( item , " ip " ) - > valuestring ? cJSON_GetObjectItem ( item , " ip " ) - > valuestring : " NULL " ;
std : : string frontType = cJSON_GetObjectItem ( item , " frontType " ) - > valuestring ? cJSON_GetObjectItem ( item , " frontType " ) - > valuestring : " NULL " ;
cJSON * index_item = cJSON_GetObjectItem ( item , " proindex " ) ;
int proindex = 0 ; // Ĭ<> <C4AC> ֵ
if ( index_item ! = NULL & & index_item - > type = = cJSON_Number ) {
proindex = index_item - > valueint ;
}
2025-02-08 17:04:39 +08:00
2025-03-06 10:32:40 +08:00
std : : cout < < " proindex is : " < < proindex < < std : : endl ;
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-03-03 18:20:00 +08:00
redirectErrorOutput ( true ) ;
2025-02-25 16:33:11 +08:00
}
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 ) ;
2025-03-03 18:20:00 +08:00
redirectErrorOutput ( true ) ;
redirectWarnOutput ( true ) ;
2025-02-25 16:33:11 +08:00
}
2025-02-28 16:28:15 +08:00
else if ( level = = " DEBUG " ) {
// <20> <> <EFBFBD> <EFBFBD> debug (ֻ<> 浽 debugList<73> <74> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> ն<EFBFBD> )
redirectDebugOutput ( true ) ;
2025-03-03 18:20:00 +08:00
redirectErrorOutput ( true ) ;
redirectWarnOutput ( true ) ;
redirectNormalOutput ( true ) ;
2025-02-28 16:28:15 +08:00
}
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-03-03 18:20:00 +08:00
redirectDebugOutput ( false ) ;
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 ;
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 )
{
2025-03-04 17:29:04 +08:00
if ( INITFLAG ! = 1 ) return 1 ; //<2F> <> ֹ<EFBFBD> <D6B9> <EFBFBD> <EFBFBD>
2025-01-16 16:17:01 +08:00
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 )
{
2025-03-04 17:29:04 +08:00
if ( INITFLAG ! = 1 ) return 1 ; //<2F> <> ֹ<EFBFBD> <D6B9> <EFBFBD> <EFBFBD>
2025-01-16 16:17:01 +08:00
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>
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 )
{
2025-03-04 17:29:04 +08:00
if ( INITFLAG ! = 1 ) return 1 ; //<2F> <> ֹ<EFBFBD> <D6B9> <EFBFBD> <EFBFBD>
2025-01-16 16:17:01 +08:00
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>
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 )
{
2025-03-04 17:29:04 +08:00
if ( INITFLAG ! = 1 ) return 1 ; //<2F> <> ֹ<EFBFBD> <D6B9> <EFBFBD> <EFBFBD>
2025-02-25 16:33:11 +08:00
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>
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 )
{
2025-03-04 17:29:04 +08:00
if ( INITFLAG ! = 1 ) return 1 ; //<2F> <> ֹ<EFBFBD> <D6B9> <EFBFBD> <EFBFBD>
2025-01-16 16:17:01 +08:00
//<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>
2025-03-26 10:51:18 +08:00
std : : string consumerName = subdir + intToString ( g_front_seg_index ) + " _start_ " + QDateTime : : currentDateTime ( ) . toString ( " yyyyMMddhhmmss " ) . toStdString ( ) ; // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ID+<2B> <> <EFBFBD> <EFBFBD> ʱ<EFBFBD> 䣬<EFBFBD> <E4A3AC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʷ<EFBFBD> <CAB7> Ϣ
2025-01-16 16:17:01 +08:00
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> Ϣ
std : : cout < < " Consumer is running. " < < std : : endl ;
}
//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 ;
//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>
{
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
}
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
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 ( ) ;
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 ;
}
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
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 ( " \n json_block_create_time: mp_id=%s,Time=%lld \n " , monid_char , Time ) ;
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 ( " \n json_block_create_flag: mp_id=%s,flag=%d \n " , monid_char , flag ) ;
return TRUE ;
}
2025-04-29 15:05:36 +08:00
2025-01-16 16:17:01 +08:00
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 ;
}
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 ) ;
}
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 ;
}
//////////////////////////////////////////////////////////////////////////////
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 ) ;
}
}
/////////////////////////////////////////////
int process_login_verify ( )
{
int length = 64 ;
char password [ 64 + 1 ] ;
char * p = NULL ;
int count = 0 ;
char encode_password [ 256 ] ;
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 " ) ;
password [ length ] = ' \0 ' ;
MyGetSM4Code ( password , ( unsigned char * ) " epri.sgcc.com.cn " , encode_password ) ;
return ( strcmp ( encode_password , passwordConfirm ) ) ;
}
///////////////////////////////////////////
void try_start_socket_thread ( )
{
static int socket_thread_created = 0 ;
if ( ! socket_thread_created ) {
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>
2025-03-03 18:20:00 +08:00
//<2F> <> װqt<71> <74> ӡ
qInstallMsgHandler ( myQtMsgHandler ) ;
2025-01-16 16:17:01 +08:00
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 ( ) ;
// ȷ<> <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 ) {
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>
//<2F> <> <EFBFBD> <EFBFBD> doname<6D> <65> Ӧ<EFBFBD> <D3A6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģ<EFBFBD> <C4A3>
void add_mvl_type_ctrl ( char doname [ ] , int ctrl )
{
if ( ! mvl_type_ctrl_map . contains ( doname ) )
{
mvl_type_ctrl_map . insert ( doname , ctrl ) ;
}
}
//ɾ<> <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