Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d3579a2aa7 | |||
| cd92ea09f1 | |||
| 465e304085 | |||
| c388bd04fe | |||
| c6ca57a204 | |||
| 2f584fda30 | |||
| 2f2e0d6430 | |||
| fc861024c3 | |||
| 3c98bf7eae |
@@ -45,11 +45,15 @@
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
static std::once_flag g_consumer_once;
|
||||||
|
static std::once_flag g_producer_once;
|
||||||
|
|
||||||
extern std::string G_ROCKETMQ_PRODUCER;//rocketmq producer
|
extern std::string G_ROCKETMQ_PRODUCER;//rocketmq producer
|
||||||
extern std::string G_ROCKETMQ_IPPORT;//rocketmq ip+port
|
extern std::string G_ROCKETMQ_IPPORT;//rocketmq ip+port
|
||||||
extern std::string G_ROCKETMQ_TOPIC;//topie
|
|
||||||
extern std::string G_ROCKETMQ_TAG;//tag
|
extern std::string G_ROCKETMQ_TOPIC_TEST;//topie
|
||||||
extern std::string G_ROCKETMQ_KEY;//key
|
extern std::string G_ROCKETMQ_TAG_TEST;//tag
|
||||||
|
extern std::string G_ROCKETMQ_KEY_TEST;//key
|
||||||
|
|
||||||
extern std::string G_MQCONSUMER_TOPIC_LOG;
|
extern std::string G_MQCONSUMER_TOPIC_LOG;
|
||||||
extern std::string G_MQCONSUMER_TOPIC_SET;
|
extern std::string G_MQCONSUMER_TOPIC_SET;
|
||||||
@@ -57,6 +61,8 @@ extern std::string G_MQCONSUMER_TOPIC_RC;
|
|||||||
extern std::string G_MQCONSUMER_TOPIC_UD;
|
extern std::string G_MQCONSUMER_TOPIC_UD;
|
||||||
extern std::string G_MQCONSUMER_TOPIC_RT;
|
extern std::string G_MQCONSUMER_TOPIC_RT;
|
||||||
|
|
||||||
|
extern std::string G_MQCONSUMER_TOPIC_TEST;
|
||||||
|
|
||||||
extern std::string FRONT_INST;
|
extern std::string FRONT_INST;
|
||||||
extern bool DEBUGOPEN;
|
extern bool DEBUGOPEN;
|
||||||
|
|
||||||
@@ -110,8 +116,8 @@ public:
|
|||||||
RocketMQConsumer(const std::string& consumerName, const std::string& nameServer);
|
RocketMQConsumer(const std::string& consumerName, const std::string& nameServer);
|
||||||
|
|
||||||
// 禁用拷贝和赋值
|
// 禁用拷贝和赋值
|
||||||
//RocketMQConsumer(const RocketMQConsumer&) {}
|
RocketMQConsumer(const RocketMQConsumer&) = delete;
|
||||||
RocketMQConsumer& operator=(const RocketMQConsumer&) { return *this; }
|
RocketMQConsumer& operator=(const RocketMQConsumer&) = delete;
|
||||||
|
|
||||||
// 订阅主题和标签,并注册回调
|
// 订阅主题和标签,并注册回调
|
||||||
void subscribe(const std::string& topic,
|
void subscribe(const std::string& topic,
|
||||||
@@ -227,24 +233,25 @@ RocketMQConsumer::RocketMQConsumer(const std::string& consumerGroup,
|
|||||||
G_MQCONSUMER_CHANNEL
|
G_MQCONSUMER_CHANNEL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 限制消费线程池,防止 ConsumeTP 爆炸
|
||||||
|
consumer_.setConsumeThreadCount(4);
|
||||||
|
|
||||||
listener_ = new InternalListener(this);
|
listener_ = new InternalListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 启动消费者
|
// 启动消费者
|
||||||
void RocketMQConsumer::start()
|
void RocketMQConsumer::start()
|
||||||
{
|
{
|
||||||
/*if (StartPushConsumer(consumer_) != 0) {
|
static bool started = false;
|
||||||
pthread_mutex_lock(&g_consumerMapMutex);
|
if (started) {
|
||||||
g_consumerMap.erase(consumer_);
|
std::cout << "Consumer already started" << std::endl;
|
||||||
pthread_mutex_unlock(&g_consumerMapMutex);
|
return;
|
||||||
DestroyPushConsumer(consumer_);
|
|
||||||
throw std::runtime_error("Failed to start push consumer.");
|
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
std::cout << "RocketMQ Consumer started." << std::endl;
|
|
||||||
}*/
|
|
||||||
consumer_.registerMessageListener(listener_);
|
consumer_.registerMessageListener(listener_);
|
||||||
consumer_.start();
|
consumer_.start();
|
||||||
|
|
||||||
|
started = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RocketMQConsumer::subscribe(const std::string& topic, const std::string& tag, MessageCallBack callback)
|
void RocketMQConsumer::subscribe(const std::string& topic, const std::string& tag, MessageCallBack callback)
|
||||||
@@ -260,6 +267,23 @@ void RocketMQConsumer::subscribe(const std::string& topic, const std::string& ta
|
|||||||
// 使用 std::pair 作为键
|
// 使用 std::pair 作为键
|
||||||
std::pair<std::string, std::string> mapKey(topic, tag);
|
std::pair<std::string, std::string> mapKey(topic, tag);
|
||||||
callbacks_[mapKey] = callback;
|
callbacks_[mapKey] = callback;
|
||||||
|
|
||||||
|
//冀北添加,其他地方也通用
|
||||||
|
// 如果带 MQ_INST_xxx% 前缀,再注册一个短topic
|
||||||
|
size_t pos = topic.find('%');
|
||||||
|
if (pos != std::string::npos)
|
||||||
|
{
|
||||||
|
std::string shortTopic = topic.substr(pos + 1);
|
||||||
|
|
||||||
|
callbacks_[std::make_pair(shortTopic, tag)] = callback;
|
||||||
|
|
||||||
|
std::cout << "[CALLBACK_ALIAS] "
|
||||||
|
<< topic
|
||||||
|
<< " -> "
|
||||||
|
<< shortTopic
|
||||||
|
<< ", tag=" << tag
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
// 静态消息处理回调实现
|
// 静态消息处理回调实现
|
||||||
@@ -361,6 +385,8 @@ RocketMQConsumer::~RocketMQConsumer()
|
|||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sleep(1); // 等内部线程退出
|
||||||
|
|
||||||
delete listener_;
|
delete listener_;
|
||||||
listener_ = NULL;
|
listener_ = NULL;
|
||||||
|
|
||||||
@@ -434,16 +460,13 @@ void rocketmq_consumer_receive(
|
|||||||
const std::string& nameServer,
|
const std::string& nameServer,
|
||||||
const std::vector<Subscription>& subscriptions) // 接收多个订阅
|
const std::vector<Subscription>& subscriptions) // 接收多个订阅
|
||||||
{
|
{
|
||||||
if (g_consumer == NULL) {
|
std::call_once(g_consumer_once, [&](){
|
||||||
try {
|
try {
|
||||||
//InitializeConsumer(consumerName, nameServer, topic, tag, callback);//初始化后,mq库内部来完成消息的获取
|
InitializeConsumer(consumerName, nameServer, subscriptions);
|
||||||
InitializeConsumer(consumerName, nameServer, subscriptions); // 初始化后,MQ库内部开始获取消息
|
} catch (...) {
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
std::cerr << "Cannot consume message because consumer initialization failed." << std::endl;
|
std::cerr << "Cannot consume message because consumer initialization failed." << std::endl;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -507,6 +530,8 @@ public:
|
|||||||
//SetProducerMaxMessageSize(producer_, 1024 * 1024); // 1MB
|
//SetProducerMaxMessageSize(producer_, 1024 * 1024); // 1MB
|
||||||
producer_.setMaxMessageSize(1024 * 1024);
|
producer_.setMaxMessageSize(1024 * 1024);
|
||||||
|
|
||||||
|
producer_.setSendMsgTimeout(3000);//添加超时防阻塞
|
||||||
|
|
||||||
//SetProducerSessionCredentials(producer_, G_MQCONSUMER_ACCESSKEY.c_str(),G_MQCONSUMER_SECRETKEY.c_str(), "");
|
//SetProducerSessionCredentials(producer_, G_MQCONSUMER_ACCESSKEY.c_str(),G_MQCONSUMER_SECRETKEY.c_str(), "");
|
||||||
producer_.setSessionCredentials(
|
producer_.setSessionCredentials(
|
||||||
G_MQCONSUMER_ACCESSKEY,
|
G_MQCONSUMER_ACCESSKEY,
|
||||||
@@ -848,14 +873,9 @@ void rocketmq_producer_send(const std::string& body,
|
|||||||
const std::string& tags,
|
const std::string& tags,
|
||||||
const std::string& keys)
|
const std::string& keys)
|
||||||
{
|
{
|
||||||
if (g_producer == NULL) {
|
std::call_once(g_producer_once, [&](){
|
||||||
try {
|
|
||||||
InitializeProducer();
|
InitializeProducer();
|
||||||
} catch (...) {
|
});
|
||||||
std::cerr << "Cannot send message because producer initialization failed." << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
g_producer->sendMessage(body, topic, tags, keys);
|
g_producer->sendMessage(body, topic, tags, keys);
|
||||||
@@ -876,9 +896,9 @@ void StartSendMessage(CProducer* producer)
|
|||||||
CSendResult result;
|
CSendResult result;
|
||||||
|
|
||||||
// create message and set some values for it
|
// create message and set some values for it
|
||||||
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC.c_str());
|
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC_TEST.c_str());
|
||||||
SetMessageTags(msg, G_ROCKETMQ_TAG.c_str());
|
SetMessageTags(msg, G_ROCKETMQ_TAG_TEST.c_str());
|
||||||
SetMessageKeys(msg, G_ROCKETMQ_KEY.c_str());
|
SetMessageKeys(msg, G_ROCKETMQ_KEY_TEST.c_str());
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
@@ -902,9 +922,9 @@ void StartSendMessage(CProducer* producer,const char* strbody)
|
|||||||
CSendResult result;
|
CSendResult result;
|
||||||
|
|
||||||
// create message and set some values for it
|
// create message and set some values for it
|
||||||
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC.c_str());
|
CMessage* msg = CreateMessage(G_ROCKETMQ_TOPIC_TEST.c_str());
|
||||||
SetMessageTags(msg, G_ROCKETMQ_TAG.c_str());
|
SetMessageTags(msg, G_ROCKETMQ_TAG_TEST.c_str());
|
||||||
SetMessageKeys(msg, G_ROCKETMQ_KEY.c_str());
|
SetMessageKeys(msg, G_ROCKETMQ_KEY_TEST.c_str());
|
||||||
|
|
||||||
SetMessageBody(msg, strbody);
|
SetMessageBody(msg, strbody);
|
||||||
// send message
|
// send message
|
||||||
@@ -963,13 +983,13 @@ void rocketmq_test_rt()
|
|||||||
{
|
{
|
||||||
Ckafka_data_t data;
|
Ckafka_data_t data;
|
||||||
data.monitor_id = 123123;
|
data.monitor_id = 123123;
|
||||||
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_RT);
|
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_RT);
|
||||||
std::ifstream file("rt.txt"); // 文件中存储长字符串
|
std::ifstream file("rt.txt"); // 文件中存储长字符串
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << file.rdbuf(); // 读取整个文件内容
|
buffer << file.rdbuf(); // 读取整个文件内容
|
||||||
|
|
||||||
data.strText = QString::fromStdString(buffer.str());
|
data.strText = QString::fromStdString(buffer.str());
|
||||||
data.mp_id = 123123;
|
data.mp_id = QString::number(123456);
|
||||||
my_rocketmq_send(data);
|
my_rocketmq_send(data);
|
||||||
}
|
}
|
||||||
//extern std::string G_MQCONSUMER_TOPIC_UD;
|
//extern std::string G_MQCONSUMER_TOPIC_UD;
|
||||||
@@ -977,13 +997,13 @@ void rocketmq_test_ud()//用来测试台账更新
|
|||||||
{
|
{
|
||||||
Ckafka_data_t data;
|
Ckafka_data_t data;
|
||||||
data.monitor_id = 123123;
|
data.monitor_id = 123123;
|
||||||
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_UD);
|
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_UD);
|
||||||
std::ifstream file("ud.txt"); // 文件中存储长字符串
|
std::ifstream file("ud.txt"); // 文件中存储长字符串
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << file.rdbuf(); // 读取整个文件内容
|
buffer << file.rdbuf(); // 读取整个文件内容
|
||||||
|
|
||||||
data.strText = QString::fromStdString(buffer.str());
|
data.strText = QString::fromStdString(buffer.str());
|
||||||
data.mp_id = 123123;
|
data.mp_id = QString::number(123456);
|
||||||
my_rocketmq_send(data);
|
my_rocketmq_send(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -991,13 +1011,13 @@ void rocketmq_test_set()//用来测试进程控制脚本
|
|||||||
{
|
{
|
||||||
Ckafka_data_t data;
|
Ckafka_data_t data;
|
||||||
data.monitor_id = 123123;
|
data.monitor_id = 123123;
|
||||||
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_SET);
|
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_SET);
|
||||||
std::ifstream file("set.txt"); // 文件中存储长字符串
|
std::ifstream file("set.txt"); // 文件中存储长字符串
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << file.rdbuf(); // 读取整个文件内容
|
buffer << file.rdbuf(); // 读取整个文件内容
|
||||||
|
|
||||||
data.strText = QString::fromStdString(buffer.str());
|
data.strText = QString::fromStdString(buffer.str());
|
||||||
data.mp_id = 123123;
|
data.mp_id = QString::number(123456);
|
||||||
my_rocketmq_send(data);
|
my_rocketmq_send(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1005,13 +1025,13 @@ void rocketmq_test_only()//用来测试进程控制脚本
|
|||||||
{
|
{
|
||||||
Ckafka_data_t data;
|
Ckafka_data_t data;
|
||||||
data.monitor_id = 123123;
|
data.monitor_id = 123123;
|
||||||
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_SET);
|
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_TEST);
|
||||||
std::ifstream file("set_debug.txt"); // 文件中存储长字符串
|
std::ifstream file("test.txt"); // 文件中存储长字符串
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << file.rdbuf(); // 读取整个文件内容
|
buffer << file.rdbuf(); // 读取整个文件内容
|
||||||
|
|
||||||
data.strText = QString::fromStdString(buffer.str());
|
data.strText = QString::fromStdString(buffer.str());
|
||||||
data.mp_id = 123123;
|
data.mp_id = QString::number(123456);
|
||||||
my_rocketmq_send(data);
|
my_rocketmq_send(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1020,13 +1040,13 @@ void rocketmq_test_rc()
|
|||||||
{
|
{
|
||||||
Ckafka_data_t data;
|
Ckafka_data_t data;
|
||||||
data.monitor_id = 123123;
|
data.monitor_id = 123123;
|
||||||
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_RC);
|
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_RC);
|
||||||
std::ifstream file("rc.txt"); // 文件中存储长字符串
|
std::ifstream file("rc.txt"); // 文件中存储长字符串
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << file.rdbuf(); // 读取整个文件内容
|
buffer << file.rdbuf(); // 读取整个文件内容
|
||||||
|
|
||||||
data.strText = QString::fromStdString(buffer.str());
|
data.strText = QString::fromStdString(buffer.str());
|
||||||
data.mp_id = 123123;
|
data.mp_id = QString::number(123456);
|
||||||
my_rocketmq_send(data);
|
my_rocketmq_send(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1035,13 +1055,13 @@ void rocketmq_test_log()
|
|||||||
{
|
{
|
||||||
Ckafka_data_t data;
|
Ckafka_data_t data;
|
||||||
data.monitor_id = 123123;
|
data.monitor_id = 123123;
|
||||||
data.strTopic = QString::fromStdString(std::string(FRONT_INST) + "_" + G_MQCONSUMER_TOPIC_LOG);
|
data.strTopic = QString::fromStdString(G_MQCONSUMER_TOPIC_LOG);
|
||||||
std::ifstream file("log_test.txt"); // 文件中存储长字符串
|
std::ifstream file("log_test.txt"); // 文件中存储长字符串
|
||||||
std::stringstream buffer;
|
std::stringstream buffer;
|
||||||
buffer << file.rdbuf(); // 读取整个文件内容
|
buffer << file.rdbuf(); // 读取整个文件内容
|
||||||
|
|
||||||
data.strText = QString::fromStdString(buffer.str());
|
data.strText = QString::fromStdString(buffer.str());
|
||||||
data.mp_id = 123123;
|
data.mp_id = QString::number(123456);
|
||||||
my_rocketmq_send(data);
|
my_rocketmq_send(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -280,9 +280,9 @@ extern int g_front_seg_num;
|
|||||||
//生产者
|
//生产者
|
||||||
std::string G_ROCKETMQ_PRODUCER = "";//rocketmq producer
|
std::string G_ROCKETMQ_PRODUCER = "";//rocketmq producer
|
||||||
std::string G_ROCKETMQ_IPPORT = "";//rocketmq ip+port
|
std::string G_ROCKETMQ_IPPORT = "";//rocketmq ip+port
|
||||||
std::string G_ROCKETMQ_TOPIC = "";//topie
|
std::string G_ROCKETMQ_TOPIC_TEST = "";//topie
|
||||||
std::string G_ROCKETMQ_TAG = "";//tag
|
std::string G_ROCKETMQ_TAG_TEST = "";//tag
|
||||||
std::string G_ROCKETMQ_KEY = "";//key
|
std::string G_ROCKETMQ_KEY_TEST = "";//key
|
||||||
int QUEUENUM = 0;
|
int QUEUENUM = 0;
|
||||||
std::string BROKERNAME = "";
|
std::string BROKERNAME = "";
|
||||||
//消费者
|
//消费者
|
||||||
@@ -321,12 +321,22 @@ std::string Heart_Beat_Key = "";
|
|||||||
std::string Topic_Reply_Topic = "";
|
std::string Topic_Reply_Topic = "";
|
||||||
std::string Topic_Reply_Tag = "";
|
std::string Topic_Reply_Tag = "";
|
||||||
std::string Topic_Reply_Key = "";
|
std::string Topic_Reply_Key = "";
|
||||||
|
//数据追踪
|
||||||
|
std::string DATA_TRACE_TOPIC = "";
|
||||||
|
std::string DATA_TRACE_TAG = "";
|
||||||
|
std::string DATA_TRACE_KEY = "";
|
||||||
|
|
||||||
//lnk20260310添加文件管理的topic和tag
|
//lnk20260310添加文件管理的topic和tag
|
||||||
std::string G_MQCONSUMER_TOPIC_FILE = "";//consumer topie
|
std::string G_MQCONSUMER_TOPIC_FILE = "";//consumer topie
|
||||||
std::string G_MQCONSUMER_TAG_FILE = "";//consumer tag
|
std::string G_MQCONSUMER_TAG_FILE = "";//consumer tag
|
||||||
std::string G_MQCONSUMER_KEY_FILE = "";//consumer key
|
std::string G_MQCONSUMER_KEY_FILE = "";//consumer key
|
||||||
|
|
||||||
|
std::string G_REPLY_TOPIC_FILE = "";//consumer topie
|
||||||
|
std::string G_REPLY_TAG_FILE = "";//consumer tag
|
||||||
|
std::string G_REPLY_KEY_FILE = "";//consumer key
|
||||||
|
|
||||||
|
std::string G_MQCONSUMER_TOPIC_TEST = "";
|
||||||
|
|
||||||
int G_TEST_FLAG = 0;
|
int G_TEST_FLAG = 0;
|
||||||
int G_TEST_NUM = 0;
|
int G_TEST_NUM = 0;
|
||||||
int G_TEST_TYPE = 0;
|
int G_TEST_TYPE = 0;
|
||||||
@@ -644,12 +654,12 @@ void init_config() {
|
|||||||
G_ROCKETMQ_PRODUCER = strdup(ba.data());
|
G_ROCKETMQ_PRODUCER = strdup(ba.data());
|
||||||
ba = settings.value("RocketMq/Ipport", "").toString().toLatin1();
|
ba = settings.value("RocketMq/Ipport", "").toString().toLatin1();
|
||||||
G_ROCKETMQ_IPPORT = strdup(ba.data());
|
G_ROCKETMQ_IPPORT = strdup(ba.data());
|
||||||
ba = settings.value("RocketMq/Topic", "").toString().toLatin1();
|
ba = settings.value("RocketMq/TESTTopic", "").toString().toLatin1();
|
||||||
G_ROCKETMQ_TOPIC = strdup(ba.data());
|
G_ROCKETMQ_TOPIC_TEST = strdup(ba.data());
|
||||||
ba = settings.value("RocketMq/Tag", "").toString().toLatin1();
|
ba = settings.value("RocketMq/TESTTag", "").toString().toLatin1();
|
||||||
G_ROCKETMQ_TAG = strdup(ba.data());
|
G_ROCKETMQ_TAG_TEST = strdup(ba.data());
|
||||||
ba = settings.value("RocketMq/Key", "").toString().toLatin1();
|
ba = settings.value("RocketMq/TESTKey", "").toString().toLatin1();
|
||||||
G_ROCKETMQ_KEY = strdup(ba.data());
|
G_ROCKETMQ_KEY_TEST = strdup(ba.data());
|
||||||
QUEUENUM = settings.value("RocketMq/Queuenum", 0).toInt();
|
QUEUENUM = settings.value("RocketMq/Queuenum", 0).toInt();
|
||||||
|
|
||||||
//心跳
|
//心跳
|
||||||
@@ -667,6 +677,13 @@ void init_config() {
|
|||||||
ba = settings.value("RocketMq/Topic_Reply_Key", "").toString().toLatin1();
|
ba = settings.value("RocketMq/Topic_Reply_Key", "").toString().toLatin1();
|
||||||
Topic_Reply_Key = strdup(ba.data());
|
Topic_Reply_Key = strdup(ba.data());
|
||||||
|
|
||||||
|
//数据追踪
|
||||||
|
ba = settings.value("RocketMq/TraceTopic", "").toString().toLatin1();
|
||||||
|
DATA_TRACE_TOPIC = strdup(ba.data());
|
||||||
|
ba = settings.value("RocketMq/TraceTag", "").toString().toLatin1();
|
||||||
|
DATA_TRACE_TAG = strdup(ba.data());
|
||||||
|
ba = settings.value("RocketMq/TraceKey", "").toString().toLatin1();
|
||||||
|
DATA_TRACE_KEY = strdup(ba.data());
|
||||||
|
|
||||||
//消费者
|
//消费者
|
||||||
ba = settings.value("RocketMq/consumer", "").toString().toLatin1();
|
ba = settings.value("RocketMq/consumer", "").toString().toLatin1();
|
||||||
@@ -724,12 +741,21 @@ void init_config() {
|
|||||||
G_CONNECT_KEY = strdup(ba.data());
|
G_CONNECT_KEY = strdup(ba.data());
|
||||||
|
|
||||||
//lnk20260310添加文件管理的topic和tag
|
//lnk20260310添加文件管理的topic和tag
|
||||||
ba = settings.value("RocketMq/ConsumerTopicFile", "").toString().toLatin1();
|
ba = settings.value("RocketMq/ConsumerTopicFILE", "").toString().toLatin1();
|
||||||
G_MQCONSUMER_TOPIC_FILE = strdup(ba.data());
|
G_MQCONSUMER_TOPIC_FILE = strdup(ba.data());
|
||||||
ba = settings.value("RocketMq/ConsumerTagFile", "").toString().toLatin1();
|
ba = settings.value("RocketMq/ConsumerTagFILE", "").toString().toLatin1();
|
||||||
G_MQCONSUMER_TAG_FILE = strdup(ba.data());
|
G_MQCONSUMER_TAG_FILE = strdup(ba.data());
|
||||||
ba = settings.value("RocketMq/ConsumerKeyFile", "").toString().toLatin1();
|
ba = settings.value("RocketMq/ConsumerKeyFILE", "").toString().toLatin1();
|
||||||
G_MQCONSUMER_KEY_FILE = strdup(ba.data());
|
G_MQCONSUMER_KEY_FILE = strdup(ba.data());
|
||||||
|
ba = settings.value("RocketMq/ReplyTopicFILE", "").toString().toLatin1();
|
||||||
|
G_REPLY_TOPIC_FILE = strdup(ba.data());
|
||||||
|
ba = settings.value("RocketMq/ReplyTagFILE", "").toString().toLatin1();
|
||||||
|
G_REPLY_TAG_FILE = strdup(ba.data());
|
||||||
|
ba = settings.value("RocketMq/ReplyKeyFILE", "").toString().toLatin1();
|
||||||
|
G_REPLY_KEY_FILE = strdup(ba.data());
|
||||||
|
|
||||||
|
ba = settings.value("RocketMq/ConsumerTopicTEST", "").toString().toLatin1();
|
||||||
|
G_MQCONSUMER_TOPIC_TEST = strdup(ba.data());
|
||||||
|
|
||||||
|
|
||||||
//MQ测试
|
//MQ测试
|
||||||
@@ -747,9 +773,9 @@ void init_config() {
|
|||||||
//生产者相关打印
|
//生产者相关打印
|
||||||
std::cout << "Read G_ROCKETMQ_PRODUCER:" << G_ROCKETMQ_PRODUCER << std::endl;
|
std::cout << "Read G_ROCKETMQ_PRODUCER:" << G_ROCKETMQ_PRODUCER << std::endl;
|
||||||
std::cout << "Read G_ROCKETMQ_IPPORT:" << G_ROCKETMQ_IPPORT << std::endl;
|
std::cout << "Read G_ROCKETMQ_IPPORT:" << G_ROCKETMQ_IPPORT << std::endl;
|
||||||
std::cout << "Read G_ROCKETMQ_TOPIC:" << G_ROCKETMQ_TOPIC << std::endl;
|
std::cout << "Read G_ROCKETMQ_TOPIC_TEST:" << G_ROCKETMQ_TOPIC_TEST << std::endl;
|
||||||
std::cout << "Read G_ROCKETMQ_TAG:" << G_ROCKETMQ_TAG << std::endl;
|
std::cout << "Read G_ROCKETMQ_TAG_TEST:" << G_ROCKETMQ_TAG_TEST << std::endl;
|
||||||
std::cout << "Read G_ROCKETMQ_KEY:" << G_ROCKETMQ_KEY << std::endl;
|
std::cout << "Read G_ROCKETMQ_KEY_TEST:" << G_ROCKETMQ_KEY_TEST << std::endl;
|
||||||
std::cout << "Read QUEUENUM:" << QUEUENUM << std::endl;
|
std::cout << "Read QUEUENUM:" << QUEUENUM << std::endl;
|
||||||
std::cout << "Read G_LOG_TOPIC:" << G_LOG_TOPIC << std::endl;
|
std::cout << "Read G_LOG_TOPIC:" << G_LOG_TOPIC << std::endl;
|
||||||
std::cout << "Read G_LOG_TAG:" << G_LOG_TAG << std::endl;
|
std::cout << "Read G_LOG_TAG:" << G_LOG_TAG << std::endl;
|
||||||
@@ -1512,8 +1538,8 @@ int parse_rpt_log_ini()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
|
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {//遍历所有测点,但是某些测点可能为空,台账初始化时ied->cpucount取的是测点号
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);//测点号从1开始,cpuno从0开始,所以ied_usr->LD_info[cpuno]对应测点号为cpuno+1,注意台账初始化时ied_usr->LD_info数组的大小是按照测点总数分配的,所以有些测点号可能没有对应的LD_info,添加判断防止崩溃
|
||||||
//char str[256]; //256大小
|
//char str[256]; //256大小
|
||||||
char* tmp = Get_IED(ied_usr->dev_type);
|
char* tmp = Get_IED(ied_usr->dev_type);
|
||||||
if(tmp == NULL){std::cerr << "front read ied config error!" << std::endl;continue;}
|
if(tmp == NULL){std::cerr << "front read ied config error!" << std::endl;continue;}
|
||||||
@@ -1527,10 +1553,21 @@ int parse_rpt_log_ini()
|
|||||||
//调试用
|
//调试用
|
||||||
printf("%s使用内存地址 LD_name[%d]: %p\n", ied_usr->terminal_id, cpuno, (void*)ied_usr->LD_info[cpuno].LD_name);
|
printf("%s使用内存地址 LD_name[%d]: %p\n", ied_usr->terminal_id, cpuno, (void*)ied_usr->LD_info[cpuno].LD_name);
|
||||||
|
|
||||||
//添加判断,有的监测点没有cpuno为2,直接申请了LD_info[1],没申请LD_info[0]
|
//添加判断,比如有的监测点没有cpuno为2,直接申请了LD_info[1],没申请LD_info[0]
|
||||||
if(ied_usr->LD_info[cpuno].LD_name == NULL){
|
if(ied_usr->LD_info[cpuno].LD_name == NULL){ //空说明台账初始化没申请空间
|
||||||
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
||||||
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
||||||
|
|
||||||
|
//添加默认值,防止崩溃20260601
|
||||||
|
LD_info->rptcount = 0;
|
||||||
|
LD_info->logcount = 0;
|
||||||
|
LD_info->cpuno = 0;
|
||||||
|
LD_info->LD_name = NULL;
|
||||||
|
LD_info->rptinfo = NULL;
|
||||||
|
LD_info->loginfo = NULL;
|
||||||
|
|
||||||
|
delete[] tmp;//释放内存
|
||||||
|
|
||||||
continue;//跳过防止崩溃
|
continue;//跳过防止崩溃
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1544,7 +1581,19 @@ int parse_rpt_log_ini()
|
|||||||
|
|
||||||
apr_snprintf(buf, sizeof(buf), "%s", rpt_cfg_strlists[type]->at(i).toAscii().constData());
|
apr_snprintf(buf, sizeof(buf), "%s", rpt_cfg_strlists[type]->at(i).toAscii().constData());
|
||||||
|
|
||||||
fill_rptctrl_by_cfg(LD_info, i, buf);
|
//fill_rptctrl_by_cfg(LD_info, i, buf);
|
||||||
|
int ret = fill_rptctrl_by_cfg(LD_info, i, buf);
|
||||||
|
if (ret != 0) {
|
||||||
|
printf("[RPT_INIT][ERROR] fill_rptctrl_by_cfg failed dev=%s cpu=%d rpt=%d cfg=%s\n",
|
||||||
|
ied_usr->terminal_id, cpuno, i, buf);
|
||||||
|
|
||||||
|
DIY_ERRORLOG_CODE(ied_usr->terminal_id,1,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点的第%d个报告配置解析失败,请检查报告配置格式是否正确",ied_usr->terminal_id, cpuno + 1, i + 1);
|
||||||
|
|
||||||
|
if (LD_info->rptinfo && LD_info->rptinfo[i]) {
|
||||||
|
LD_info->rptinfo[i]->rptID = NULL;
|
||||||
|
LD_info->rptinfo[i]->LD_info = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2996,6 +3045,10 @@ void Cout_account_information() {
|
|||||||
add_comm_log(const_cast<char*>(text.toLocal8Bit().constData()));
|
add_comm_log(const_cast<char*>(text.toLocal8Bit().constData()));
|
||||||
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
|
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
|
|
||||||
|
if (LD_info->cpuno == 0 || LD_info->LD_name == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
QString text2;//待组装的pgsql语句
|
QString text2;//待组装的pgsql语句
|
||||||
text2.append(QString("mp_id: \"%1\" terminal_code:\"%2\" ").arg(LD_info->mp_id).arg(LD_info->terminal_code));
|
text2.append(QString("mp_id: \"%1\" terminal_code:\"%2\" ").arg(LD_info->mp_id).arg(LD_info->terminal_code));
|
||||||
add_comm_log(const_cast<char*>(text2.toLocal8Bit().constData()));
|
add_comm_log(const_cast<char*>(text2.toLocal8Bit().constData()));
|
||||||
@@ -4189,6 +4242,18 @@ int terminal_ledger_web(QMap<QString, terminal_dev*>* terminal_dev_map,
|
|||||||
return 0; // 确保函数有返回值
|
return 0; // 确保函数有返回值
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void init_oper_type_cache(ied_usr_t *ied_usr)
|
||||||
|
{
|
||||||
|
if (ied_usr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ied_usr->oper_type_cache.inited = SD_FALSE;
|
||||||
|
|
||||||
|
ied_usr->oper_type_cache.ledrs_oper_type_id = -1;
|
||||||
|
ied_usr->oper_type_cache.reboot_oper_type_id = -1;
|
||||||
|
ied_usr->oper_type_cache.reset_oper_type_id = -1;
|
||||||
|
}
|
||||||
|
|
||||||
int parse_device_cfg_web()
|
int parse_device_cfg_web()
|
||||||
{
|
{
|
||||||
std::cout << "parse_device_cfg_web" << endl;
|
std::cout << "parse_device_cfg_web" << endl;
|
||||||
@@ -4422,6 +4487,10 @@ int parse_device_cfg_web()
|
|||||||
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
|
apr_snprintf(ied_usr->dev_key, sizeof(ied_usr->dev_key), "%s", "");//DEV_Key
|
||||||
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
|
cout << "defalut dev_key:" << ied_usr->dev_key << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//lnk20260512
|
||||||
|
init_oper_type_cache(ied_usr);
|
||||||
|
|
||||||
//lnk20260304
|
//lnk20260304
|
||||||
ied_usr->log_level = log_level;//日志等级
|
ied_usr->log_level = log_level;//日志等级
|
||||||
cout << "ied_usr->log_level:" << ied_usr->log_level << endl;
|
cout << "ied_usr->log_level:" << ied_usr->log_level << endl;
|
||||||
@@ -4495,7 +4564,7 @@ int parse_device_cfg_web()
|
|||||||
//otl_datetime timestamp;
|
//otl_datetime timestamp;
|
||||||
int monitor_log_level = 1;//监测点日志等级
|
int monitor_log_level = 1;//监测点日志等级
|
||||||
//for (int j = 0; j < 10; ++j) { // 假设最多有10个监测点
|
//for (int j = 0; j < 10; ++j) { // 假设最多有10个监测点
|
||||||
for (int j = 0; value->line[j].monitor_id[0] != '\0'; ++j){
|
for (int j = 0; value->line[j].monitor_id[0] != '\0'; ++j){//只看有测点号的监测点,避免访问无效数据
|
||||||
ledger_monitor& monitor = value->line[j];
|
ledger_monitor& monitor = value->line[j];
|
||||||
// 检查监测点 ID 是否为空以避免访问无效数据
|
// 检查监测点 ID 是否为空以避免访问无效数据
|
||||||
/*if (monitor.monitor_id[0] != '\0') {
|
/*if (monitor.monitor_id[0] != '\0') {
|
||||||
@@ -4517,27 +4586,33 @@ int parse_device_cfg_web()
|
|||||||
strncpy(monitor_status, monitor.status, sizeof(monitor_status) - 1);//添加监测点状态
|
strncpy(monitor_status, monitor.status, sizeof(monitor_status) - 1);//添加监测点状态
|
||||||
monitor_log_level = monitor.log_level;//监测点日志等级
|
monitor_log_level = monitor.log_level;//监测点日志等级
|
||||||
//监测点台账处理
|
//监测点台账处理
|
||||||
count_real_monitor++;
|
count_real_monitor++;//初始为0,进入一次+1,有效监测点排号从1开始
|
||||||
memset(&line_info, 0, sizeof(line_info));
|
memset(&line_info, 0, sizeof(line_info));//有效测点的初始化
|
||||||
line_info.line_id = count_real_monitor; //监测点排号
|
|
||||||
|
line_info.line_id = count_real_monitor; //监测点排号,前置本地使用
|
||||||
cout << "line_id:" << line_info.line_id << endl;
|
cout << "line_id:" << line_info.line_id << endl;
|
||||||
strcpy(line_info.mp_id, monitor_id);
|
|
||||||
|
strcpy(line_info.mp_id, monitor_id);//测点id
|
||||||
cout << "mp_id:" << line_info.mp_id << endl;
|
cout << "mp_id:" << line_info.mp_id << endl;
|
||||||
|
|
||||||
strcpy(line_info.terminal_code, terminal_code); //从上级获取的终端号
|
strcpy(line_info.terminal_code, terminal_code); //从上级获取的终端号
|
||||||
cout << "terminal_code:" << line_info.terminal_code << endl;
|
cout << "terminal_code:" << line_info.terminal_code << endl;
|
||||||
|
|
||||||
if (isCharPtrEmpty(logical_device_seq)) {
|
if (isCharPtrEmpty(logical_device_seq)) {
|
||||||
line_info.cpuno = 1; //默认监测点实例号1
|
line_info.cpuno = 1; //默认监测点实例号1
|
||||||
cout << "logical_device_seq:is null,set cpuno:"<< line_info.cpuno << endl;
|
cout << "logical_device_seq:is null,set cpuno:"<< line_info.cpuno << endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
line_info.cpuno = std::atoi(logical_device_seq);
|
line_info.cpuno = std::atoi(logical_device_seq); //台账实例号,即台账的测点号
|
||||||
cout << "logical_device_seq:"<< line_info.cpuno << endl;
|
cout << "logical_device_seq:"<< line_info.cpuno << endl;
|
||||||
}
|
}
|
||||||
//cout << "cpuno:" << line_info.cpuno << endl;
|
//cout << "cpuno:" << line_info.cpuno << endl;
|
||||||
strcpy(line_info.voltage_level, voltage_level);
|
strcpy(line_info.voltage_level, voltage_level);//电压等级
|
||||||
cout << "voltage_level:" << line_info.voltage_level << endl;
|
cout << "voltage_level:" << line_info.voltage_level << endl;
|
||||||
strcpy(line_info.v_wiring_type, terminal_connect);
|
|
||||||
|
strcpy(line_info.v_wiring_type, terminal_connect);//接线方式
|
||||||
cout << "v_wiring_type:" << line_info.v_wiring_type << endl;
|
cout << "v_wiring_type:" << line_info.v_wiring_type << endl;
|
||||||
|
|
||||||
//lnk2024-8-14记录接线标志
|
//lnk2024-8-14记录接线标志
|
||||||
if (strcmp(line_info.v_wiring_type, "0") != 0)
|
if (strcmp(line_info.v_wiring_type, "0") != 0)
|
||||||
{
|
{
|
||||||
@@ -4545,7 +4620,7 @@ int parse_device_cfg_web()
|
|||||||
cout << "monitor_id" << monitor_id << "v_wiring_type:" << line_info.v_wiring_type << "is delta wiring:" << isdelta_flag << endl;
|
cout << "monitor_id" << monitor_id << "v_wiring_type:" << line_info.v_wiring_type << "is delta wiring:" << isdelta_flag << endl;
|
||||||
DIY_WARNLOG_CODE("process",0,LOG_CODE_LEDGER,"【WARN】前置连接的监测点 %s 是角形接线,对应终端为%s 终端类型是%s",line_info.mp_id,ied_usr->terminal_id,ied_usr->dev_type);
|
DIY_WARNLOG_CODE("process",0,LOG_CODE_LEDGER,"【WARN】前置连接的监测点 %s 是角形接线,对应终端为%s 终端类型是%s",line_info.mp_id,ied_usr->terminal_id,ied_usr->dev_type);
|
||||||
}
|
}
|
||||||
strcpy(line_info.monitor_status, monitor_status);
|
strcpy(line_info.monitor_status, monitor_status);//测点状态
|
||||||
cout << "monitor_status:" << line_info.monitor_status << endl;
|
cout << "monitor_status:" << line_info.monitor_status << endl;
|
||||||
//// 构造struct tm对象
|
//// 构造struct tm对象
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
@@ -4556,27 +4631,32 @@ int parse_device_cfg_web()
|
|||||||
timeinfo.tm_min = timestamp.minute;
|
timeinfo.tm_min = timestamp.minute;
|
||||||
timeinfo.tm_sec = timestamp.second;
|
timeinfo.tm_sec = timestamp.second;
|
||||||
time_t time = std::mktime(&timeinfo);
|
time_t time = std::mktime(&timeinfo);
|
||||||
line_info.time = static_cast<long long>(time);
|
line_info.time = static_cast<long long>(time);//测点更新时间
|
||||||
cout << "time:" << line_info.time << endl;
|
cout << "time:" << line_info.time << endl;
|
||||||
strcpy(line_info.name, monitor_name);
|
|
||||||
|
strcpy(line_info.name, monitor_name);//测点名
|
||||||
cout << "name:" << line_info.name << endl;
|
cout << "name:" << line_info.name << endl;
|
||||||
|
|
||||||
line_info.read_flag = ENABLE; //监测点有效
|
line_info.read_flag = ENABLE; //监测点有效
|
||||||
|
|
||||||
line_info.log_level = monitor_log_level; //监测点日志等级
|
line_info.log_level = monitor_log_level; //监测点日志等级
|
||||||
cout << "log_level_monitor:" << line_info.log_level << endl;
|
cout << "log_level_monitor:" << line_info.log_level << endl;
|
||||||
|
|
||||||
//ied = find_ied_from_dev_code(line_info.terminal_code); //不需要再找上级终端了,已经在终端里了
|
//ied = find_ied_from_dev_code(line_info.terminal_code); //不需要再找上级终端了,已经在终端里了
|
||||||
if (ied && ied->usr_ext && line_info.cpuno && (static_cast<int>(line_info.cpuno) < 10)) {
|
if (ied && ied->usr_ext && line_info.cpuno && (static_cast<int>(line_info.cpuno) < 10)) {//台账测点号有效
|
||||||
char str[256]; //256大小
|
char str[256]; //256大小
|
||||||
byte_t cpuno = line_info.cpuno;
|
byte_t cpuno = line_info.cpuno; //台账的测点号
|
||||||
cout << "cpuno:" << (int)line_info.cpuno << endl;
|
cout << "cpuno:" << (int)line_info.cpuno << endl;
|
||||||
cout << "index cpuno:" << cpuno-1 << endl;
|
cout << "index cpuno:" << cpuno-1 << endl;
|
||||||
|
|
||||||
ied_usr = (ied_usr_t*)ied->usr_ext;
|
ied_usr = (ied_usr_t*)ied->usr_ext;
|
||||||
ied_usr->LD_info[cpuno - 1] = line_info; //cpuno默认是1
|
ied_usr->LD_info[cpuno - 1] = line_info; //cpuno默认是1
|
||||||
ied_usr->LD_info[cpuno - 1].ied = ied;
|
ied_usr->LD_info[cpuno - 1].ied = ied; //父级指针绑定
|
||||||
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);//将监测点逻辑号转为PQMonitorPQM+逻辑号
|
apr_snprintf(str, sizeof(str), "PQMonitorPQM%d", cpuno);//将监测点逻辑号转为PQMonitorPQM+逻辑号
|
||||||
//lnk20250208不使用apr_pstrdup,后续直接复用
|
//lnk20250208不使用apr_pstrdup,后续直接复用
|
||||||
//ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);//将 str 中的格式化字符串复制到内存池 g_init_pool 中。ied_usr->LD_info[cpuno - 1].LD_name 存储了这个字符串的副本,LD_name 现在是 PQMonitorPQM{cpuno} 的形式。
|
//ied_usr->LD_info[cpuno - 1].LD_name = apr_pstrdup(g_init_pool, str);//将 str 中的格式化字符串复制到内存池 g_init_pool 中。ied_usr->LD_info[cpuno - 1].LD_name 存储了这个字符串的副本,LD_name 现在是 PQMonitorPQM{cpuno} 的形式。
|
||||||
// 从 g_init_pool 内存池中分配固定 256 字节的内存
|
// 从 g_init_pool 内存池中分配固定 256 字节的内存
|
||||||
ied_usr->LD_info[cpuno - 1].LD_name = (char *)apr_palloc(g_init_pool, 256);
|
ied_usr->LD_info[cpuno - 1].LD_name = (char *)apr_palloc(g_init_pool, 256);//根据台账中的测点号申请内存
|
||||||
//调试用,申请的地址
|
//调试用,申请的地址
|
||||||
printf("%s分配内存地址 LD_name[%d]: %p\n", ied_usr->terminal_id, cpuno - 1, (void*)ied_usr->LD_info[cpuno - 1].LD_name);
|
printf("%s分配内存地址 LD_name[%d]: %p\n", ied_usr->terminal_id, cpuno - 1, (void*)ied_usr->LD_info[cpuno - 1].LD_name);
|
||||||
// 清空内存,防止残留数据
|
// 清空内存,防止残留数据
|
||||||
@@ -4587,21 +4667,21 @@ int parse_device_cfg_web()
|
|||||||
//这里申请的空间基于ied的数量,挂载到ied上
|
//这里申请的空间基于ied的数量,挂载到ied上
|
||||||
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool); //这两行代码分别为 ied_usr->LD_info[cpuno - 1] 的两个成员(ht_fcd 和 ht_full_fcda)创建了空的哈希表。apr_hash_make(g_init_pool) 会在 g_init_pool 内存池中为这两个哈希表分配内存空间
|
ied_usr->LD_info[cpuno - 1].ht_fcd = apr_hash_make(g_init_pool); //这两行代码分别为 ied_usr->LD_info[cpuno - 1] 的两个成员(ht_fcd 和 ht_full_fcda)创建了空的哈希表。apr_hash_make(g_init_pool) 会在 g_init_pool 内存池中为这两个哈希表分配内存空间
|
||||||
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);//它们的 key 值和 value 在后续的代码中可能会被填充
|
ied_usr->LD_info[cpuno - 1].ht_full_fcda = apr_hash_make(g_init_pool);//它们的 key 值和 value 在后续的代码中可能会被填充
|
||||||
ied_usr->LD_info[cpuno - 1].rptcount = 0;
|
ied_usr->LD_info[cpuno - 1].rptcount = 0;//有效测点报告数为初始为0
|
||||||
cout << "rptcount:" << ied_usr->LD_info[cpuno - 1].rptcount << endl;
|
cout << "rptcount:" << ied_usr->LD_info[cpuno - 1].rptcount << endl;
|
||||||
if (cpuno > ied->cpucount) {
|
if (cpuno > ied->cpucount) {//测点号大于测点数
|
||||||
ied->cpucount = cpuno;
|
ied->cpucount = cpuno;//取测点号,后续遍历测点时需要跳过无效测点
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
if (count_real < count_cfg){
|
if (count_real < count_cfg){//读取计数器和台账数量对比,如果读取的数量小于台账数量,说明有些台账读取失败了,按照读取的数量来设置进程的台账数量,避免后续访问读取失败的台账导致崩溃
|
||||||
g_node->n_clients = count_real;
|
g_node->n_clients = count_real;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count_cfg != count_real){
|
if (count_cfg != count_real){//应该相等,如果不相等说明有些台账读取失败了,按照读取的数量来设置进程的台账数量,避免后续访问读取失败的台账导致崩溃
|
||||||
return APR_EBADF;
|
return APR_EBADF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5301,7 +5381,7 @@ std::string base64_encode(const std::string& in) {
|
|||||||
return out; // 返回编码后的字符串
|
return out; // 返回编码后的字符串
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleUploadResponse(const std::string& response, char* wavepath) {
|
void handleUploadResponse(const std::string& response,const std::string& localPath, char* wavepath, int type) {
|
||||||
|
|
||||||
// 解析 JSON 响应
|
// 解析 JSON 响应
|
||||||
cJSON* json_data = cJSON_Parse(response.c_str());
|
cJSON* json_data = cJSON_Parse(response.c_str());
|
||||||
@@ -5349,11 +5429,43 @@ void handleUploadResponse(const std::string& response, char* wavepath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 拷贝到 wavepath
|
// 拷贝到 wavepath
|
||||||
|
if (type == 1) {
|
||||||
strcpy(wavepath, nameWithoutExt.c_str());
|
strcpy(wavepath, nameWithoutExt.c_str());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcpy(wavepath, name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << "wavepath: " << wavepath << std::endl;
|
std::cout << "wavepath: " << wavepath << std::endl;
|
||||||
|
|
||||||
DIY_INFOLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【NORMAL】前置上传文件成功,远端文件名:%s",wavepath);
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【NORMAL】前置上传文件成功,远端文件名:%s",wavepath);
|
||||||
|
|
||||||
|
// =========================
|
||||||
|
// 上传成功后删除本地文件
|
||||||
|
// =========================
|
||||||
|
if (remove(localPath.c_str()) == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Delete local file success: "
|
||||||
|
<< localPath << std::endl;
|
||||||
|
DIY_INFOLOG_CODE("process",0,
|
||||||
|
LOG_CODE_TRANSIENT_COMM,
|
||||||
|
"【NORMAL】删除本地文件成功:%s",
|
||||||
|
localPath.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Delete local file failed: "
|
||||||
|
<< localPath
|
||||||
|
<< " errno=" << errno
|
||||||
|
<< " err=" << strerror(errno)
|
||||||
|
<< std::endl;
|
||||||
|
DIY_ERRORLOG_CODE("process",0,
|
||||||
|
LOG_CODE_TRANSIENT_COMM,
|
||||||
|
"【ERROR】删除本地文件失败:%s errno=%d err=%s",
|
||||||
|
localPath.c_str(),
|
||||||
|
errno,
|
||||||
|
strerror(errno));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::cerr << "Error: Missing expected fields in JSON response." << std::endl;
|
std::cerr << "Error: Missing expected fields in JSON response." << std::endl;
|
||||||
@@ -5423,7 +5535,7 @@ void handleUploadResponse(const std::string& response, char* wavepath) {
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
//这是dataform发送方式
|
//这是dataform发送方式
|
||||||
void SendFileWeb(const std::string& strUrl, const char* localpath, const char* cloudpath, char* wavepath) {
|
void SendFileWeb(const std::string& strUrl, const char* localpath, const char* cloudpath, char* wavepath,int type) {
|
||||||
// 初始化 curl
|
// 初始化 curl
|
||||||
CURL* curl = curl_easy_init();
|
CURL* curl = curl_easy_init();
|
||||||
if (curl) {
|
if (curl) {
|
||||||
@@ -5477,7 +5589,7 @@ void SendFileWeb(const std::string& strUrl, const char* localpath, const char* c
|
|||||||
DIY_ERRORLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传暂态录波文件 %s 失败,请检查文件上传接口配置",localpath);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_TRANSIENT_COMM,"【ERROR】前置上传暂态录波文件 %s 失败,请检查文件上传接口配置",localpath);
|
||||||
} else {
|
} else {
|
||||||
std::cout << "http web success, response: " << resPost0 << std::endl;
|
std::cout << "http web success, response: " << resPost0 << std::endl;
|
||||||
handleUploadResponse(resPost0, wavepath); // 处理响应
|
handleUploadResponse(resPost0, localpath, wavepath, type); // 处理响应
|
||||||
}
|
}
|
||||||
|
|
||||||
// 清理
|
// 清理
|
||||||
@@ -5492,7 +5604,7 @@ void SendFileWeb(const std::string& strUrl, const char* localpath, const char* c
|
|||||||
void SOEFileWeb(char* localpath,char* cloudpath, char* wavepath)
|
void SOEFileWeb(char* localpath,char* cloudpath, char* wavepath)
|
||||||
{
|
{
|
||||||
//示例ip,更换为实际ip即可
|
//示例ip,更换为实际ip即可
|
||||||
SendFileWeb(WEB_FILEUPLOAD,localpath,cloudpath,wavepath);
|
SendFileWeb(WEB_FILEUPLOAD,localpath,cloudpath,wavepath,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SOEFileWeb_test()
|
void SOEFileWeb_test()
|
||||||
@@ -5545,9 +5657,9 @@ int DownloadFileWeb(const std::string& strUrl,
|
|||||||
|
|
||||||
std::string fullUrl = strUrl;
|
std::string fullUrl = strUrl;
|
||||||
if (fullUrl.find('?') == std::string::npos)
|
if (fullUrl.find('?') == std::string::npos)
|
||||||
fullUrl += "?path=";
|
fullUrl += "?filePath=";
|
||||||
else
|
else
|
||||||
fullUrl += "&path=";
|
fullUrl += "&filePath=";
|
||||||
fullUrl += encodedPath;
|
fullUrl += encodedPath;
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, fullUrl.c_str());
|
curl_easy_setopt(curl, CURLOPT_URL, fullUrl.c_str());
|
||||||
@@ -5569,15 +5681,26 @@ int DownloadFileWeb(const std::string& strUrl,
|
|||||||
if (res != CURLE_OK)
|
if (res != CURLE_OK)
|
||||||
{
|
{
|
||||||
std::cerr << "DownloadFileWeb failed: " << curl_easy_strerror(res) << std::endl;
|
std::cerr << "DownloadFileWeb failed: " << curl_easy_strerror(res) << std::endl;
|
||||||
|
remove(localpath);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (http_code != 200)
|
if (http_code != 200)
|
||||||
{
|
{
|
||||||
std::cerr << "DownloadFileWeb http code: " << http_code << std::endl;
|
std::cerr << "DownloadFileWeb http code: " << http_code << std::endl;
|
||||||
|
remove(localpath);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (chmod(localpath, 0777) != 0)
|
||||||
|
{
|
||||||
|
std::cerr << "chmod 777 failed: " << localpath << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "chmod 777 success: " << localpath << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5711,6 +5834,9 @@ int update_one_terminal_ledger(terminal* update, int i,ied_t* ied,int terminal_i
|
|||||||
chnl_usr->m_state = CHANNEL_DISCONNECTED;
|
chnl_usr->m_state = CHANNEL_DISCONNECTED;
|
||||||
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
|
chnl_usr->m_ClosedMsTime = NEXT_CONNECT_TIME * (-1);
|
||||||
|
|
||||||
|
//lnk20260512
|
||||||
|
init_oper_type_cache(ied_usr);
|
||||||
|
|
||||||
// 将 monitorData 中的数据写入到 LD_info 中
|
// 将 monitorData 中的数据写入到 LD_info 中
|
||||||
int count_real_monitor = 0; //遍历监测点台账的计数器
|
int count_real_monitor = 0; //遍历监测点台账的计数器
|
||||||
int j;
|
int j;
|
||||||
@@ -6092,10 +6218,22 @@ int parse_rpt_log_ini_one(ied_t* ied)
|
|||||||
|
|
||||||
//调试
|
//调试
|
||||||
printf("%s使用内存地址 LD_name[%d]: %p\n", ied_usr->terminal_id, cpuno, (void*)ied_usr->LD_info[cpuno].LD_name);
|
printf("%s使用内存地址 LD_name[%d]: %p\n", ied_usr->terminal_id, cpuno, (void*)ied_usr->LD_info[cpuno].LD_name);
|
||||||
|
|
||||||
//添加判断,有的监测点没有cpuno为2,直接申请了LD_info[2-1],没申请LD_info[0]
|
//添加判断,有的监测点没有cpuno为2,直接申请了LD_info[2-1],没申请LD_info[0]
|
||||||
if(ied_usr->LD_info[cpuno].LD_name == NULL){
|
if(ied_usr->LD_info[cpuno].LD_name == NULL){
|
||||||
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
printf("this ld_info didn't palloc space ,maybe this ledger has problem!");
|
||||||
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点无法初始化报告,这个装置的台账存在缺失,请检查装置台账的监测点总数和各监测点的序号",ied_usr->terminal_id,cpuno + 1);
|
||||||
|
|
||||||
|
//添加默认值,防止崩溃20260601
|
||||||
|
LD_info->rptcount = 0;
|
||||||
|
LD_info->logcount = 0;
|
||||||
|
LD_info->cpuno = 0;
|
||||||
|
LD_info->LD_name = NULL;
|
||||||
|
LD_info->rptinfo = NULL;
|
||||||
|
LD_info->loginfo = NULL;
|
||||||
|
|
||||||
|
delete[] tmp;//Get_IED中分配了内存,使用后删除
|
||||||
|
|
||||||
continue;//跳过防止崩溃
|
continue;//跳过防止崩溃
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6114,7 +6252,18 @@ int parse_rpt_log_ini_one(ied_t* ied)
|
|||||||
init_rptctrl_by_count(LD_info, rpt_cfg_strlists[type]->size());
|
init_rptctrl_by_count(LD_info, rpt_cfg_strlists[type]->size());
|
||||||
for (int i = 0; i < rpt_cfg_strlists[type]->size(); ++i) {
|
for (int i = 0; i < rpt_cfg_strlists[type]->size(); ++i) {
|
||||||
apr_snprintf(buf, sizeof(buf), "%s", rpt_cfg_strlists[type]->at(i).toAscii().constData());
|
apr_snprintf(buf, sizeof(buf), "%s", rpt_cfg_strlists[type]->at(i).toAscii().constData());
|
||||||
fill_rptctrl_by_cfg(LD_info, i, buf);
|
//fill_rptctrl_by_cfg(LD_info, i, buf);
|
||||||
|
int ret = fill_rptctrl_by_cfg(LD_info, i, buf);
|
||||||
|
if (ret != 0) {
|
||||||
|
printf("[RPT_INIT][ERROR] fill_rptctrl_by_cfg failed dev=%s cpu=%d rpt=%d cfg=%s\n",
|
||||||
|
ied_usr->terminal_id, cpuno, i, buf);
|
||||||
|
DIY_ERRORLOG_CODE(ied_usr->terminal_id,1,LOG_CODE_RPTINIT,"【ERROR】终端%s的监测点序号为%d的监测点的第%d个报告配置解析失败,请检查报告配置格式是否正确",ied_usr->terminal_id, cpuno + 1, i + 1);
|
||||||
|
|
||||||
|
if (LD_info->rptinfo && LD_info->rptinfo[i]) {
|
||||||
|
LD_info->rptinfo[i]->rptID = NULL;
|
||||||
|
LD_info->rptinfo[i]->LD_info = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//初始化监测点的日志控制
|
//初始化监测点的日志控制
|
||||||
init_logctrl_by_count(LD_info, log_cfg_strlists[type]->size());
|
init_logctrl_by_count(LD_info, log_cfg_strlists[type]->size());
|
||||||
@@ -6528,7 +6677,7 @@ bool shouldSkipTerminal(const char* terminal_id) {
|
|||||||
|
|
||||||
void rocketmq_test_300(int mpnum,int front_index,int type) {
|
void rocketmq_test_300(int mpnum,int front_index,int type) {
|
||||||
Ckafka_data_t data;
|
Ckafka_data_t data;
|
||||||
data.strTopic = QString::fromStdString(G_ROCKETMQ_TOPIC);
|
data.strTopic = QString::fromStdString(G_ROCKETMQ_TOPIC_TEST);
|
||||||
data.mp_id = "0";
|
data.mp_id = "0";
|
||||||
|
|
||||||
// 读取文件内容
|
// 读取文件内容
|
||||||
|
|||||||
1297
json/PQSMsg.cpp
Normal file
1297
json/PQSMsg.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2548
json/PQSMsg.h
Normal file
2548
json/PQSMsg.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -44,6 +44,7 @@ extern std::string WEB_COMFLAG;
|
|||||||
extern std::string WEB_EVENT;
|
extern std::string WEB_EVENT;
|
||||||
extern std::string WEB_FILEDOWNLOAD;
|
extern std::string WEB_FILEDOWNLOAD;
|
||||||
extern std::string G_CONNECT_TOPIC;
|
extern std::string G_CONNECT_TOPIC;
|
||||||
|
extern std::string DATA_TRACE_TOPIC;//lnk20260609数据追踪topic
|
||||||
|
|
||||||
extern int RECALL_ONLY_FLAG;
|
extern int RECALL_ONLY_FLAG;
|
||||||
|
|
||||||
@@ -166,6 +167,7 @@ public:
|
|||||||
QString WavePhasicB;
|
QString WavePhasicB;
|
||||||
QString WavePhasicC;
|
QString WavePhasicC;
|
||||||
QString TypeOfData; //闪变和统计是否合并 0-分开 1-合并
|
QString TypeOfData; //闪变和统计是否合并 0-分开 1-合并
|
||||||
|
QString IEDControl; //例:LD0 lnk2026-5-13
|
||||||
QString UnitOfTimeUnit; //暂态事件持续事件单位:0 - 毫秒 1 - 秒 lnk20260127
|
QString UnitOfTimeUnit; //暂态事件持续事件单位:0 - 毫秒 1 - 秒 lnk20260127
|
||||||
QString ValueOfTimeUnit; //上送值的时间:UTC-UTC时间 beijing-北京时间
|
QString ValueOfTimeUnit; //上送值的时间:UTC-UTC时间 beijing-北京时间
|
||||||
QString WaveTimeFlag; //录波文件的时间:UTC-UTC时间 beijing-北京时间
|
QString WaveTimeFlag; //录波文件的时间:UTC-UTC时间 beijing-北京时间
|
||||||
@@ -289,24 +291,36 @@ static void trace_hit_and_decrement(const QString& mp_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//追踪61850原始数据
|
//追踪61850原始数据
|
||||||
static QString build_mms_multiline_text(const json_block_data* data)
|
static QString build_mms_json_object(const json_block_data* data)
|
||||||
{
|
{
|
||||||
QStringList lines;
|
QString json = "{";
|
||||||
|
|
||||||
QMapIterator<QString, double> it(data->mms_str_map);
|
QMapIterator<QString, double> it(data->mms_str_map);
|
||||||
|
bool first = true;
|
||||||
|
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
it.next();
|
it.next();
|
||||||
lines << QString("%1 = %2").arg(it.key()).arg(it.value(), 0, 'g', 15);
|
|
||||||
|
if (!first)
|
||||||
|
json += ",";
|
||||||
|
|
||||||
|
json += QString("\"%1\":%2")
|
||||||
|
.arg(escape_json_string(it.key()))
|
||||||
|
.arg(QString::number(it.value(), 'g', 15));
|
||||||
|
|
||||||
|
first = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines.join("\n");
|
json += "}";
|
||||||
|
|
||||||
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString build_trace_json(const json_block_data* data)
|
static QString build_trace_json(const json_block_data* data)
|
||||||
{
|
{
|
||||||
if (!data) return "{}";
|
if (!data) return "{}";
|
||||||
|
|
||||||
QString mms_text = build_mms_multiline_text(data);
|
QString mms_json = build_mms_json_object(data);
|
||||||
|
|
||||||
QString json;
|
QString json;
|
||||||
json += "{";
|
json += "{";
|
||||||
@@ -315,7 +329,7 @@ static QString build_trace_json(const json_block_data* data)
|
|||||||
json += QString("\"data_time\":%1,").arg(QString::number((qlonglong)data->time));
|
json += QString("\"data_time\":%1,").arg(QString::number((qlonglong)data->time));
|
||||||
json += QString("\"voltage_level\":\"%1\",").arg(QString::number(data->voltage_level, 'f', 6));
|
json += QString("\"voltage_level\":\"%1\",").arg(QString::number(data->voltage_level, 'f', 6));
|
||||||
json += QString("\"dev_type\":\"%1\",").arg(escape_json_string(data->dev_type));
|
json += QString("\"dev_type\":\"%1\",").arg(escape_json_string(data->dev_type));
|
||||||
json += QString("\"mms_text\":\"%1\"").arg(escape_json_string(mms_text));
|
json += QString("\"mms_json\":%1").arg(mms_json);
|
||||||
json += "}";
|
json += "}";
|
||||||
|
|
||||||
return json;
|
return json;
|
||||||
@@ -333,7 +347,7 @@ static void send_trace_if_needed(json_block_data* pdata)
|
|||||||
Ckafka_data_t KafkaData;
|
Ckafka_data_t KafkaData;
|
||||||
KafkaData.monitor_id = pdata->monitorId;
|
KafkaData.monitor_id = pdata->monitorId;
|
||||||
KafkaData.mp_id = pdata->mp_id;
|
KafkaData.mp_id = pdata->mp_id;
|
||||||
KafkaData.strTopic = "DATA_TRACE_TOPIC";
|
KafkaData.strTopic = QString::fromStdString(DATA_TRACE_TOPIC);
|
||||||
KafkaData.strText = jsonText;
|
KafkaData.strText = jsonText;
|
||||||
|
|
||||||
kafka_data_list_mutex.lock();
|
kafka_data_list_mutex.lock();
|
||||||
@@ -384,6 +398,7 @@ bool get_xml_config_by_dev_type(const char* dev_type, XmlConfigC* out_cfg) {
|
|||||||
strncpy(out_cfg->TypeOfData, cfg.TypeOfData.toUtf8().constData(), sizeof(out_cfg->TypeOfData) - 1); out_cfg->TypeOfData[sizeof(out_cfg->TypeOfData) - 1] = '\0';//lnk20260127
|
strncpy(out_cfg->TypeOfData, cfg.TypeOfData.toUtf8().constData(), sizeof(out_cfg->TypeOfData) - 1); out_cfg->TypeOfData[sizeof(out_cfg->TypeOfData) - 1] = '\0';//lnk20260127
|
||||||
strncpy(out_cfg->ValueOfTimeUnit, cfg.ValueOfTimeUnit.toUtf8().constData(),sizeof(out_cfg->ValueOfTimeUnit) - 1);
|
strncpy(out_cfg->ValueOfTimeUnit, cfg.ValueOfTimeUnit.toUtf8().constData(),sizeof(out_cfg->ValueOfTimeUnit) - 1);
|
||||||
strncpy(out_cfg->WaveTimeFlag, cfg.WaveTimeFlag.toUtf8().constData(), sizeof(out_cfg->WaveTimeFlag) - 1);
|
strncpy(out_cfg->WaveTimeFlag, cfg.WaveTimeFlag.toUtf8().constData(), sizeof(out_cfg->WaveTimeFlag) - 1);
|
||||||
|
strncpy(out_cfg->IEDControl, cfg.IEDControl.toUtf8().constData(), sizeof(out_cfg->IEDControl) - 1);//lnk2026-5-13
|
||||||
strncpy(out_cfg->IEDname, cfg.IEDname.toUtf8().constData(), sizeof(out_cfg->IEDname) - 1);
|
strncpy(out_cfg->IEDname, cfg.IEDname.toUtf8().constData(), sizeof(out_cfg->IEDname) - 1);
|
||||||
strncpy(out_cfg->LDevicePrefix, cfg.LDevicePrefix.toUtf8().constData(), sizeof(out_cfg->LDevicePrefix) - 1);
|
strncpy(out_cfg->LDevicePrefix, cfg.LDevicePrefix.toUtf8().constData(), sizeof(out_cfg->LDevicePrefix) - 1);
|
||||||
|
|
||||||
@@ -1036,6 +1051,10 @@ bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, list<CTopic*> *ctopiclist,QSt
|
|||||||
cfg->WaveTimeFlag.append(e.attribute("WaveTimeFlag"));
|
cfg->WaveTimeFlag.append(e.attribute("WaveTimeFlag"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if ("IEDControl" == strTag)
|
||||||
|
{
|
||||||
|
cfg->IEDControl.append(e.attribute("name"));
|
||||||
|
}
|
||||||
if ("IED" == strTag)
|
if ("IED" == strTag)
|
||||||
{
|
{
|
||||||
cfg->IEDname.append(e.attribute("name"));
|
cfg->IEDname.append(e.attribute("name"));
|
||||||
@@ -1198,6 +1217,9 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
|
|||||||
print_mms_str_map(data);
|
print_mms_str_map(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//数据追踪上送
|
||||||
|
send_trace_if_needed(data);
|
||||||
|
|
||||||
list<CTopic*> ctopic_list;
|
list<CTopic*> ctopic_list;
|
||||||
|
|
||||||
////lnk2024-8-15 区分星型,角型接线
|
////lnk2024-8-15 区分星型,角型接线
|
||||||
@@ -1255,6 +1277,7 @@ int transfer_json_block_data(char v_wiring_type[], json_block_data *data) //json
|
|||||||
printf("TypeOfData = '%s'\n", cfg1.TypeOfData);
|
printf("TypeOfData = '%s'\n", cfg1.TypeOfData);
|
||||||
printf("ValueOfTimeUnit = '%s'\n", cfg1.ValueOfTimeUnit);
|
printf("ValueOfTimeUnit = '%s'\n", cfg1.ValueOfTimeUnit);
|
||||||
printf("WaveTimeFlag = '%s'\n", cfg1.WaveTimeFlag);
|
printf("WaveTimeFlag = '%s'\n", cfg1.WaveTimeFlag);
|
||||||
|
printf("IEDControl = '%s'\n", cfg1.IEDControl);
|
||||||
printf("IEDname = '%s'\n", cfg1.IEDname);
|
printf("IEDname = '%s'\n", cfg1.IEDname);
|
||||||
printf("LDevicePrefix = '%s'\n", cfg1.LDevicePrefix);
|
printf("LDevicePrefix = '%s'\n", cfg1.LDevicePrefix);
|
||||||
printf("=====================================\n");
|
printf("=====================================\n");
|
||||||
@@ -2856,7 +2879,7 @@ void processGGIO_start_data_end(char* mp_id,char* fullname,double v,long long ti
|
|||||||
|
|
||||||
printf("transfer json ggio data: %s==%s \n", KafkaData.strText.toStdString().c_str(), fullname);
|
printf("transfer json ggio data: %s==%s \n", KafkaData.strText.toStdString().c_str(), fullname);
|
||||||
kafka_data_list_mutex.lock(); //加锁
|
kafka_data_list_mutex.lock(); //加锁
|
||||||
kafka_data_list.append(KafkaData); //添加 kafka发送链表
|
//kafka_data_list.append(KafkaData); //添加 kafka发送链表
|
||||||
kafka_data_list_mutex.unlock(); //解锁
|
kafka_data_list_mutex.unlock(); //解锁
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3102,9 +3125,9 @@ char* Get_IED(char* devtype)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString ied;
|
QString ied;
|
||||||
ied.append(xmlinfo_list[type]->xmlcfg.IEDname); // 从配置文件读取的终端名
|
ied.append(xmlinfo_list[type]->xmlcfg.IEDname); // 从配置文件读取的终端名PQ
|
||||||
ied.append(xmlinfo_list[type]->xmlcfg.LDevicePrefix); //// 从配置文件读取的监测点名
|
ied.append(xmlinfo_list[type]->xmlcfg.LDevicePrefix); //// 从配置文件读取的监测点名PQM
|
||||||
ied.append("%d");
|
ied.append("%d");//最后构成PQPQM1
|
||||||
|
|
||||||
QByteArray byteArray = ied.toLocal8Bit();
|
QByteArray byteArray = ied.toLocal8Bit();
|
||||||
|
|
||||||
|
|||||||
@@ -51,10 +51,13 @@ extern int64_t G_APP_START_MS;
|
|||||||
|
|
||||||
extern int RECALL_ONLY_FLAG; //lnk20260309添加一个全局变量,标志是否只运行补招程序
|
extern int RECALL_ONLY_FLAG; //lnk20260309添加一个全局变量,标志是否只运行补招程序
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void SendFileWeb(const std::string& strUrl,
|
extern void SendFileWeb(const std::string& strUrl,
|
||||||
const char* localpath,
|
const char* localpath,
|
||||||
const char* cloudpath,
|
const char* cloudpath,
|
||||||
char* wavepath);
|
char* wavepath,
|
||||||
|
int type);
|
||||||
|
|
||||||
extern int DownloadFileWeb(const std::string& strUrl,
|
extern int DownloadFileWeb(const std::string& strUrl,
|
||||||
const char* remotePath,
|
const char* remotePath,
|
||||||
@@ -86,7 +89,24 @@ extern "C" {
|
|||||||
ST_CHAR *destfilename,
|
ST_CHAR *destfilename,
|
||||||
int iTimeout);
|
int iTimeout);
|
||||||
|
|
||||||
|
extern ST_RET mms_mvla_fdelete (MVL_NET_INFO *net_info,ST_CHAR *file_to_delete,int iTimeout);
|
||||||
|
|
||||||
|
extern ST_RET write_common_oper(chnl_usr_t *chnl_usr,
|
||||||
|
ST_CHAR *domName,
|
||||||
|
const char *ctlName,
|
||||||
|
ST_INT oper_type_id,
|
||||||
|
ST_INT timeOut);
|
||||||
|
extern ST_RET write_mod_stval(chnl_usr_t *chnl_usr,
|
||||||
|
ST_CHAR *domName,
|
||||||
|
ST_INT timeOut);
|
||||||
|
|
||||||
|
extern ST_RET mms_conclude_disconnect(MVL_NET_INFO *net_info, ST_INT timeOut);
|
||||||
|
|
||||||
|
extern int BuildResetDomName(ied_usr_t *ied_usr, char *domName, size_t domNameSize);
|
||||||
|
|
||||||
extern pt61850app_t *g_pt61850app;
|
extern pt61850app_t *g_pt61850app;
|
||||||
|
|
||||||
|
extern RPT_TYPEIDS g_rpt_typeids;
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -153,6 +173,9 @@ extern std::string G_LOG_KEY;//key
|
|||||||
extern std::string G_MQCONSUMER_TOPIC_FILE;//topie_file
|
extern std::string G_MQCONSUMER_TOPIC_FILE;//topie_file
|
||||||
extern std::string G_MQCONSUMER_TAG_FILE;//tag
|
extern std::string G_MQCONSUMER_TAG_FILE;//tag
|
||||||
extern std::string G_MQCONSUMER_KEY_FILE;//key
|
extern std::string G_MQCONSUMER_KEY_FILE;//key
|
||||||
|
extern std::string G_REPLY_TOPIC_FILE;//topie_file
|
||||||
|
extern std::string G_REPLY_TAG_FILE;//tag
|
||||||
|
extern std::string G_REPLY_KEY_FILE;//key
|
||||||
extern std::string Topic_Reply_Topic;
|
extern std::string Topic_Reply_Topic;
|
||||||
extern std::string Topic_Reply_Tag;
|
extern std::string Topic_Reply_Tag;
|
||||||
extern std::string Topic_Reply_Key;
|
extern std::string Topic_Reply_Key;
|
||||||
@@ -311,6 +334,7 @@ void add_stat_kafka_json_log(char* log_str)
|
|||||||
/*新增rocketmq发送数据lnk10-10*/
|
/*新增rocketmq发送数据lnk10-10*/
|
||||||
void my_rocketmq_send(Ckafka_data_t& data)
|
void my_rocketmq_send(Ckafka_data_t& data)
|
||||||
{
|
{
|
||||||
|
try{
|
||||||
static std::string topic;
|
static std::string topic;
|
||||||
static std::string cfg_His_tp;
|
static std::string cfg_His_tp;
|
||||||
static std::string cfg_PLT_tp;
|
static std::string cfg_PLT_tp;
|
||||||
@@ -371,6 +395,23 @@ void my_rocketmq_send(Ckafka_data_t& data)
|
|||||||
//rocketmq_producer_send(const_cast<char*>(senddata.c_str()),const_cast<char*>(topic.c_str()));
|
//rocketmq_producer_send(const_cast<char*>(senddata.c_str()),const_cast<char*>(topic.c_str()));
|
||||||
rocketmq_producer_send(senddata, topic,FRONT_INST,key);//lnk20250623修复偶发性doublefree
|
rocketmq_producer_send(senddata, topic,FRONT_INST,key);//lnk20250623修复偶发性doublefree
|
||||||
}
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
std::cout << "[MQ][EXCEPTION] "
|
||||||
|
<< e.what()
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_MQ,
|
||||||
|
"mq发送异常:%s", e.what());
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
std::cout << "[MQ][UNKNOWN_EXCEPTION]" << std::endl;
|
||||||
|
|
||||||
|
DIY_ERRORLOG_CODE("process",0,LOG_CODE_MQ,
|
||||||
|
"mq发送未知异常");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
void my_kafka_send(Ckafka_data_t& data)
|
void my_kafka_send(Ckafka_data_t& data)
|
||||||
@@ -1858,18 +1899,25 @@ int parse_control(const std::string& json_str, const std::string& output_dir) {
|
|||||||
static int ParseFileDirReq(const char *body, file_dir_req_t *req)
|
static int ParseFileDirReq(const char *body, file_dir_req_t *req)
|
||||||
{
|
{
|
||||||
if (body == NULL || req == NULL)
|
if (body == NULL || req == NULL)
|
||||||
|
{
|
||||||
|
std::cout << "[ParseFileDirReq] body invalid" << std::endl;
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cJSON *root = cJSON_Parse(body);
|
cJSON *root = cJSON_Parse(body);
|
||||||
if (root == NULL)
|
if (root == NULL)
|
||||||
|
{
|
||||||
|
std::cout << "[ParseFileDirReq] parse json failed" << std::endl;
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cJSON *guid = cJSON_GetObjectItem(root, "guid");
|
cJSON *guid = cJSON_GetObjectItem(root, "guid");
|
||||||
cJSON *frontid = cJSON_GetObjectItem(root, "frontid");
|
cJSON *frontid = cJSON_GetObjectItem(root, "nodeId");
|
||||||
cJSON *processNo = cJSON_GetObjectItem(root, "ProcessNo");
|
cJSON *processNo = cJSON_GetObjectItem(root, "processNo");
|
||||||
cJSON *devid = cJSON_GetObjectItem(root, "devid");
|
cJSON *devid = cJSON_GetObjectItem(root, "devId");
|
||||||
cJSON *type = cJSON_GetObjectItem(root, "type");
|
cJSON *type = cJSON_GetObjectItem(root, "type");
|
||||||
cJSON *path = cJSON_GetObjectItem(root, "Path");
|
cJSON *path = cJSON_GetObjectItem(root, "path");
|
||||||
|
cJSON *remotepath = cJSON_GetObjectItem(root, "remotePath");
|
||||||
|
|
||||||
if (!guid || guid->type != cJSON_String ||
|
if (!guid || guid->type != cJSON_String ||
|
||||||
!frontid || frontid->type != cJSON_String ||
|
!frontid || frontid->type != cJSON_String ||
|
||||||
@@ -1878,17 +1926,41 @@ static int ParseFileDirReq(const char *body, file_dir_req_t *req)
|
|||||||
!type || type->type != cJSON_Number ||
|
!type || type->type != cJSON_Number ||
|
||||||
!path || path->type != cJSON_String)
|
!path || path->type != cJSON_String)
|
||||||
{
|
{
|
||||||
|
std::cout << "[ParseFileDirReq] invalid"
|
||||||
|
<< ", guid=" << (guid ? guid->type : -1)
|
||||||
|
<< ", nodeId=" << (frontid ? frontid->type : -1)
|
||||||
|
<< ", processNo=" << (processNo ? processNo->type : -1)
|
||||||
|
<< ", devId=" << (devid ? devid->type : -1)
|
||||||
|
<< ", type=" << (type ? type->type : -1)
|
||||||
|
<< ", path=" << (path ? path->type : -1)
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(req, 0, sizeof(file_dir_req_t));
|
memset(req, 0, sizeof(file_dir_req_t));
|
||||||
|
|
||||||
snprintf(req->guid, sizeof(req->guid), "%s", guid->valuestring);
|
snprintf(req->guid, sizeof(req->guid), "%s", guid->valuestring);
|
||||||
snprintf(req->frontid, sizeof(req->frontid), "%s", frontid->valuestring);
|
snprintf(req->frontid, sizeof(req->frontid), "%s", frontid->valuestring);
|
||||||
req->processNo = processNo->valueint;
|
req->processNo = processNo->valueint;
|
||||||
snprintf(req->devid, sizeof(req->devid), "%s", devid->valuestring);
|
snprintf(req->devid, sizeof(req->devid), "%s", devid->valuestring);
|
||||||
req->type = type->valueint;
|
req->type = type->valueint;
|
||||||
snprintf(req->path, sizeof(req->path), "%s", path->valuestring);
|
snprintf(req->path, sizeof(req->path), "%s", path->valuestring);
|
||||||
|
|
||||||
|
// remotePath 可选
|
||||||
|
if (remotepath && remotepath->type == cJSON_String && remotepath->valuestring)
|
||||||
|
{
|
||||||
|
snprintf(req->remote_path,
|
||||||
|
sizeof(req->remote_path),
|
||||||
|
"%s",
|
||||||
|
remotepath->valuestring);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
req->remote_path[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
req->create_time = time(NULL);
|
req->create_time = time(NULL);
|
||||||
|
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
@@ -1935,33 +2007,36 @@ static file_dir_req_t* PopMatchedFileDirReq(const char *terminal_id)
|
|||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string BuildFileDirRespJsonEx(const file_dir_req_t *req,
|
static std::string BuildFileDirRespJsonEx(const file_dir_req_t *req, //文件请求的基本信息
|
||||||
char **names,
|
char **names, //文件或目录的名称列表
|
||||||
const char **itemTypes,
|
const char **itemTypes, //文件或目录的类型列表(如 "file" 或 "dir")
|
||||||
int *itemSizes,
|
int *itemSizes, //文件的大小列表(如果是目录,可以设置为0或1)
|
||||||
int itemNum,
|
int itemNum, //文件或目录的数量
|
||||||
int result)
|
int result) //操作结果,0表示成功,非0表示失败
|
||||||
{
|
{
|
||||||
cJSON *root = cJSON_CreateObject();
|
cJSON *root = cJSON_CreateObject();
|
||||||
|
cJSON *detail = cJSON_CreateObject();
|
||||||
cJSON *dirInfo = cJSON_CreateArray();
|
cJSON *dirInfo = cJSON_CreateArray();
|
||||||
|
|
||||||
cJSON_AddStringToObject(root, "guid", req ? req->guid : "");
|
cJSON_AddStringToObject(root, "guid", req ? req->guid : ""); //请求的唯一标识符
|
||||||
cJSON_AddStringToObject(root, "frontid", req ? req->frontid : "");
|
cJSON_AddStringToObject(root, "nodeId", req ? req->frontid : ""); //请求发送方的前置机ID
|
||||||
cJSON_AddNumberToObject(root, "processNo", req ? req->processNo : 0);
|
cJSON_AddNumberToObject(root, "processNo", req ? req->processNo : 0);//请求发送方的进程号
|
||||||
cJSON_AddStringToObject(root, "devid", req ? req->devid : "");
|
cJSON_AddStringToObject(root, "devId", req ? req->devid : ""); //请求发送方的设备ID
|
||||||
cJSON_AddNumberToObject(root, "type", req ? req->type : 0);
|
cJSON_AddNumberToObject(root, "type", req ? req->type : 0); //请求类型,如0表示文件列表请求,1表示文件下载请求
|
||||||
|
cJSON_AddNumberToObject(root, "result", result); //操作结果
|
||||||
|
|
||||||
for (int i = 0; i < itemNum; ++i)
|
for (int i = 0; i < itemNum; ++i)
|
||||||
{
|
{
|
||||||
cJSON *item = cJSON_CreateObject();
|
cJSON *item = cJSON_CreateObject();
|
||||||
cJSON_AddStringToObject(item, "name", (names && names[i]) ? names[i] : "");
|
cJSON_AddStringToObject(item, "name", (names && names[i]) ? names[i] : ""); //文件或目录的名称,下载文件这里响应远端文件路径,上传文件这里响应上传后的目录列表
|
||||||
cJSON_AddStringToObject(item, "type", (itemTypes && itemTypes[i]) ? itemTypes[i] : "file");
|
cJSON_AddStringToObject(item, "type", (itemTypes && itemTypes[i]) ? itemTypes[i] : "file");//文件或目录的类型,默认为 "file"
|
||||||
cJSON_AddNumberToObject(item, "size", (itemSizes ? itemSizes[i] : 1));
|
cJSON_AddNumberToObject(item, "size", itemSizes ? itemSizes[i] : 1);//文件的大小,如果是目录,可以设置为0或1
|
||||||
cJSON_AddItemToArray(dirInfo, item);
|
cJSON_AddItemToArray(dirInfo, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON_AddItemToObject(root, "dirInfo", dirInfo);
|
cJSON_AddItemToObject(detail, "dirInfo", dirInfo);
|
||||||
cJSON_AddNumberToObject(root, "result", result);
|
|
||||||
|
cJSON_AddItemToObject(root, "detail", detail);
|
||||||
|
|
||||||
char *json = cJSON_PrintUnformatted(root);
|
char *json = cJSON_PrintUnformatted(root);
|
||||||
std::string jsonStr = json ? json : "";
|
std::string jsonStr = json ? json : "";
|
||||||
@@ -1984,14 +2059,39 @@ static std::string BuildFileDirRespJson(const file_dir_req_t *req,
|
|||||||
|
|
||||||
for (int i = 0; i < filenum; ++i)
|
for (int i = 0; i < filenum; ++i)
|
||||||
{
|
{
|
||||||
types[i] = "dir";
|
|
||||||
sizes[i] = 1;
|
sizes[i] = 1;
|
||||||
|
|
||||||
|
if (filenames[i] != NULL)
|
||||||
|
{
|
||||||
|
int len = strlen(filenames[i]);
|
||||||
|
|
||||||
|
// 以 / 结尾 -> dir
|
||||||
|
if (len > 0 && filenames[i][len - 1] == '/')
|
||||||
|
{
|
||||||
|
types[i] = "dir";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
types[i] = "file";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
types[i] = "file";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string jsonStr = BuildFileDirRespJsonEx(req, filenames, types, sizes, filenum, result);
|
std::string jsonStr =
|
||||||
|
BuildFileDirRespJsonEx(req,
|
||||||
|
filenames,
|
||||||
|
types,
|
||||||
|
sizes,
|
||||||
|
filenum,
|
||||||
|
result);
|
||||||
|
|
||||||
delete [] types;
|
delete [] types;
|
||||||
delete [] sizes;
|
delete [] sizes;
|
||||||
|
|
||||||
return jsonStr;
|
return jsonStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2007,7 +2107,7 @@ static std::string BuildSingleFileRespJson(const file_dir_req_t *req,
|
|||||||
|
|
||||||
if (name == NULL || result != 0)
|
if (name == NULL || result != 0)
|
||||||
{
|
{
|
||||||
return BuildFileDirRespJsonEx(req, NULL, NULL, NULL, 0, result);
|
return BuildFileDirRespJsonEx(req, NULL, NULL, NULL, 0, result);//异常响应-1
|
||||||
}
|
}
|
||||||
|
|
||||||
names[0] = (char *)name;
|
names[0] = (char *)name;
|
||||||
@@ -2104,6 +2204,43 @@ static void SafePathName(const char* src, char* dst, size_t dstSize)
|
|||||||
dst[j] = '\0';
|
dst[j] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void trim_inplace(char *s)
|
||||||
|
{
|
||||||
|
if (!s) return;
|
||||||
|
|
||||||
|
char *p = s;
|
||||||
|
while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') {
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p != s) {
|
||||||
|
memmove(s, p, strlen(p) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int len = strlen(s);
|
||||||
|
while (len > 0 &&
|
||||||
|
(s[len - 1] == ' ' ||
|
||||||
|
s[len - 1] == '\t' ||
|
||||||
|
s[len - 1] == '\r' ||
|
||||||
|
s[len - 1] == '\n')) {
|
||||||
|
s[len - 1] = '\0';
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string get_parent_dir(const char* fullpath)
|
||||||
|
{
|
||||||
|
if (fullpath == NULL) return "/";
|
||||||
|
|
||||||
|
std::string s(fullpath);
|
||||||
|
size_t pos = s.find_last_of('/');
|
||||||
|
|
||||||
|
if (pos == std::string::npos) return "/";
|
||||||
|
if (pos == 0) return "/";
|
||||||
|
|
||||||
|
return s.substr(0, pos + 1);
|
||||||
|
}
|
||||||
|
|
||||||
static int BuildTempLocalPath(char* outPath,
|
static int BuildTempLocalPath(char* outPath,
|
||||||
size_t outSize,
|
size_t outSize,
|
||||||
chnl_usr_t* chnl_usr,
|
chnl_usr_t* chnl_usr,
|
||||||
@@ -2114,7 +2251,7 @@ static int BuildTempLocalPath(char* outPath,
|
|||||||
|
|
||||||
const char* fileName = GetFileNameOnly(remotePath);
|
const char* fileName = GetFileNameOnly(remotePath);
|
||||||
if (fileName == NULL || fileName[0] == '\0')
|
if (fileName == NULL || fileName[0] == '\0')
|
||||||
fileName = "tmp_file.dat";
|
fileName = "tmp_file";
|
||||||
|
|
||||||
const char* ipStr = chnl_usr->ip_str;
|
const char* ipStr = chnl_usr->ip_str;
|
||||||
if (ipStr == NULL || ipStr[0] == '\0')
|
if (ipStr == NULL || ipStr[0] == '\0')
|
||||||
@@ -2124,7 +2261,7 @@ static int BuildTempLocalPath(char* outPath,
|
|||||||
SafePathName(ipStr, safeIp, sizeof(safeIp));
|
SafePathName(ipStr, safeIp, sizeof(safeIp));
|
||||||
|
|
||||||
char dirPath[512] = {0};
|
char dirPath[512] = {0};
|
||||||
snprintf(dirPath, sizeof(dirPath), "/tmp/%s", safeIp);
|
snprintf(dirPath, sizeof(dirPath), "/FeProject/dat/filetodevice/%s", safeIp);
|
||||||
|
|
||||||
/* 目录不存在则创建 */
|
/* 目录不存在则创建 */
|
||||||
if (MakeDirRecursive(dirPath) != 0)
|
if (MakeDirRecursive(dirPath) != 0)
|
||||||
@@ -2133,7 +2270,15 @@ static int BuildTempLocalPath(char* outPath,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(outPath, outSize, "%s/%s", dirPath, fileName);
|
int n = snprintf(outPath, outSize, "%s/%s", dirPath, fileName);
|
||||||
|
if (n < 0 || (size_t)n >= outSize)
|
||||||
|
{
|
||||||
|
printf("BuildTempLocalPath path too long, outSize=%zu, dir=%s, fileName=%s\n",
|
||||||
|
outSize, dirPath, fileName);
|
||||||
|
outPath[0] = '\0';
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2147,7 +2292,7 @@ static int HandleTypeDownloadAndUpload(chnl_usr_t* chnl_usr,
|
|||||||
char localpath[512] = {0};
|
char localpath[512] = {0};
|
||||||
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->path) != 0)
|
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->path) != 0)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE("process",0, LOG_CODE_TRANSIENT_COMM,
|
DIY_ERRORLOG_CODE("process",0, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
||||||
req->devid, req->path);
|
req->devid, req->path);
|
||||||
|
|
||||||
@@ -2155,6 +2300,12 @@ static int HandleTypeDownloadAndUpload(chnl_usr_t* chnl_usr,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trim_inplace(req->path);
|
||||||
|
trim_inplace(localpath);
|
||||||
|
|
||||||
|
std::cout << "[FILE][GET] localpath=[" << localpath
|
||||||
|
<< "], remote=[" << req->path << "]" << std::endl;
|
||||||
|
|
||||||
ST_RET ret = mms_getFile(chnl_usr->net_info,
|
ST_RET ret = mms_getFile(chnl_usr->net_info,
|
||||||
(ST_CHAR*)localpath,
|
(ST_CHAR*)localpath,
|
||||||
(ST_CHAR*)req->path,
|
(ST_CHAR*)req->path,
|
||||||
@@ -2162,11 +2313,11 @@ static int HandleTypeDownloadAndUpload(chnl_usr_t* chnl_usr,
|
|||||||
|
|
||||||
if (ret != SD_SUCCESS)
|
if (ret != SD_SUCCESS)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE("process",0, LOG_CODE_TRANSIENT_COMM,
|
DIY_ERRORLOG_CODE("process",0, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】装置文件下载失败 devid=%s, rem=%s, ret=0x%X",
|
"【ERROR】装置文件下载失败 devid=%s, rem=%s, ret=0x%X",
|
||||||
req->devid, req->path, ret);
|
req->devid, req->path, ret);
|
||||||
|
|
||||||
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, ret);
|
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2175,13 +2326,48 @@ static int HandleTypeDownloadAndUpload(chnl_usr_t* chnl_usr,
|
|||||||
req->devid, req->path, localpath);
|
req->devid, req->path, localpath);
|
||||||
|
|
||||||
char wavepath[512] = {0};
|
char wavepath[512] = {0};
|
||||||
SendFileWeb(WEB_FILEUPLOAD, localpath, req->path, wavepath);
|
// 拼接上传路径
|
||||||
|
char upload_path[1024] = {0};
|
||||||
|
|
||||||
|
snprintf(upload_path,
|
||||||
|
sizeof(upload_path),
|
||||||
|
"/upload/%s%s",
|
||||||
|
req->devid,
|
||||||
|
req->path);
|
||||||
|
|
||||||
|
std::string cloud_dir = get_parent_dir(upload_path);
|
||||||
|
|
||||||
|
std::cout << "[FILE][UPLOAD]"
|
||||||
|
<< " local=[" << localpath << "]"
|
||||||
|
<< ", remoteFile=[" << upload_path << "]"
|
||||||
|
<< ", cloudDir=[" << cloud_dir << "]"
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
|
SendFileWeb(WEB_FILEUPLOAD, localpath, cloud_dir.c_str(), wavepath,0);
|
||||||
|
|
||||||
|
// 上传失败
|
||||||
|
if (wavepath[0] == 0)
|
||||||
|
{
|
||||||
|
std::cout << "[FILEUPLOAD] upload failed, wavepath empty" << std::endl;
|
||||||
|
|
||||||
jsonString = BuildSingleFileRespJson(req,
|
jsonString = BuildSingleFileRespJson(req,
|
||||||
(wavepath[0] != 0 ? wavepath : req->path),
|
"",
|
||||||
"file",
|
"file",
|
||||||
1,
|
1,
|
||||||
0);
|
-1); // 失败
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "[FILEUPLOAD] upload success, wavepath="
|
||||||
|
<< wavepath << std::endl;
|
||||||
|
|
||||||
|
jsonString = BuildSingleFileRespJson(req,
|
||||||
|
wavepath,
|
||||||
|
"file",
|
||||||
|
1,
|
||||||
|
0); // 成功
|
||||||
|
}
|
||||||
|
|
||||||
remove(localpath);
|
remove(localpath);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2195,23 +2381,23 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
if (chnl_usr == NULL || req == NULL || chnl_usr->net_info == NULL)
|
if (chnl_usr == NULL || req == NULL || chnl_usr->net_info == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
char localpath[512] = {0};
|
char localpath[1024] = {0};
|
||||||
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->path) != 0)
|
if (BuildTempLocalPath(localpath, sizeof(localpath), chnl_usr, req->remote_path) != 0)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
"【ERROR】构造本地临时路径失败 devid=%s path=%s",
|
||||||
req->devid, req->path);
|
req->devid, req->remote_path);
|
||||||
|
|
||||||
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dlRet = DownloadFileWeb(WEB_FILEDOWNLOAD, req->path, localpath);
|
int dlRet = DownloadFileWeb(WEB_FILEDOWNLOAD, req->remote_path, localpath);
|
||||||
if (dlRet != 0)
|
if (dlRet != 0)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】Web 文件下载失败 devid=%s, path=%s",
|
"【ERROR】Web 文件下载失败 devid=%s, path=%s",
|
||||||
req->devid, req->path);
|
req->devid, req->remote_path);
|
||||||
|
|
||||||
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -2219,34 +2405,29 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
|
|
||||||
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】Web 文件下载成功 devid=%s, webpath=%s, local=%s",
|
"【NORMAL】Web 文件下载成功 devid=%s, webpath=%s, local=%s",
|
||||||
req->devid, req->path, localpath);
|
req->devid, req->remote_path, localpath);
|
||||||
|
|
||||||
char destfilename[512] = {0};
|
|
||||||
const char* fileName = GetFileNameOnly(req->path);
|
|
||||||
snprintf(destfilename, sizeof(destfilename), "/etc/%s",
|
|
||||||
(fileName && fileName[0]) ? fileName : "tmp_file.dat");
|
|
||||||
|
|
||||||
ST_RET ret = mms_mvla_obtfile(chnl_usr->net_info,
|
ST_RET ret = mms_mvla_obtfile(chnl_usr->net_info,
|
||||||
(ST_CHAR*)localpath,
|
(ST_CHAR*)localpath, //本地路径
|
||||||
(ST_CHAR*)destfilename,
|
(ST_CHAR*)req->path, //装置路径
|
||||||
3 * g_pt61850app->mmsOpTimeout);
|
3 * g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
if (ret != SD_SUCCESS)
|
if (ret != SD_SUCCESS)
|
||||||
{
|
{
|
||||||
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
DIY_ERRORLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【ERROR】文件传送到装置失败 devid=%s, src=%s, dest=%s, ret=0x%X",
|
"【ERROR】文件传送到装置失败 devid=%s, src=%s, dest=%s, ret=0x%X",
|
||||||
req->devid, localpath, destfilename, ret);
|
req->devid, localpath, req->path, ret);
|
||||||
|
|
||||||
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, ret);
|
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】文件传送到装置成功 devid=%s, src=%s, dest=%s",
|
"【NORMAL】文件传送到装置成功 devid=%s, src=%s, dest=%s",
|
||||||
req->devid, localpath, destfilename);
|
req->devid, localpath, req->path);
|
||||||
|
|
||||||
jsonString = BuildSingleFileRespJson(req,
|
jsonString = BuildSingleFileRespJson(req,
|
||||||
destfilename,
|
req->path,
|
||||||
"file",
|
"file",
|
||||||
1,
|
1,
|
||||||
0);
|
0);
|
||||||
@@ -2255,22 +2436,255 @@ static int HandleTypeTransferToDevice(chnl_usr_t* chnl_usr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////删除
|
||||||
|
static int HandleDeleteFileInDevice(chnl_usr_t* chnl_usr,
|
||||||
|
file_dir_req_t* req,
|
||||||
|
std::string& jsonString)
|
||||||
|
{
|
||||||
|
if (chnl_usr == NULL || req == NULL || chnl_usr->net_info == NULL)
|
||||||
|
{
|
||||||
|
if (req)
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req->path[0] == '\0')
|
||||||
|
{
|
||||||
|
DIY_ERRORLOG_CODE(req->devid, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【ERROR】删除装置文件失败,path为空 devid=%s",
|
||||||
|
req->devid);
|
||||||
|
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ST_RET ret = mms_mvla_fdelete(chnl_usr->net_info,
|
||||||
|
(ST_CHAR*)req->path,
|
||||||
|
3 * g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
if (ret != SD_SUCCESS)
|
||||||
|
{
|
||||||
|
DIY_ERRORLOG_CODE(req->devid, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【ERROR】删除装置文件失败 devid=%s, path=%s, ret=0x%X",
|
||||||
|
req->devid, req->path, ret);
|
||||||
|
|
||||||
|
jsonString = BuildSingleFileRespJson(req, req->path, "file", 1, -1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DIY_INFOLOG_CODE(req->devid, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【NORMAL】删除装置文件成功 devid=%s, path=%s",
|
||||||
|
req->devid, req->path);
|
||||||
|
|
||||||
|
jsonString = BuildSingleFileRespJson(req,
|
||||||
|
req->path,
|
||||||
|
"file",
|
||||||
|
1,
|
||||||
|
0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============================================================================
|
||||||
|
TYPE ID DUMP
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
[TYPE] id=0 name=RTYP_BOOL size=1 num_rt=1
|
||||||
|
[TYPE] id=1 name=RTYP_BTIME6 size=8 num_rt=1
|
||||||
|
[TYPE] id=2 name=RTYP_BSTR6 size=1 num_rt=1
|
||||||
|
[TYPE] id=3 name=RTYP_BSTR8 size=1 num_rt=1
|
||||||
|
[TYPE] id=4 name=RTYP_BSTR9 size=2 num_rt=1
|
||||||
|
[TYPE] id=5 name=RTYP_BVSTR6 size=3 num_rt=1
|
||||||
|
[TYPE] id=6 name=RTYP_BVSTR8 size=3 num_rt=1
|
||||||
|
[TYPE] id=7 name=RTYP_BVSTR10 size=4 num_rt=1
|
||||||
|
[TYPE] id=8 name=RTYP_INT8U size=1 num_rt=1
|
||||||
|
[TYPE] id=9 name=RTYP_INT16U size=2 num_rt=1
|
||||||
|
[TYPE] id=10 name=RTYP_OSTR8 size=8 num_rt=1
|
||||||
|
[TYPE] id=11 name=RTYP_VSTR32 size=33 num_rt=1
|
||||||
|
[TYPE] id=12 name=RTYP_VSTR65 size=66 num_rt=1
|
||||||
|
[TYPE] id=13 name=RTYP_INT32U size=4 num_rt=1
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
自定义/业务类型
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
[TYPE] id=14 name=I16 size=2 num_rt=1
|
||||||
|
[TYPE] id=15 name=U32 size=4 num_rt=1
|
||||||
|
[TYPE] id=16 name=UTF8VSTRING13 size=28 num_rt=1
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
复杂结构体类型
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
[TYPE] id=17 name=phv_type size=312 num_rt=152
|
||||||
|
[TYPE] id=18 name=phsx_type size=52 num_rt=25
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
LEDRs Oper 动态创建结果
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
例如:
|
||||||
|
[CTRL_INIT] success dom=PQPQLD0 type_id=19*/
|
||||||
|
/////////////////////////////控制类消息处理
|
||||||
|
|
||||||
|
|
||||||
|
static int HandleTypeControlDevice(chnl_usr_t *chnl_usr,
|
||||||
|
ied_usr_t *ied_usr,
|
||||||
|
file_dir_req_t *req,
|
||||||
|
std::string &jsonString)
|
||||||
|
{
|
||||||
|
if (chnl_usr == NULL || chnl_usr->net_info == NULL ||
|
||||||
|
ied_usr == NULL || req == NULL)
|
||||||
|
{
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "control", 1, -1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char domName[256] = {0};
|
||||||
|
BuildResetDomName(ied_usr, domName, sizeof(domName));
|
||||||
|
|
||||||
|
const char *controlName = NULL;
|
||||||
|
ST_INT operTypeId = -1;
|
||||||
|
ST_RET ret = SD_FAILURE;
|
||||||
|
|
||||||
|
if (strcmp(req->path, "return") == 0)
|
||||||
|
{
|
||||||
|
controlName = "CO$LEDRs$Oper";
|
||||||
|
operTypeId = ied_usr->oper_type_cache.ledrs_oper_type_id;
|
||||||
|
|
||||||
|
if (ied_usr->oper_type_cache.inited != SD_TRUE || operTypeId < 0)
|
||||||
|
{
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "control", 1, -1);
|
||||||
|
DIY_ERRORLOG_CODE(req->devid, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【ERROR】控制操作失败,LEDRs Oper type_id 未初始化 terminal_id=%s type_id=%d",
|
||||||
|
req->devid, operTypeId);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("[CONTROL] before write_common_oper control=%s type_id=%d\n",
|
||||||
|
controlName, operTypeId);
|
||||||
|
|
||||||
|
ret = write_common_oper(chnl_usr,
|
||||||
|
domName,
|
||||||
|
controlName,
|
||||||
|
operTypeId,
|
||||||
|
g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
printf("[CONTROL] after write_common_oper control=%s ret=0x%X\n",
|
||||||
|
controlName, ret);
|
||||||
|
}
|
||||||
|
else if (strcmp(req->path, "reboot") == 0)
|
||||||
|
{
|
||||||
|
controlName = "CO$Reboot$Oper";
|
||||||
|
operTypeId = ied_usr->oper_type_cache.reboot_oper_type_id;
|
||||||
|
|
||||||
|
if (ied_usr->oper_type_cache.inited != SD_TRUE || operTypeId < 0)
|
||||||
|
{
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "control", 1, -1);
|
||||||
|
DIY_ERRORLOG_CODE(req->devid, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【ERROR】控制操作失败,Reboot Oper type_id 未初始化 terminal_id=%s type_id=%d",
|
||||||
|
req->devid, operTypeId);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("[CONTROL] before write_common_oper control=%s type_id=%d\n",
|
||||||
|
controlName, operTypeId);
|
||||||
|
|
||||||
|
ret = write_common_oper(chnl_usr,
|
||||||
|
domName,
|
||||||
|
controlName,
|
||||||
|
operTypeId,
|
||||||
|
g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
printf("[CONTROL] after write_common_oper control=%s ret=0x%X\n",
|
||||||
|
controlName, ret);
|
||||||
|
}
|
||||||
|
else if (strcmp(req->path, "reset") == 0)
|
||||||
|
{
|
||||||
|
controlName = "ST$Mod$stVal";
|
||||||
|
|
||||||
|
printf("[CONTROL] before write_mod_stval control=%s\n", controlName);
|
||||||
|
|
||||||
|
ret = write_mod_stval(chnl_usr,
|
||||||
|
domName,
|
||||||
|
g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
printf("[CONTROL] after write_mod_stval ret=0x%X\n", ret);
|
||||||
|
|
||||||
|
if (ret == SD_SUCCESS)
|
||||||
|
{
|
||||||
|
ST_RET discRet = mms_conclude_disconnect(chnl_usr->net_info,
|
||||||
|
g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
printf("[CONTROL] disconnect after reset ret=0x%X\n", discRet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("[CONTROL] unknown path=%s\n", req->path);
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "control", 1, -1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == SD_SUCCESS)
|
||||||
|
{
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "control", 1, 0);
|
||||||
|
DIY_WARNLOG_CODE(req->devid, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【WARN】控制操作成功 terminal_id=%s path=%s", req->devid, req->path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonString = BuildSingleFileRespJson(req, NULL, "control", 1, -1);
|
||||||
|
DIY_ERRORLOG_CODE(req->devid, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【ERROR】控制操作失败 terminal_id=%s path=%s ret=0x%X",
|
||||||
|
req->devid, req->path, ret);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr)
|
void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr)
|
||||||
{
|
{
|
||||||
if (chnl_usr == NULL || chnl_usr->chnl == NULL || chnl_usr->chnl->ied == NULL)
|
if (chnl_usr == NULL) {
|
||||||
|
std::cout << "[FILEDIR] chnl_usr is NULL" << std::endl;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chnl_usr->chnl == NULL) {
|
||||||
|
std::cout << "[FILEDIR] chnl is NULL" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chnl_usr->chnl->ied == NULL) {
|
||||||
|
std::cout << "[FILEDIR] ied is NULL" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ied_t *ied = chnl_usr->chnl->ied;
|
ied_t *ied = chnl_usr->chnl->ied;
|
||||||
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
||||||
if (ied_usr == NULL)
|
if (ied_usr == NULL) {
|
||||||
|
std::cout << "[FILEDIR] ied_usr is NULL" << std::endl;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (ied_usr->terminal_id[0] == 0)
|
if (ied_usr->terminal_id[0] == 0) {
|
||||||
|
std::cout << "[FILEDIR] terminal_id empty" << std::endl;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DEBUGOPEN)std::cout << "[FILEDIR] checking req for terminal_id="
|
||||||
|
<< ied_usr->terminal_id << std::endl;
|
||||||
|
|
||||||
file_dir_req_t *req = PopMatchedFileDirReq(ied_usr->terminal_id);
|
file_dir_req_t *req = PopMatchedFileDirReq(ied_usr->terminal_id);
|
||||||
if (req == NULL)
|
if (req == NULL) {
|
||||||
return; // 当前连接没有文件请求
|
if(DEBUGOPEN)std::cout << "[FILEDIR] no matched request, terminal_id="
|
||||||
|
<< ied_usr->terminal_id << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "[FILEDIR] matched request success, terminal_id="
|
||||||
|
<< ied_usr->terminal_id
|
||||||
|
<< ", guid=" << req->guid
|
||||||
|
<< std::endl;
|
||||||
|
|
||||||
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
DIY_INFOLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【NORMAL】处理文件请求 terminal_id=%s type=%d path=%s",
|
"【NORMAL】处理文件请求 terminal_id=%s type=%d path=%s",
|
||||||
@@ -2313,20 +2727,30 @@ void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr)
|
|||||||
/* Web 下载到本地,再传送到装置 /etc */
|
/* Web 下载到本地,再传送到装置 /etc */
|
||||||
handleRet = HandleTypeTransferToDevice(chnl_usr, req, jsonString);
|
handleRet = HandleTypeTransferToDevice(chnl_usr, req, jsonString);
|
||||||
}
|
}
|
||||||
|
else if (req->type == 3){
|
||||||
|
/* 删除文件 */
|
||||||
|
handleRet = HandleDeleteFileInDevice(chnl_usr, req, jsonString);
|
||||||
|
}
|
||||||
|
else if (req->type == 4){ //复位
|
||||||
|
handleRet = HandleTypeControlDevice(chnl_usr,
|
||||||
|
ied_usr,
|
||||||
|
req,
|
||||||
|
jsonString);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DIY_WARNLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
DIY_WARNLOG_CODE(req->devid,1, LOG_CODE_FILE_CONTROL,
|
||||||
"【WARN】未知文件请求类型 type=%d devid=%s path=%s",
|
"【WARN】未知文件请求类型 type=%d devid=%s path=%s",
|
||||||
req->type, req->devid, req->path);
|
req->type, req->devid, req->path);
|
||||||
|
|
||||||
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, 1);//1是失败
|
jsonString = BuildSingleFileRespJson(req, NULL, "file", 1, -1);//-1是失败
|
||||||
handleRet = -1;
|
handleRet = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 统一回 Kafka */
|
/* 统一回 Kafka */
|
||||||
Ckafka_data_t dir_info;
|
Ckafka_data_t dir_info;
|
||||||
dir_info.strTopic = QString::fromStdString(Topic_Reply_Topic);
|
dir_info.strTopic = QString::fromStdString(G_REPLY_TOPIC_FILE);
|
||||||
dir_info.mp_id = QString::fromLocal8Bit(req->guid);
|
dir_info.mp_id = QString::fromLocal8Bit(req->devid);
|
||||||
dir_info.strText = QString::fromStdString(jsonString);
|
dir_info.strText = QString::fromStdString(jsonString);
|
||||||
|
|
||||||
kafka_data_list_mutex.lock();
|
kafka_data_list_mutex.lock();
|
||||||
@@ -2789,14 +3213,35 @@ ConsumeStatus myMessageCallbackfile(
|
|||||||
return rocketmq::RECONSUME_LATER;
|
return rocketmq::RECONSUME_LATER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cJSON* outer = cJSON_Parse(body.c_str());
|
||||||
|
if (!outer) {
|
||||||
|
std::cerr << "parse outer json failed" << std::endl;
|
||||||
|
return rocketmq::RECONSUME_LATER;
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON* messageBody = cJSON_GetObjectItem(outer, "messageBody");
|
||||||
|
|
||||||
|
if (!messageBody ||
|
||||||
|
messageBody->type != cJSON_String ||
|
||||||
|
messageBody->valuestring == NULL)
|
||||||
|
{
|
||||||
|
std::cerr << "messageBody invalid" << std::endl;
|
||||||
|
cJSON_Delete(outer);
|
||||||
|
return rocketmq::RECONSUME_LATER;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string realBody = messageBody->valuestring;
|
||||||
|
|
||||||
|
cJSON_Delete(outer);
|
||||||
|
|
||||||
DIY_INFOLOG_CODE("process",0,LOG_CODE_FILE_CONTROL,"【NORMAL】前置消费topic:%s_%s的文件控制消息",
|
DIY_INFOLOG_CODE("process",0,LOG_CODE_FILE_CONTROL,"【NORMAL】前置消费topic:%s_%s的文件控制消息",
|
||||||
FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_FILE.c_str());
|
FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_FILE.c_str());
|
||||||
|
|
||||||
std::cout << "file Callback received message: " << body << std::endl;
|
std::cout << "file Callback received message: " << realBody << std::endl;
|
||||||
std::cout << "Message Key: " << (key.empty() ? "N/A" : key) << std::endl;
|
std::cout << "Message Key: " << (key.empty() ? "N/A" : key) << std::endl;
|
||||||
|
|
||||||
file_dir_req_t req;
|
file_dir_req_t req;
|
||||||
if (ParseFileDirReq(body.c_str(), &req) != 0)
|
if (ParseFileDirReq(realBody.c_str(), &req) != 0)
|
||||||
{
|
{
|
||||||
DIY_WARNLOG_CODE(req.devid,1,LOG_CODE_FILE_CONTROL,"【WARN】文件控制消息解析失败: %s", body);
|
DIY_WARNLOG_CODE(req.devid,1,LOG_CODE_FILE_CONTROL,"【WARN】文件控制消息解析失败: %s", body);
|
||||||
//return E_RECONSUME_LATER;
|
//return E_RECONSUME_LATER;
|
||||||
|
|||||||
@@ -113,12 +113,12 @@ extern LOG_TLS int g_log_code_tls; // 声明为 TLS 变量,定义见 log4.cpp
|
|||||||
int __old_code__ = g_log_code_tls; \
|
int __old_code__ = g_log_code_tls; \
|
||||||
g_log_code_tls = (int)(CODE_INT); \
|
g_log_code_tls = (int)(CODE_INT); \
|
||||||
\
|
\
|
||||||
char __msg_buf__[256]; \
|
char __msg_buf__[512]; \
|
||||||
format_log_msg(__msg_buf__, sizeof(__msg_buf__), __VA_ARGS__); \
|
format_log_msg(__msg_buf__, sizeof(__msg_buf__), __VA_ARGS__); \
|
||||||
\
|
\
|
||||||
const char* __key_raw__ = (KEY); \
|
const char* __key_raw__ = (KEY); \
|
||||||
\
|
\
|
||||||
char __key_buf__[256]; \
|
char __key_buf__[512]; \
|
||||||
switch ((int)(KEY_TYPE)) { \
|
switch ((int)(KEY_TYPE)) { \
|
||||||
case 0: \
|
case 0: \
|
||||||
snprintf(__key_buf__, sizeof(__key_buf__), "process"); \
|
snprintf(__key_buf__, sizeof(__key_buf__), "process"); \
|
||||||
|
|||||||
@@ -165,6 +165,7 @@ typedef struct {
|
|||||||
char TypeOfData[64];
|
char TypeOfData[64];
|
||||||
char ValueOfTimeUnit[64];
|
char ValueOfTimeUnit[64];
|
||||||
char WaveTimeFlag[64];
|
char WaveTimeFlag[64];
|
||||||
|
char IEDControl[64];
|
||||||
char IEDname[64];
|
char IEDname[64];
|
||||||
char LDevicePrefix[64];
|
char LDevicePrefix[64];
|
||||||
} XmlConfigC;
|
} XmlConfigC;
|
||||||
@@ -183,6 +184,8 @@ typedef struct file_dir_req_t
|
|||||||
char devid[128];
|
char devid[128];
|
||||||
int type;
|
int type;
|
||||||
char path[256];
|
char path[256];
|
||||||
|
char remote_path[256];
|
||||||
|
|
||||||
time_t create_time;
|
time_t create_time;
|
||||||
} file_dir_req_t;
|
} file_dir_req_t;
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ extern apr_pool_t* g_cfg_pool;
|
|||||||
extern apr_pool_t* g_init_pool;
|
extern apr_pool_t* g_init_pool;
|
||||||
|
|
||||||
extern int g_DevFlag; //日志配置中读取的参数,暂无特定使用lnk20250121
|
extern int g_DevFlag; //日志配置中读取的参数,暂无特定使用lnk20250121
|
||||||
|
extern bool DEBUGOPEN;//调试开关,控制是否输出调试日志,默认关闭
|
||||||
extern int IED_COUNT;
|
extern int IED_COUNT;
|
||||||
extern int RECALL_ONLY_FLAG; //lnk20260309添加一个全局变量,标志是否只运行补招程序
|
extern int RECALL_ONLY_FLAG; //lnk20260309添加一个全局变量,标志是否只运行补招程序
|
||||||
|
|
||||||
@@ -132,9 +132,24 @@ void CloseIECReports(chnl_usr_t *chnl_usr)
|
|||||||
ied_usr = GET_IEDEXT_ADDR(ied);
|
ied_usr = GET_IEDEXT_ADDR(ied);
|
||||||
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
|
|
||||||
|
//添加保护lnk20260602
|
||||||
|
if (LD_info->cpuno == 0 ||
|
||||||
|
LD_info->LD_name == NULL ||
|
||||||
|
LD_info->rptcount <= 0 ||
|
||||||
|
LD_info->rptinfo == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
||||||
char rpt_inst_name[65];
|
char rpt_inst_name[65];
|
||||||
rptinfo = LD_info->rptinfo[rpt_no];
|
rptinfo = LD_info->rptinfo[rpt_no];
|
||||||
|
|
||||||
|
//添加保护lnk20260602
|
||||||
|
if (rptinfo == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
if ( !rptinfo->rpt_registered )
|
if ( !rptinfo->rpt_registered )
|
||||||
continue;
|
continue;
|
||||||
if ( rptinfo->chnl_id != chnl_usr->chnl_id)
|
if ( rptinfo->chnl_id != chnl_usr->chnl_id)
|
||||||
@@ -260,6 +275,18 @@ void IECReport_tryGI(chnl_usr_t *chnl_usr,rptinfo_t *rptinfo)
|
|||||||
//增加处理根据稳态,或暂态功能等,决定 报告是否需要注册、取消注册或 不做任何处理
|
//增加处理根据稳态,或暂态功能等,决定 报告是否需要注册、取消注册或 不做任何处理
|
||||||
int judge_rpt_next_should_do(rptinfo_t *rptinfo)
|
int judge_rpt_next_should_do(rptinfo_t *rptinfo)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (rptinfo == NULL) {
|
||||||
|
printf("[RPT][ERROR] rptinfo is NULL\n");
|
||||||
|
return SHOULD_DO_NOTHING;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rptinfo->LD_info == NULL) {
|
||||||
|
printf("[RPT][ERROR] rptinfo->LD_info is NULL, rptID=%s\n",
|
||||||
|
rptinfo->rptID ? rptinfo->rptID : "NULL");
|
||||||
|
return SHOULD_DO_NOTHING;
|
||||||
|
}
|
||||||
|
|
||||||
int should_register_state = 1; //各功能默认注册
|
int should_register_state = 1; //各功能默认注册
|
||||||
int is_real_report = (rptinfo->report_PQ_type & REPORT_TYPE_REAL);//报告控制中包含的类型
|
int is_real_report = (rptinfo->report_PQ_type & REPORT_TYPE_REAL);//报告控制中包含的类型
|
||||||
int is_soe_report = (rptinfo->report_PQ_type & REPORT_TYPE_SOE);
|
int is_soe_report = (rptinfo->report_PQ_type & REPORT_TYPE_SOE);
|
||||||
@@ -302,7 +329,23 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
{
|
{
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]); //遍历监测点
|
LD_info = &(ied_usr->LD_info[cpuno]); //遍历监测点
|
||||||
|
|
||||||
if (LD_info->cpuno==0){
|
//添加保护,防止台账中测点号不连续导致的崩溃
|
||||||
|
if (LD_info->cpuno == 0 ||
|
||||||
|
LD_info->LD_name == NULL ||
|
||||||
|
LD_info->rptcount <= 0 ||
|
||||||
|
LD_info->rptinfo == NULL)
|
||||||
|
{
|
||||||
|
printf("[RPT][SKIP] invalid LD_info cpu=%d cpuno=%d LD_name=%p rptcount=%d rptinfo=%p\n",
|
||||||
|
cpuno,
|
||||||
|
LD_info->cpuno,
|
||||||
|
LD_info->LD_name,
|
||||||
|
LD_info->rptcount,
|
||||||
|
LD_info->rptinfo);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//未初始化的测点告警没有意义,直接访问id还可能崩溃
|
||||||
|
/*if (LD_info->cpuno==0){
|
||||||
// 仅在还没达到5次上限时打印
|
// 仅在还没达到5次上限时打印
|
||||||
if (!LD_info->has_logged_regist) {
|
if (!LD_info->has_logged_regist) {
|
||||||
LD_info->registcount++;
|
LD_info->registcount++;
|
||||||
@@ -319,13 +362,39 @@ void ChannelCheckIECReports(chnl_usr_t *chnl_usr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
|
||||||
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) { //遍历报告(映射文件中读取的报告控制)
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) { //遍历报告(映射文件中读取的报告控制)
|
||||||
|
|
||||||
rptinfo = LD_info->rptinfo[rpt_no] ;
|
rptinfo = LD_info->rptinfo[rpt_no] ;
|
||||||
|
|
||||||
|
//检查是否需要注册或取消注册报告,或不做任何处理
|
||||||
|
printf("[RPT][CHECK] ip=%s cpu=%d rpt_no=%d rptcount=%d LD_name=%s rptinfo=%p\n",
|
||||||
|
chnl_usr->ip_str,
|
||||||
|
cpuno,
|
||||||
|
rpt_no,
|
||||||
|
LD_info->rptcount,
|
||||||
|
LD_info->LD_name ? LD_info->LD_name : "NULL",
|
||||||
|
rptinfo);
|
||||||
|
|
||||||
|
if (rptinfo == NULL) {
|
||||||
|
printf("[RPT][ERROR] rptinfo NULL, skip\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rptinfo->LD_info == NULL) {
|
||||||
|
printf("[RPT][ERROR] rptinfo->LD_info NULL, rptID=%s, skip\n",
|
||||||
|
rptinfo->rptID ? rptinfo->rptID : "NULL");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rptinfo->rptID == NULL || rptinfo->rptID[0] == '\0') {
|
||||||
|
printf("[RPT][ERROR] rptID empty, skip\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//添加保护
|
||||||
|
|
||||||
if (judge_rpt_next_should_do(rptinfo)==SHOULD_DO_NOTHING)//检查是否触发
|
if (judge_rpt_next_should_do(rptinfo)==SHOULD_DO_NOTHING)//检查是否触发
|
||||||
{
|
{
|
||||||
//DIY_DEBUGLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【DEBUG】监测点:%s - id:%s不注册报告", LD_info->name,LD_info->mp_id);
|
//DIY_DEBUGLOG_CODE(LD_info->mp_id,2,LOG_CODE_REPORT,"【DEBUG】监测点:%s - id:%s不注册报告", LD_info->name,LD_info->mp_id);
|
||||||
@@ -496,8 +565,17 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
|
|
||||||
|
//添加保护,防止台账中测点号不连续导致的崩溃
|
||||||
|
if (LD_info->cpuno == 0 ||
|
||||||
|
LD_info->LD_name == NULL ||
|
||||||
|
LD_info->logcount <= 0 ||
|
||||||
|
LD_info->loginfo == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
//日志控制块缺失
|
//日志控制块缺失
|
||||||
if (LD_info->logcount<=0){
|
/*if (LD_info->logcount<=0){
|
||||||
// 仅在还没达到5次上限时打印
|
// 仅在还没达到5次上限时打印
|
||||||
if (!LD_info->has_logged_regist) {
|
if (!LD_info->has_logged_regist) {
|
||||||
LD_info->registcount++;
|
LD_info->registcount++;
|
||||||
@@ -515,10 +593,14 @@ void ChannelCheckIECLogs(chnl_usr_t *chnl_usr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
loginfo = LD_info->loginfo[0] ;
|
loginfo = LD_info->loginfo[0] ;
|
||||||
|
|
||||||
|
//添加保护,防止台账中测点号不连续导致的崩溃
|
||||||
|
if (loginfo == NULL || loginfo->LD_info == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
apr_sleep(apr_time_from_sec(1) / 10);
|
apr_sleep(apr_time_from_sec(1) / 10);
|
||||||
|
|
||||||
Check_Recall_Config(LD_info->mp_id);//尝试获取xml结构
|
Check_Recall_Config(LD_info->mp_id);//尝试获取xml结构
|
||||||
@@ -1531,6 +1613,8 @@ void CheckAllConnectedChannel()
|
|||||||
if(chnl_usr->m_state == CHANNEL_CONNECTED)
|
if(chnl_usr->m_state == CHANNEL_CONNECTED)
|
||||||
{
|
{
|
||||||
if(g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {
|
if(g_node_id == THREE_SECS_DATA_BASE_NODE_ID) {
|
||||||
|
InitLedrsOperTypeForChannel(chnl_usr);//写特殊控制的初始化
|
||||||
|
if(DEBUGOPEN)printf("[FILEDIR] enter HandleFileDirReqForChannel");
|
||||||
HandleFileDirReqForChannel(chnl_usr);//文件目录请求
|
HandleFileDirReqForChannel(chnl_usr);//文件目录请求
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2065,6 +2149,8 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
printf(">>>>>>>> extract_timestamp_from_cfg_file success \n");
|
printf(">>>>>>>> extract_timestamp_from_cfg_file success \n");
|
||||||
qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //根据文件的触发时间查找检测点记录的匹配上的暂态事件
|
qvvr = find_qvvr_by_trig_tm(LD_info,trig_tm); //根据文件的触发时间查找检测点记录的匹配上的暂态事件
|
||||||
if (qvvr) {
|
if (qvvr) {
|
||||||
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【NORMAL】监测点:%s - id:%s波形文件匹配暂态事件成功", LD_info->name,LD_info->mp_id);
|
||||||
|
|
||||||
char* uuid_cfg = (char*)malloc(65 * sizeof(char));//上传文件后获取到的路径
|
char* uuid_cfg = (char*)malloc(65 * sizeof(char));//上传文件后获取到的路径
|
||||||
char* uuid_dat = (char*)malloc(65 * sizeof(char));
|
char* uuid_dat = (char*)malloc(65 * sizeof(char));
|
||||||
char* filename_cfg = (char*)malloc(100 * sizeof(char));//上传文件后获取到的文件名
|
char* filename_cfg = (char*)malloc(100 * sizeof(char));//上传文件后获取到的文件名
|
||||||
@@ -2290,6 +2376,9 @@ apr_status_t call_cn_wavelist(LD_info_t *LD_info )
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
DIY_INFOLOG_CODE(LD_info->mp_id,2,LOG_CODE_COMTRADE_FILE,"【INFO】监测点:%s - id:%s的录波文件没有任何暂态事件可以匹配,录波号段:%d", LD_info->name,LD_info->mp_id,LD_info->FltNum[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
493
mms/mmsclient.c
493
mms/mmsclient.c
@@ -80,6 +80,9 @@
|
|||||||
|
|
||||||
#include <ctype.h> //lnk20241119
|
#include <ctype.h> //lnk20241119
|
||||||
#include "../cfg_parse/custom_printf.h"//lnk20250225
|
#include "../cfg_parse/custom_printf.h"//lnk20250225
|
||||||
|
|
||||||
|
#include "../log4cplus/log4.h"
|
||||||
|
|
||||||
extern uint32_t g_node_id;
|
extern uint32_t g_node_id;
|
||||||
extern char subdir[128];
|
extern char subdir[128];
|
||||||
unsigned int g_no_auth = 0;
|
unsigned int g_no_auth = 0;
|
||||||
@@ -132,6 +135,8 @@ IDENT_RESP_INFO identify_response_info =
|
|||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
|
extern pt61850app_t *g_pt61850app;
|
||||||
|
|
||||||
extern TP0_CONN *tp0_conn_arr; /* ptr to array of "max_num_conns" structs */
|
extern TP0_CONN *tp0_conn_arr; /* ptr to array of "max_num_conns" structs */
|
||||||
|
|
||||||
static ST_VOID disc_ind_fun (MVL_NET_INFO *cc, ST_INT discType);
|
static ST_VOID disc_ind_fun (MVL_NET_INFO *cc, ST_INT discType);
|
||||||
@@ -269,12 +274,25 @@ MY_CONTROL_INFO my_control_info;
|
|||||||
ST_INT mms_var_type_id_create (MVL_NET_INFO *clientNetInfo, ST_INT scope,
|
ST_INT mms_var_type_id_create (MVL_NET_INFO *clientNetInfo, ST_INT scope,
|
||||||
ST_CHAR *dom_name, ST_CHAR *var_name, int iTimeOut)
|
ST_CHAR *dom_name, ST_CHAR *var_name, int iTimeOut)
|
||||||
{
|
{
|
||||||
MVL_REQ_PEND *reqCtrl;
|
//MVL_REQ_PEND *reqCtrl;
|
||||||
|
//reqCtrl 必须初始化为 NULL,防止 mvla_getvar 失败后释放野指针
|
||||||
|
MVL_REQ_PEND *reqCtrl = NULL;
|
||||||
|
|
||||||
GETVAR_REQ_INFO getvar_req;
|
GETVAR_REQ_INFO getvar_req;
|
||||||
ST_INT type_id = -1; /* start with invalid type id */
|
ST_INT type_id = -1; /* start with invalid type id */
|
||||||
ST_RET ret;
|
ST_RET ret;
|
||||||
|
|
||||||
|
//参数合法性检查
|
||||||
|
if (clientNetInfo == NULL || dom_name == NULL || var_name == NULL)
|
||||||
|
{
|
||||||
|
printf("[GETVAR] invalid arg netInfo=%p dom=%p var=%p\n",
|
||||||
|
clientNetInfo, dom_name, var_name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//结构体清零,避免未初始化字段导致异常
|
||||||
|
memset(&getvar_req, 0, sizeof(getvar_req));
|
||||||
|
|
||||||
/* Get the type of this "Oper" attribute & create type. */
|
/* Get the type of this "Oper" attribute & create type. */
|
||||||
/* Would be more efficient to do this just once before this function.*/
|
/* Would be more efficient to do this just once before this function.*/
|
||||||
getvar_req.req_tag = GETVAR_NAME;
|
getvar_req.req_tag = GETVAR_NAME;
|
||||||
@@ -284,18 +302,52 @@ ST_RET ret;
|
|||||||
getvar_req.name.domain_id= dom_name;
|
getvar_req.name.domain_id= dom_name;
|
||||||
getvar_req.name.obj_name.vmd_spec = var_name;
|
getvar_req.name.obj_name.vmd_spec = var_name;
|
||||||
|
|
||||||
|
//增加调试打印,确认崩溃点
|
||||||
|
printf("[GETVAR] start dom=%s var=%s\n", dom_name, var_name);
|
||||||
|
|
||||||
ret = mvla_getvar (clientNetInfo, &getvar_req, &reqCtrl);
|
ret = mvla_getvar (clientNetInfo, &getvar_req, &reqCtrl);
|
||||||
if (ret == SD_SUCCESS)
|
|
||||||
|
//打印 mvla_getvar 返回值和 reqCtrl
|
||||||
|
printf("[GETVAR] mvla_getvar ret=0x%X reqCtrl=%p\n", ret, reqCtrl);
|
||||||
|
|
||||||
|
if (ret == SD_SUCCESS){
|
||||||
ret = waitReqDone (reqCtrl, iTimeOut);
|
ret = waitReqDone (reqCtrl, iTimeOut);
|
||||||
if (ret != SD_SUCCESS)
|
//打印 waitReqDone 返回值
|
||||||
|
printf("[GETVAR] wait ret=0x%X\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != SD_SUCCESS){
|
||||||
echo_warn2 ("Error getting type of variable '%s' in domain '%s'\n", var_name, dom_name);
|
echo_warn2 ("Error getting type of variable '%s' in domain '%s'\n", var_name, dom_name);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Don't care about name so pass NULL. */
|
/* Don't care about name so pass NULL. */
|
||||||
type_id = mvl_type_id_create (NULL, reqCtrl->u.getvar.resp_info->type_spec.data,
|
//type_id = mvl_type_id_create (NULL, reqCtrl->u.getvar.resp_info->type_spec.data,
|
||||||
|
// reqCtrl->u.getvar.resp_info->type_spec.len);
|
||||||
|
//严格检查 resp_info/type_spec,避免空指针崩溃
|
||||||
|
if (ret == SD_SUCCESS &&
|
||||||
|
reqCtrl != NULL &&
|
||||||
|
reqCtrl->u.getvar.resp_info != NULL &&
|
||||||
|
reqCtrl->u.getvar.resp_info->type_spec.data != NULL &&
|
||||||
|
reqCtrl->u.getvar.resp_info->type_spec.len > 0)
|
||||||
|
{
|
||||||
|
type_id = mvl_type_id_create(
|
||||||
|
NULL,
|
||||||
|
reqCtrl->u.getvar.resp_info->type_spec.data,
|
||||||
|
reqCtrl->u.getvar.resp_info->type_spec.len);
|
||||||
|
|
||||||
|
printf("[GETVAR] create type_id=%d len=%d\n",
|
||||||
|
type_id,
|
||||||
reqCtrl->u.getvar.resp_info->type_spec.len);
|
reqCtrl->u.getvar.resp_info->type_spec.len);
|
||||||
}
|
}
|
||||||
mvl_free_req_ctrl (reqCtrl); /* Done with request struct */
|
else
|
||||||
|
{
|
||||||
|
printf("[GETVAR] failed dom=%s var=%s ret=0x%X\n",
|
||||||
|
dom_name, var_name, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//只有 reqCtrl 非空才释放
|
||||||
|
if (reqCtrl != NULL)mvl_free_req_ctrl (reqCtrl); /* Done with request struct */
|
||||||
return (type_id);
|
return (type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1683,20 +1735,20 @@ static ST_VOID *my_realloc_err (ST_VOID *old, ST_UINT size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//#define MAX_FILE_HANDLE_NUM (256)
|
#define MAX_FILE_HANDLE_NUM (256)
|
||||||
//static FILE *fp_arr[MAX_FILE_HANDLE_NUM];
|
static FILE *fp_arr[MAX_FILE_HANDLE_NUM];
|
||||||
//static ST_INT32 cur_handle = 0;
|
static ST_INT32 cur_handle = 0;
|
||||||
//ST_INT32 set_file_pointer( FILE *fp)
|
ST_INT32 set_file_pointer( FILE *fp)
|
||||||
//{
|
{
|
||||||
// ST_INT32 the_handle = cur_handle;
|
ST_INT32 the_handle = cur_handle;
|
||||||
// fp_arr[cur_handle++] = fp;
|
fp_arr[cur_handle++] = fp;
|
||||||
// cur_handle %= MAX_FILE_HANDLE_NUM;
|
cur_handle %= MAX_FILE_HANDLE_NUM;
|
||||||
// return the_handle;
|
return the_handle;
|
||||||
//}
|
}
|
||||||
//FILE* get_file_pointer(ST_INT32 handle)
|
FILE* get_file_pointer(ST_INT32 handle)
|
||||||
//{
|
{
|
||||||
// return fp_arr[handle];
|
return fp_arr[handle];
|
||||||
//}
|
}
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#if (MMS_FOPEN_EN & RESP_EN)
|
#if (MMS_FOPEN_EN & RESP_EN)
|
||||||
@@ -1705,39 +1757,39 @@ static ST_VOID *my_realloc_err (ST_VOID *old, ST_UINT size)
|
|||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
ST_VOID u_mvl_fopen_ind (MVL_IND_PEND *indCtrl)
|
ST_VOID u_mvl_fopen_ind (MVL_IND_PEND *indCtrl)
|
||||||
{
|
{
|
||||||
//FILE *fp;
|
FILE *fp;
|
||||||
//FOPEN_RESP_INFO resp_info;
|
FOPEN_RESP_INFO resp_info;
|
||||||
//struct stat stat_buf;
|
struct stat stat_buf;
|
||||||
|
|
||||||
//fp = fopen (indCtrl->u.fopen.filename, "rb"); /* CRITICAL: use "b" flag for binary transfer*/
|
fp = fopen (indCtrl->u.fopen.filename, "rb"); /* CRITICAL: use "b" flag for binary transfer*/
|
||||||
//if (fp == NULL)
|
if (fp == NULL)
|
||||||
// {
|
{
|
||||||
// _mplas_err_resp (indCtrl,11,6); /* File-access denied */
|
_mplas_err_resp (indCtrl,11,6); /* File-access denied */
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
//if (fseek (fp, indCtrl->u.fopen.init_pos, SEEK_SET))
|
if (fseek (fp, indCtrl->u.fopen.init_pos, SEEK_SET))
|
||||||
// {
|
{
|
||||||
// _mplas_err_resp (indCtrl,11,5); /* Position invalid */
|
_mplas_err_resp (indCtrl,11,5); /* Position invalid */
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
|
|
||||||
///* WARNING: this only works if (FILE *) is a 32-bit pointer. */
|
/* WARNING: this only works if (FILE *) is a 32-bit pointer. */
|
||||||
//resp_info.frsmid = set_file_pointer(fp); //(ST_INT32) fp;
|
resp_info.frsmid = set_file_pointer(fp); //(ST_INT32) fp;
|
||||||
|
|
||||||
//if (fstat (fileno (fp), &stat_buf))
|
if (fstat (fileno (fp), &stat_buf))
|
||||||
// { /* Can't get file size or time */
|
{ /* Can't get file size or time */
|
||||||
// _mplas_err_resp (indCtrl,11,0); /* File Problem, Other */
|
_mplas_err_resp (indCtrl,11,0); /* File Problem, Other */
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
//else
|
else
|
||||||
// {
|
{
|
||||||
// resp_info.ent.fsize = stat_buf.st_size;
|
resp_info.ent.fsize = stat_buf.st_size;
|
||||||
// resp_info.ent.mtimpres = SD_TRUE;
|
resp_info.ent.mtimpres = SD_TRUE;
|
||||||
// resp_info.ent.mtime = stat_buf.st_mtime;
|
resp_info.ent.mtime = stat_buf.st_mtime;
|
||||||
// }
|
}
|
||||||
|
|
||||||
//indCtrl->u.fopen.resp_info = &resp_info;
|
indCtrl->u.fopen.resp_info = &resp_info;
|
||||||
//mplas_fopen_resp (indCtrl);
|
mplas_fopen_resp (indCtrl);
|
||||||
}
|
}
|
||||||
#endif /* MMS_FOPEN_EN & RESP_EN */
|
#endif /* MMS_FOPEN_EN & RESP_EN */
|
||||||
|
|
||||||
@@ -1748,31 +1800,31 @@ ST_VOID u_mvl_fopen_ind (MVL_IND_PEND *indCtrl)
|
|||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
ST_VOID u_mvl_fread_ind (MVL_IND_PEND *indCtrl)
|
ST_VOID u_mvl_fread_ind (MVL_IND_PEND *indCtrl)
|
||||||
{
|
{
|
||||||
//FILE *fp;
|
FILE *fp;
|
||||||
//ST_UCHAR *tmp_buf;
|
ST_UCHAR *tmp_buf;
|
||||||
//MVLAS_FREAD_CTRL *fread_ctrl = &indCtrl->u.fread;
|
MVLAS_FREAD_CTRL *fread_ctrl = &indCtrl->u.fread;
|
||||||
//FREAD_RESP_INFO resp_info;
|
FREAD_RESP_INFO resp_info;
|
||||||
|
|
||||||
//fp = get_file_pointer(fread_ctrl->req_info->frsmid);// (FILE *) fread_ctrl->req_info->frsmid;
|
fp = get_file_pointer(fread_ctrl->req_info->frsmid);// (FILE *) fread_ctrl->req_info->frsmid;
|
||||||
///* Do NOT read more than "max_size". */
|
/* Do NOT read more than "max_size". */
|
||||||
//tmp_buf = (ST_UCHAR *) chk_malloc (fread_ctrl->max_size);
|
tmp_buf = (ST_UCHAR *) chk_malloc (fread_ctrl->max_size);
|
||||||
|
|
||||||
//resp_info.fd_len = fread (tmp_buf, 1, fread_ctrl->max_size, fp);
|
resp_info.fd_len = fread (tmp_buf, 1, fread_ctrl->max_size, fp);
|
||||||
//if (resp_info.fd_len == 0 && ferror (fp))
|
if (resp_info.fd_len == 0 && ferror (fp))
|
||||||
// {
|
{
|
||||||
// _mplas_err_resp (indCtrl, 3, 0);
|
_mplas_err_resp (indCtrl, 3, 0);
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
|
|
||||||
//resp_info.filedata = tmp_buf;
|
resp_info.filedata = tmp_buf;
|
||||||
//if (resp_info.fd_len == fread_ctrl->max_size)
|
if (resp_info.fd_len == fread_ctrl->max_size)
|
||||||
// resp_info.more_follows = SD_TRUE;
|
resp_info.more_follows = SD_TRUE;
|
||||||
//else
|
else
|
||||||
// resp_info.more_follows = SD_FALSE;
|
resp_info.more_follows = SD_FALSE;
|
||||||
|
|
||||||
//fread_ctrl->resp_info = &resp_info;
|
fread_ctrl->resp_info = &resp_info;
|
||||||
//mplas_fread_resp (indCtrl);
|
mplas_fread_resp (indCtrl);
|
||||||
//chk_free (tmp_buf); /* Temporary buffer */
|
chk_free (tmp_buf); /* Temporary buffer */
|
||||||
}
|
}
|
||||||
#endif /* #if (MMS_FREAD_EN & RESP_EN) */
|
#endif /* #if (MMS_FREAD_EN & RESP_EN) */
|
||||||
|
|
||||||
@@ -1782,15 +1834,15 @@ ST_VOID u_mvl_fread_ind (MVL_IND_PEND *indCtrl)
|
|||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
ST_VOID u_mvl_fclose_ind (MVL_IND_PEND *indCtrl)
|
ST_VOID u_mvl_fclose_ind (MVL_IND_PEND *indCtrl)
|
||||||
{
|
{
|
||||||
//FILE *fp;
|
FILE *fp;
|
||||||
//MVLAS_FCLOSE_CTRL *fclose_ctrl = &indCtrl->u.fclose;
|
MVLAS_FCLOSE_CTRL *fclose_ctrl = &indCtrl->u.fclose;
|
||||||
|
|
||||||
//fp = get_file_pointer(fclose_ctrl->req_info->frsmid);//(FILE *) fclose_ctrl->req_info->frsmid;
|
fp = get_file_pointer(fclose_ctrl->req_info->frsmid);//(FILE *) fclose_ctrl->req_info->frsmid;
|
||||||
|
|
||||||
//if (fclose (fp))
|
if (fclose (fp))
|
||||||
// _mplas_err_resp (indCtrl, 11, 0); /* File problem, other */
|
_mplas_err_resp (indCtrl, 11, 0); /* File problem, other */
|
||||||
//else
|
else
|
||||||
// mplas_fclose_resp (indCtrl);
|
mplas_fclose_resp (indCtrl);
|
||||||
}
|
}
|
||||||
#endif /* #if (MMS_FCLOSE_EN & RESP_EN) */
|
#endif /* #if (MMS_FCLOSE_EN & RESP_EN) */
|
||||||
|
|
||||||
@@ -1945,6 +1997,295 @@ MVL_REQ_PEND *reqCtrl;
|
|||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//lnk20260508添加重启装置函数
|
||||||
|
int BuildResetDomName(ied_usr_t *ied_usr, char *domName, size_t domNameSize)
|
||||||
|
{
|
||||||
|
if (ied_usr == NULL || domName == NULL || domNameSize == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
domName[0] = '\0';
|
||||||
|
|
||||||
|
XmlConfigC cfg1;
|
||||||
|
memset(&cfg1, 0, sizeof(cfg1));
|
||||||
|
|
||||||
|
if (get_xml_config_by_dev_type(ied_usr->dev_type, &cfg1))
|
||||||
|
{
|
||||||
|
printf("========== XmlConfigC dump ==========\n");
|
||||||
|
printf("IEDControl = '%s'\n", cfg1.IEDControl);
|
||||||
|
printf("IEDname = '%s'\n", cfg1.IEDname);
|
||||||
|
printf("LDevicePrefix = '%s'\n", cfg1.LDevicePrefix);
|
||||||
|
printf("=====================================\n");
|
||||||
|
|
||||||
|
if (cfg1.IEDControl[0] != '\0')
|
||||||
|
{
|
||||||
|
snprintf(domName, domNameSize, "%s", cfg1.IEDControl);
|
||||||
|
printf("[RESET] use cfg1.IEDControl=%s\n", domName);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ied_usr->LD_info && ied_usr->LD_info[0].LD_name)
|
||||||
|
{
|
||||||
|
snprintf(domName, domNameSize, "%s", ied_usr->LD_info[0].LD_name);
|
||||||
|
|
||||||
|
int len = strlen(domName);
|
||||||
|
if (len > 0 && isdigit(domName[len - 1]))
|
||||||
|
domName[len - 1] = '0';
|
||||||
|
|
||||||
|
printf("[RESET] use LD_name domName=%s\n", domName);
|
||||||
|
|
||||||
|
DIY_WARNLOG_CODE(ied_usr->terminal_id, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【WARN】未取到 IEDControl 信息,使用 LD_name=%s terminal_id=%s",
|
||||||
|
domName, ied_usr->terminal_id);
|
||||||
|
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(domName, domNameSize, "%s", "PQMonitorPQM0");
|
||||||
|
printf("[RESET] use default domName=%s\n", domName);
|
||||||
|
DIY_ERRORLOG_CODE(ied_usr->terminal_id, 1, LOG_CODE_FILE_CONTROL,
|
||||||
|
"【ERROR】未取到 LD 信息,使用默认 domName=%s terminal_id=%s",
|
||||||
|
domName, ied_usr->terminal_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ST_INT ledrs_var_type_create(MVL_NET_INFO* net_info,
|
||||||
|
OBJECT_NAME* varObj,
|
||||||
|
ST_INT timeOut)
|
||||||
|
{
|
||||||
|
MVL_REQ_PEND* reqCtrl;
|
||||||
|
GETVAR_REQ_INFO getvar_req;
|
||||||
|
VAR_ACC_TSPEC* type_spec;
|
||||||
|
ST_INT type_id = -1;
|
||||||
|
ST_RET ret;
|
||||||
|
|
||||||
|
memset(&getvar_req, 0, sizeof(getvar_req));
|
||||||
|
|
||||||
|
getvar_req.req_tag = GETVAR_NAME;
|
||||||
|
getvar_req.name = *varObj;
|
||||||
|
|
||||||
|
ret = mvla_getvar(net_info, &getvar_req, &reqCtrl);
|
||||||
|
|
||||||
|
if (ret == SD_SUCCESS)
|
||||||
|
ret = waitReqDone(reqCtrl, timeOut);
|
||||||
|
|
||||||
|
if (ret == SD_SUCCESS)
|
||||||
|
{
|
||||||
|
type_spec = &reqCtrl->u.getvar.resp_info->type_spec;
|
||||||
|
|
||||||
|
type_id = mvl_type_id_create(NULL,
|
||||||
|
type_spec->data,
|
||||||
|
type_spec->len);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reqCtrl)
|
||||||
|
mvl_free_req_ctrl(reqCtrl);
|
||||||
|
|
||||||
|
return type_id;
|
||||||
|
}
|
||||||
|
static ST_INT create_oper_type_id(MVL_NET_INFO *net_info,
|
||||||
|
ST_CHAR *domName,
|
||||||
|
const char *ctlName,
|
||||||
|
ST_INT timeOut)
|
||||||
|
{
|
||||||
|
OBJECT_NAME obj;
|
||||||
|
ST_CHAR varName[MAX_IDENT_LEN + 1];
|
||||||
|
|
||||||
|
if (net_info == NULL || domName == NULL || ctlName == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
memset(&obj, 0, sizeof(obj));
|
||||||
|
|
||||||
|
apr_snprintf(varName,
|
||||||
|
sizeof(varName),
|
||||||
|
"LLN0$%s",
|
||||||
|
ctlName);
|
||||||
|
|
||||||
|
obj.object_tag = DOM_SPEC;
|
||||||
|
obj.domain_id = domName;
|
||||||
|
obj.obj_name.vmd_spec = varName;
|
||||||
|
|
||||||
|
printf("[CTRL_INIT] create type dom=%s var=%s\n",
|
||||||
|
domName, varName);
|
||||||
|
|
||||||
|
return ledrs_var_type_create(net_info, &obj, timeOut);
|
||||||
|
}
|
||||||
|
void InitLedrsOperTypeForChannel(chnl_usr_t *chnl_usr)
|
||||||
|
{
|
||||||
|
printf("[CTRL_INIT] enter\n");
|
||||||
|
|
||||||
|
if (chnl_usr == NULL || chnl_usr->chnl == NULL ||
|
||||||
|
chnl_usr->chnl->ied == NULL || chnl_usr->net_info == NULL)
|
||||||
|
{
|
||||||
|
printf("[CTRL_INIT] invalid chnl_usr\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ied_t *ied = chnl_usr->chnl->ied;
|
||||||
|
ied_usr_t *ied_usr = GET_IEDEXT_ADDR(ied);
|
||||||
|
|
||||||
|
if (ied_usr == NULL || ied_usr->LD_info == NULL)
|
||||||
|
{
|
||||||
|
printf("[CTRL_INIT] invalid ied_usr or LD_info\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("[CTRL_INIT] current inited=%d ledrs=%d reboot=%d reset=%d\n",
|
||||||
|
(int)ied_usr->oper_type_cache.inited,
|
||||||
|
ied_usr->oper_type_cache.ledrs_oper_type_id,
|
||||||
|
ied_usr->oper_type_cache.reboot_oper_type_id,
|
||||||
|
ied_usr->oper_type_cache.reset_oper_type_id);
|
||||||
|
|
||||||
|
if (ied_usr->oper_type_cache.inited == SD_TRUE)
|
||||||
|
{
|
||||||
|
printf("[CTRL_INIT] already inited\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char domName[256] = {0};
|
||||||
|
|
||||||
|
BuildResetDomName(ied_usr,
|
||||||
|
domName,
|
||||||
|
sizeof(domName));
|
||||||
|
|
||||||
|
printf("[CTRL_INIT] final dom=%s\n", domName);
|
||||||
|
|
||||||
|
ied_usr->oper_type_cache.ledrs_oper_type_id =
|
||||||
|
create_oper_type_id(chnl_usr->net_info,
|
||||||
|
domName,
|
||||||
|
"CO$LEDRs$Oper",
|
||||||
|
g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
printf("[CTRL_INIT] LEDRs type_id=%d\n",
|
||||||
|
ied_usr->oper_type_cache.ledrs_oper_type_id);
|
||||||
|
|
||||||
|
ied_usr->oper_type_cache.reboot_oper_type_id =
|
||||||
|
create_oper_type_id(chnl_usr->net_info,
|
||||||
|
domName,
|
||||||
|
"CO$Reboot$Oper",
|
||||||
|
g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
printf("[CTRL_INIT] Reboot type_id=%d\n",
|
||||||
|
ied_usr->oper_type_cache.reboot_oper_type_id);
|
||||||
|
|
||||||
|
ied_usr->oper_type_cache.reset_oper_type_id =
|
||||||
|
create_oper_type_id(chnl_usr->net_info,
|
||||||
|
domName,
|
||||||
|
"ST$Mod$stVal",
|
||||||
|
g_pt61850app->mmsOpTimeout);
|
||||||
|
|
||||||
|
printf("[CTRL_INIT] Reset type_id=%d\n",
|
||||||
|
ied_usr->oper_type_cache.reset_oper_type_id);
|
||||||
|
|
||||||
|
/* 无论成功失败,都不再重复初始化 */
|
||||||
|
ied_usr->oper_type_cache.inited = SD_TRUE;
|
||||||
|
|
||||||
|
printf("[CTRL_INIT] finish inited=%d\n",
|
||||||
|
(int)ied_usr->oper_type_cache.inited);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ST_RET write_common_oper(chnl_usr_t *chnl_usr,
|
||||||
|
ST_CHAR *domName,
|
||||||
|
const char *ctlName,
|
||||||
|
ST_INT oper_type_id,
|
||||||
|
ST_INT timeOut)
|
||||||
|
{
|
||||||
|
if (chnl_usr == NULL ||
|
||||||
|
chnl_usr->net_info == NULL ||
|
||||||
|
domName == NULL ||
|
||||||
|
ctlName == NULL ||
|
||||||
|
oper_type_id < 0)
|
||||||
|
{
|
||||||
|
printf("[OPER_WRITE] invalid param\n");
|
||||||
|
return SD_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ST_CHAR varName[MAX_IDENT_LEN + 1];
|
||||||
|
apr_snprintf(varName,
|
||||||
|
sizeof(varName),
|
||||||
|
"LLN0$%s",
|
||||||
|
ctlName);
|
||||||
|
|
||||||
|
Control_Oper_t oper;
|
||||||
|
memset(&oper, 0, sizeof(oper));
|
||||||
|
|
||||||
|
oper.ctlVal = SD_TRUE;
|
||||||
|
oper.origin.orCat = 3;
|
||||||
|
oper.origin.orIdent.len = 0;
|
||||||
|
oper.ctlNum = 1;
|
||||||
|
u_get_current_utc_time(&oper.T);
|
||||||
|
oper.Test = SD_FALSE;
|
||||||
|
oper.Check[0] = 0x00;
|
||||||
|
oper.Check[1] = 0x00;
|
||||||
|
|
||||||
|
if ((int)sizeof(Control_Oper_t) !=
|
||||||
|
mvl_type_ctrl[oper_type_id].data_size)
|
||||||
|
{
|
||||||
|
printf("[OPER_WRITE] SIZE MISMATCH ctl=%s local=%d runtime=%d\n",
|
||||||
|
ctlName,
|
||||||
|
(int)sizeof(Control_Oper_t),
|
||||||
|
mvl_type_ctrl[oper_type_id].data_size);
|
||||||
|
return SD_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("[OPER_WRITE] dom=%s var=%s type_id=%d\n",
|
||||||
|
domName, varName, oper_type_id);
|
||||||
|
|
||||||
|
return mms_named_var_write(chnl_usr->net_info,
|
||||||
|
varName,
|
||||||
|
DOM_SPEC,
|
||||||
|
domName,
|
||||||
|
oper_type_id,
|
||||||
|
(ST_CHAR *)&oper,
|
||||||
|
timeOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
ST_RET mms_conclude_disconnect(MVL_NET_INFO *net_info, ST_INT timeOut)
|
||||||
|
{
|
||||||
|
MVL_REQ_PEND *reqCtrl = NULL;
|
||||||
|
ST_RET ret;
|
||||||
|
|
||||||
|
if (net_info == NULL)
|
||||||
|
return SD_FAILURE;
|
||||||
|
|
||||||
|
printf("[RESET] before mvl_concl\n");
|
||||||
|
|
||||||
|
ret = mvl_concl(net_info, &reqCtrl);
|
||||||
|
|
||||||
|
printf("[RESET] after mvl_concl ret=0x%X reqCtrl=%p\n",
|
||||||
|
ret, reqCtrl);
|
||||||
|
|
||||||
|
if (ret == SD_SUCCESS && reqCtrl != NULL)
|
||||||
|
{
|
||||||
|
ret = waitReqDone(reqCtrl, timeOut);
|
||||||
|
|
||||||
|
printf("[RESET] conclude wait ret=0x%X\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reqCtrl != NULL)
|
||||||
|
mvl_free_req_ctrl(reqCtrl);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ST_RET write_mod_stval(chnl_usr_t *chnl_usr,
|
||||||
|
ST_CHAR *domName,
|
||||||
|
ST_INT timeOut)
|
||||||
|
{
|
||||||
|
ST_CHAR varName[MAX_IDENT_LEN + 1];
|
||||||
|
ST_INT16 value = 88;
|
||||||
|
|
||||||
|
apr_snprintf(varName, sizeof(varName), "LLN0$ST$Mod$stVal");
|
||||||
|
|
||||||
|
return mms_named_var_write(chnl_usr->net_info,
|
||||||
|
varName,
|
||||||
|
DOM_SPEC,
|
||||||
|
domName,
|
||||||
|
14, //int
|
||||||
|
(ST_CHAR *)&value,
|
||||||
|
timeOut);
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
/* init_log_cfg */
|
/* init_log_cfg */
|
||||||
|
|||||||
@@ -135,6 +135,15 @@ int fill_rptctrl_by_cfg(LD_info_t* LD_info,int rptno,char *buf)
|
|||||||
|
|
||||||
assert( (rptno+1) <= LD_info->rptcount ) ;
|
assert( (rptno+1) <= LD_info->rptcount ) ;
|
||||||
rptinfo = LD_info->rptinfo[rptno];
|
rptinfo = LD_info->rptinfo[rptno];
|
||||||
|
|
||||||
|
|
||||||
|
if (rptinfo == NULL) {
|
||||||
|
printf("[RPT_INIT][ERROR] rptinfo NULL, rptno=%d\n", rptno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rptinfo->LD_info = LD_info;
|
||||||
|
|
||||||
if(!(str = strtok(buf,",")))
|
if(!(str = strtok(buf,",")))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@@ -262,6 +271,13 @@ int fill_logctrl_by_cfg(LD_info_t* LD_info,int logno,char *buf,char* devtype)
|
|||||||
assert( (logno+1) <= LD_info->logcount ) ;
|
assert( (logno+1) <= LD_info->logcount ) ;
|
||||||
loginfo = LD_info->loginfo[logno];
|
loginfo = LD_info->loginfo[logno];
|
||||||
|
|
||||||
|
if (loginfo == NULL) {
|
||||||
|
printf("[LOG_INIT][ERROR] loginfo NULL, logno=%d\n", logno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
loginfo->LD_info = LD_info;
|
||||||
|
|
||||||
if(!(str = strtok(buf,",")))
|
if(!(str = strtok(buf,",")))
|
||||||
return 1;
|
return 1;
|
||||||
tmp_str = apr_pstrdup(g_init_pool,str);
|
tmp_str = apr_pstrdup(g_init_pool,str);
|
||||||
|
|||||||
@@ -320,6 +320,17 @@ struct LD_info_t{
|
|||||||
//录波
|
//录波
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//装置控制初始化
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ST_BOOLEAN inited;
|
||||||
|
|
||||||
|
ST_INT ledrs_oper_type_id;
|
||||||
|
ST_INT reboot_oper_type_id;
|
||||||
|
ST_INT reset_oper_type_id;
|
||||||
|
|
||||||
|
} MMS_OPER_TYPE_CACHE;
|
||||||
|
|
||||||
struct ied_usr_t{
|
struct ied_usr_t{
|
||||||
LD_info_t *LD_info; /**< LD数组 */
|
LD_info_t *LD_info; /**< LD数组 */
|
||||||
int dev_idx; /**< 设备序号 */
|
int dev_idx; /**< 设备序号 */
|
||||||
@@ -346,6 +357,8 @@ struct ied_usr_t{
|
|||||||
|
|
||||||
bool lastconnectstat;//lnk20250704
|
bool lastconnectstat;//lnk20250704
|
||||||
bool has_logged_disconnect;//lnk20250704
|
bool has_logged_disconnect;//lnk20250704
|
||||||
|
|
||||||
|
MMS_OPER_TYPE_CACHE oper_type_cache;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -533,6 +546,35 @@ int parse_file_names_by_fltnum(int fltnum, char* domname, char** filenames, int
|
|||||||
QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info,long long trig_tm);
|
QVVR_t* find_qvvr_by_trig_tm(LD_info_t* LD_info,long long trig_tm);
|
||||||
|
|
||||||
void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr);
|
void HandleFileDirReqForChannel(chnl_usr_t *chnl_usr);
|
||||||
|
void InitLedrsOperTypeForChannel(chnl_usr_t *chnl_usr);
|
||||||
|
|
||||||
|
//lnk20250508添加重启装置函数
|
||||||
|
//根据抓包显示oper的data结构有6个item
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ST_BOOLEAN ctlVal;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ST_INT16 orCat;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ST_INT16 len;
|
||||||
|
ST_UINT8 data[64];
|
||||||
|
} orIdent;
|
||||||
|
|
||||||
|
} origin;
|
||||||
|
|
||||||
|
ST_UINT32 ctlNum;
|
||||||
|
|
||||||
|
MMS_UTC_TIME T;
|
||||||
|
|
||||||
|
ST_BOOLEAN Test;
|
||||||
|
|
||||||
|
ST_UCHAR Check[2];
|
||||||
|
|
||||||
|
} Control_Oper_t;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
@@ -145,12 +145,26 @@ RCB_INFO* FindRcbInfo(MVL_NET_INFO *net_info,ST_CHAR *dom_name, ST_CHAR *rcb_nam
|
|||||||
|
|
||||||
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
if (!LD_info->LD_name)
|
//if (!LD_info->LD_name)
|
||||||
|
// continue;
|
||||||
|
//添加保护lnk20260602
|
||||||
|
if (LD_info->cpuno == 0 ||
|
||||||
|
LD_info->LD_name == NULL ||
|
||||||
|
LD_info->rptcount <= 0 ||
|
||||||
|
LD_info->rptinfo == NULL)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ( strcmp(LD_info->LD_name,dom_name)!=0 )
|
if ( strcmp(LD_info->LD_name,dom_name)!=0 )
|
||||||
continue;
|
continue;
|
||||||
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
||||||
rptinfo = LD_info->rptinfo[rpt_no];
|
rptinfo = LD_info->rptinfo[rpt_no];
|
||||||
|
|
||||||
|
//添加保护lnk20260602
|
||||||
|
if (rptinfo == NULL || rptinfo->rptID == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
get_rpt_inst_name(rptinfo,rpt_inst_name);
|
get_rpt_inst_name(rptinfo,rpt_inst_name);
|
||||||
if ( strcmp(rpt_inst_name,rcb_name)==0 ) {
|
if ( strcmp(rpt_inst_name,rcb_name)==0 ) {
|
||||||
if (rptinfo->rpt_registered)
|
if (rptinfo->rpt_registered)
|
||||||
@@ -181,8 +195,22 @@ rptinfo_t* find_rptinfo_from_net_rpt_info_name(MVL_NET_INFO *net_info, RCB_INFO
|
|||||||
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
|
|
||||||
|
//添加保护lnk20260602
|
||||||
|
if (LD_info->cpuno == 0 ||
|
||||||
|
LD_info->LD_name == NULL ||
|
||||||
|
LD_info->rptcount <= 0 ||
|
||||||
|
LD_info->rptinfo == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
||||||
rptinfo = LD_info->rptinfo[rpt_no];
|
rptinfo = LD_info->rptinfo[rpt_no];
|
||||||
|
|
||||||
|
//添加保护lnk20260602
|
||||||
|
if (rptinfo == NULL || rptinfo->rptID == NULL || rcb_info == NULL || rcb_info->RptID == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
printf("%d rptinfo %s,rcbinfo %s ", rpt_no, rptinfo->rptID, rcb_info->RptID);
|
printf("%d rptinfo %s,rcbinfo %s ", rpt_no, rptinfo->rptID, rcb_info->RptID);
|
||||||
if (strcmp(rcb_info->RptID,rptinfo->rptID)==0)//WW 修改为匹配字符串
|
if (strcmp(rcb_info->RptID,rptinfo->rptID)==0)//WW 修改为匹配字符串
|
||||||
return rptinfo;
|
return rptinfo;
|
||||||
@@ -211,8 +239,21 @@ rptinfo_t* find_rptinfo_from_net_rcb_info(MVL_NET_INFO *net_info,RCB_INFO *rcb_i
|
|||||||
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
for(cpuno=0 ; cpuno<ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
|
|
||||||
|
//添加保护lnk20260602
|
||||||
|
if (LD_info->cpuno == 0 ||
|
||||||
|
LD_info->LD_name == NULL ||
|
||||||
|
LD_info->rptcount <= 0 ||
|
||||||
|
LD_info->rptinfo == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
for(rpt_no=0 ; rpt_no<LD_info->rptcount; rpt_no++) {
|
||||||
rptinfo = LD_info->rptinfo[rpt_no];
|
rptinfo = LD_info->rptinfo[rpt_no];
|
||||||
|
|
||||||
|
if (rptinfo == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (rcb_info==rptinfo->m_rcb_info)
|
if (rcb_info==rptinfo->m_rcb_info)
|
||||||
return rptinfo;
|
return rptinfo;
|
||||||
}
|
}
|
||||||
@@ -221,7 +262,7 @@ rptinfo_t* find_rptinfo_from_net_rcb_info(MVL_NET_INFO *net_info,RCB_INFO *rcb_i
|
|||||||
}
|
}
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
//WW 2023-08-29 注释 end
|
//WW 2023-08-29 注释 end
|
||||||
void get_rpt_inst_name(rptinfo_t *rptinfo, char * rpt_inst_name )
|
/*void get_rpt_inst_name(rptinfo_t *rptinfo, char * rpt_inst_name )
|
||||||
{
|
{
|
||||||
strcpy(rpt_inst_name,rptinfo->rptID);
|
strcpy(rpt_inst_name,rptinfo->rptID);
|
||||||
if (rptinfo->instanceNeedSuffix) {
|
if (rptinfo->instanceNeedSuffix) {
|
||||||
@@ -229,6 +270,55 @@ void get_rpt_inst_name(rptinfo_t *rptinfo, char * rpt_inst_name )
|
|||||||
apr_snprintf(rpt_suffix_str,sizeof(rpt_suffix_str),"%02d",rptinfo->m_curRptSuffix);
|
apr_snprintf(rpt_suffix_str,sizeof(rpt_suffix_str),"%02d",rptinfo->m_curRptSuffix);
|
||||||
strcat(rpt_inst_name,rpt_suffix_str);
|
strcat(rpt_inst_name,rpt_suffix_str);
|
||||||
}
|
}
|
||||||
|
} */
|
||||||
|
void get_rpt_inst_name(rptinfo_t *rptinfo, char *rpt_inst_name)
|
||||||
|
{
|
||||||
|
if (rpt_inst_name == NULL)
|
||||||
|
{
|
||||||
|
printf("get_rpt_inst_name: rpt_inst_name is NULL\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rpt_inst_name[0] = '\0';
|
||||||
|
|
||||||
|
if (rptinfo == NULL)
|
||||||
|
{
|
||||||
|
printf("get_rpt_inst_name: rptinfo is NULL\n");
|
||||||
|
strcpy(rpt_inst_name, "NULL_RPT");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rptinfo->rptID == NULL)
|
||||||
|
{
|
||||||
|
printf("get_rpt_inst_name: rptID is NULL\n");
|
||||||
|
strcpy(rpt_inst_name, "NULL_RPT");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("[RPT] rptinfo=%p rptID=%s suffix=%d needSuffix=%d\n",
|
||||||
|
rptinfo,
|
||||||
|
rptinfo->rptID,
|
||||||
|
rptinfo->m_curRptSuffix,
|
||||||
|
rptinfo->instanceNeedSuffix);
|
||||||
|
|
||||||
|
// 原代码
|
||||||
|
strncpy(rpt_inst_name, rptinfo->rptID, 64);
|
||||||
|
rpt_inst_name[64] = '\0';
|
||||||
|
|
||||||
|
if (rptinfo->instanceNeedSuffix)
|
||||||
|
{
|
||||||
|
char rpt_suffix_str[8] = {0};
|
||||||
|
|
||||||
|
apr_snprintf(rpt_suffix_str,
|
||||||
|
sizeof(rpt_suffix_str),
|
||||||
|
"%02d",
|
||||||
|
rptinfo->m_curRptSuffix);
|
||||||
|
|
||||||
|
// 防止越界
|
||||||
|
strncat(rpt_inst_name,
|
||||||
|
rpt_suffix_str,
|
||||||
|
64 - strlen(rpt_inst_name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -359,12 +449,20 @@ LD_info_t* find_LD_info_only_from_line_id(int line_id)
|
|||||||
|
|
||||||
LD_info_t* find_LD_info_from_mp_id(ied_t* ied, char* mp_id)
|
LD_info_t* find_LD_info_from_mp_id(ied_t* ied, char* mp_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (mp_id == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
LD_info_t* LD_info = NULL;
|
LD_info_t* LD_info = NULL;
|
||||||
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);
|
ied_usr_t* ied_usr = GET_IEDEXT_ADDR(ied);
|
||||||
int cpuno;
|
int cpuno;
|
||||||
|
|
||||||
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
|
for (cpuno = 0; cpuno < ied->cpucount; cpuno++) {
|
||||||
LD_info = &(ied_usr->LD_info[cpuno]);
|
LD_info = &(ied_usr->LD_info[cpuno]);
|
||||||
|
|
||||||
|
if (LD_info->cpuno == 0 || LD_info->LD_name == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (LD_info && strcmp(LD_info->mp_id, mp_id) == 0)
|
if (LD_info && strcmp(LD_info->mp_id, mp_id) == 0)
|
||||||
return LD_info;
|
return LD_info;
|
||||||
}
|
}
|
||||||
|
|||||||
28
mykafka.ini
28
mykafka.ini
@@ -74,7 +74,7 @@ FileFlag=4
|
|||||||
FrontInst=884d132ac3a01225fcacc8c10da07d09
|
FrontInst=884d132ac3a01225fcacc8c10da07d09
|
||||||
FrontIP=192.168.1.167
|
FrontIP=192.168.1.167
|
||||||
SendFlag=3
|
SendFlag=3
|
||||||
RecallOnlyFlag=
|
RecallOnlyFlag=0
|
||||||
|
|
||||||
[Ledger]
|
[Ledger]
|
||||||
TerminalStatus="[0]"
|
TerminalStatus="[0]"
|
||||||
@@ -117,37 +117,43 @@ WriteUrl=
|
|||||||
[RocketMq]
|
[RocketMq]
|
||||||
producer=Group_producer
|
producer=Group_producer
|
||||||
Ipport=192.168.1.68:9876
|
Ipport=192.168.1.68:9876
|
||||||
Topic=TEST_Topic
|
TESTTopic=TEST_Topic
|
||||||
Tag=Test_Tag
|
TESTTag=884d132ac3a01225fcacc8c10da07d09
|
||||||
Key=Test_Keys
|
TESTKey=Test_Keys
|
||||||
Queuenum=4
|
Queuenum=4
|
||||||
|
|
||||||
Testflag=1
|
Testflag=1
|
||||||
Testnum=100
|
Testnum=0
|
||||||
Testtype=1
|
Testtype=0
|
||||||
TestPort=11000
|
TestPort=11000
|
||||||
TestList=
|
TestList=
|
||||||
|
|
||||||
consumer=Group_consumer
|
consumer=Group_consumer
|
||||||
ConsumerIpport=192.168.1.68:9876
|
ConsumerIpport=192.168.1.68:9876
|
||||||
ConsumerTopicRT=ask_real_data_topic
|
ConsumerTopicRT=ask_real_data_topic
|
||||||
ConsumerTagRT=Test_Tag
|
ConsumerTagRT=884d132ac3a01225fcacc8c10da07d09
|
||||||
ConsumerKeyRT=Test_Keys
|
ConsumerKeyRT=Test_Keys
|
||||||
ConsumerAccessKey=rmqroot
|
ConsumerAccessKey=rmqroot
|
||||||
ConsumerSecretKey=001@#njcnmq
|
ConsumerSecretKey=001@#njcnmq
|
||||||
ConsumerChannel=
|
ConsumerChannel=
|
||||||
ConsumerTopicUD=control_Topic
|
ConsumerTopicUD=control_Topic
|
||||||
ConsumerTagUD=Test_Tag
|
ConsumerTagUD=884d132ac3a01225fcacc8c10da07d09
|
||||||
ConsumerKeyUD=Test_Keys
|
ConsumerKeyUD=Test_Keys
|
||||||
ConsumerTopicRC=recall_Topic
|
ConsumerTopicRC=recall_Topic
|
||||||
ConsumerTagRC=Test_Tag
|
ConsumerTagRC=884d132ac3a01225fcacc8c10da07d09
|
||||||
ConsumerKeyRC=Test_Keys
|
ConsumerKeyRC=Test_Keys
|
||||||
ConsumerTopicSET=process_Topic
|
ConsumerTopicSET=process_Topic
|
||||||
ConsumerTagSET=Test_Tag
|
ConsumerTagSET=884d132ac3a01225fcacc8c10da07d09
|
||||||
ConsumerKeySET=Test_Keys
|
ConsumerKeySET=Test_Keys
|
||||||
ConsumerTopicLOG=ask_log_Topic
|
ConsumerTopicLOG=ask_log_Topic
|
||||||
ConsumerTagLOG=Test_Tag
|
ConsumerTagLOG=884d132ac3a01225fcacc8c10da07d09
|
||||||
ConsumerKeyLOG=Test_Keys
|
ConsumerKeyLOG=Test_Keys
|
||||||
|
ConsumerTopicFILE=File_Topic
|
||||||
|
ConsumerTagFILE=884d132ac3a01225fcacc8c10da07d09
|
||||||
|
ConsumerKeyFILE=Test_Keys
|
||||||
|
|
||||||
|
ConsumerTopicTEST=File_Topic
|
||||||
|
|
||||||
LOGTopic=log_Topic
|
LOGTopic=log_Topic
|
||||||
LOGTag=Test_Tag
|
LOGTag=Test_Tag
|
||||||
LOGKey=Test_Keys
|
LOGKey=Test_Keys
|
||||||
|
|||||||
Reference in New Issue
Block a user