generate ledger to main thread
This commit is contained in:
@@ -31,6 +31,8 @@
|
|||||||
#include "tinyxml2.h"
|
#include "tinyxml2.h"
|
||||||
#include "rocketmq.h"
|
#include "rocketmq.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@@ -58,8 +60,6 @@ extern std::list<queue_data_t> queue_data_list; //queue发送数据链表
|
|||||||
|
|
||||||
extern int three_secs_enabled;
|
extern int three_secs_enabled;
|
||||||
|
|
||||||
extern std::vector<terminal_dev> terminal_devlist;
|
|
||||||
|
|
||||||
extern std::map<std::string, Xmldata*> xmlinfo_list;//保存所有型号对应的icd映射文件解析数据
|
extern std::map<std::string, Xmldata*> xmlinfo_list;//保存所有型号对应的icd映射文件解析数据
|
||||||
extern XmlConfig xmlcfg;//星形接线xml节点解析的数据-默认映射文件解析数据
|
extern XmlConfig xmlcfg;//星形接线xml节点解析的数据-默认映射文件解析数据
|
||||||
extern std::list<CTopic *> topicList; //队列发送主题链表
|
extern std::list<CTopic *> topicList; //队列发送主题链表
|
||||||
@@ -2686,15 +2686,15 @@ void to_json(nlohmann::json& j, const FullObj& f) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
std::string generate_json(
|
std::string generate_json(
|
||||||
int Mid,
|
int Mid, //需应答的报文订阅者收到后需以此ID应答,无需应答填入“-1”
|
||||||
int Did,
|
int Did, //设备唯一标识Ldid,填入0代表Ndid。
|
||||||
int Pri,
|
int Pri, //报文处理的优先级
|
||||||
int Type,
|
int Type, //消息类型
|
||||||
int Cldid,
|
int Cldid, //逻辑子设备ID,0-逻辑设备本身,无填-1
|
||||||
int DataType,
|
int DataType, //数据类型,0-表示以数据集方式上送
|
||||||
int DataAttr,
|
int DataAttr, //数据属性:无“0”、实时“1”、统计“2”等。
|
||||||
int DsNameIdx,
|
int DsNameIdx, //数据集序号(以数据集方式上送),无填-1
|
||||||
const std::vector<DataArrayItem>& dataArray //构造出array后调用这个函数
|
const std::vector<DataArrayItem>& dataArray //数据数组。
|
||||||
) {
|
) {
|
||||||
FullObj fobj;
|
FullObj fobj;
|
||||||
fobj.Mid = Mid;
|
fobj.Mid = Mid;
|
||||||
@@ -2712,7 +2712,11 @@ std::string generate_json(
|
|||||||
|
|
||||||
void upload_data_test(){
|
void upload_data_test(){
|
||||||
std::vector<DataArrayItem> arr;
|
std::vector<DataArrayItem> arr;
|
||||||
arr.push_back({1, 1725477660, 0, 1, "xxxx"});
|
arr.push_back({1, 1725477660, 0, 1, "xxxx"}); //数据属性 -1-无, 0-“Rt”,1-“Max”,2-“Min”,3-“Avg”,4-“Cp95”
|
||||||
|
//数据时标,相对1970年的秒,无效填入“-1”
|
||||||
|
//数据时标,微秒钟,无效填入“-1”
|
||||||
|
//数据标识,1-标识数据异常
|
||||||
|
//数据序列(数据集上送时将二进制数据流转换成Base64字符串,其他数据为object)
|
||||||
arr.push_back({2, 1691741340, 0, 1, "yyyy"});
|
arr.push_back({2, 1691741340, 0, 1, "yyyy"});
|
||||||
|
|
||||||
std::string js = generate_json(
|
std::string js = generate_json(
|
||||||
@@ -2728,3 +2732,34 @@ void upload_data_test(){
|
|||||||
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
||||||
queue_data_list.push_back(data);
|
queue_data_list.push_back(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////台账赋值给通信
|
||||||
|
|
||||||
|
std::vector<DeviceInfo> GenerateDeviceInfoFromLedger(const std::vector<terminal_dev>& terminal_devlist) {
|
||||||
|
std::vector<DeviceInfo> devices;
|
||||||
|
|
||||||
|
for (const auto& terminal : terminal_devlist) {
|
||||||
|
DeviceInfo device;
|
||||||
|
device.device_id = terminal.terminal_id;
|
||||||
|
device.name = terminal.terminal_name;
|
||||||
|
device.model = terminal.dev_series;
|
||||||
|
device.mac = terminal.mac;
|
||||||
|
|
||||||
|
for (const auto& monitor : terminal.line) {
|
||||||
|
PointInfo point;
|
||||||
|
point.point_id = monitor.monitor_id;
|
||||||
|
point.name = monitor.monitor_name;
|
||||||
|
point.device_id = terminal.terminal_id;
|
||||||
|
point.PT1 = monitor.PT1;
|
||||||
|
point.PT2 = monitor.PT2;
|
||||||
|
point.CT1 = monitor.CT1;
|
||||||
|
point.CT2 = monitor.CT2;
|
||||||
|
|
||||||
|
device.points.push_back(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
devices.push_back(device);
|
||||||
|
}
|
||||||
|
|
||||||
|
return devices;
|
||||||
|
}
|
||||||
@@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
#include "nlohmann/json.hpp"
|
#include "nlohmann/json.hpp"
|
||||||
|
|
||||||
|
#include "../../client2.h"
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class Front;
|
class Front;
|
||||||
@@ -308,6 +310,9 @@ int parse_model_cfg_web();
|
|||||||
void qvvr_test();
|
void qvvr_test();
|
||||||
void Fileupload_test();
|
void Fileupload_test();
|
||||||
|
|
||||||
|
extern std::vector<terminal_dev> terminal_devlist;
|
||||||
|
extern std::mutex ledgermtx;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////cfg_parse的函数声明
|
//////////////////////////////////////////////////////////////////////////////////cfg_parse的函数声明
|
||||||
|
|
||||||
void init_config();
|
void init_config();
|
||||||
@@ -403,6 +408,10 @@ void to_json(nlohmann::json& j, const FullObj& f);
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::vector<DeviceInfo> GenerateDeviceInfoFromLedger(const std::vector<terminal_dev>& terminal_devlist);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,15 +47,9 @@ extern int g_front_seg_index;
|
|||||||
extern std::string FRONT_INST;
|
extern std::string FRONT_INST;
|
||||||
extern std::string subdir;
|
extern std::string subdir;
|
||||||
|
|
||||||
//mq
|
|
||||||
extern std::mutex queue_data_list_mutex; //queue发送数据锁
|
|
||||||
extern std::list<queue_data_t> queue_data_list; //queue发送数据链表
|
|
||||||
|
|
||||||
//日志主题
|
//日志主题
|
||||||
extern std::string G_LOG_TOPIC;
|
extern std::string G_LOG_TOPIC;
|
||||||
|
|
||||||
extern std::vector<terminal_dev> terminal_devlist;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////辅助函数
|
////////////////////////////////////////////////////////辅助函数
|
||||||
std::string get_front_type_from_subdir() {
|
std::string get_front_type_from_subdir() {
|
||||||
if (subdir == "cfg_3s_data")
|
if (subdir == "cfg_3s_data")
|
||||||
|
|||||||
@@ -78,10 +78,6 @@ extern int TEST_PORT; //测试端口号
|
|||||||
|
|
||||||
extern std::string FRONT_INST;
|
extern std::string FRONT_INST;
|
||||||
|
|
||||||
extern std::mutex queue_data_list_mutex;
|
|
||||||
extern std::list<queue_data_t> queue_data_list;
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 功能函数
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 功能函数
|
||||||
|
|
||||||
template<typename T, typename... Args>
|
template<typename T, typename... Args>
|
||||||
|
|||||||
@@ -58,10 +58,6 @@ static rocketmq::RocketMQProducer* g_producer = nullptr; //生产者
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
//台账
|
|
||||||
extern std::mutex ledgermtx;
|
|
||||||
extern std::vector<terminal_dev> terminal_devlist;
|
|
||||||
|
|
||||||
//前置进程
|
//前置进程
|
||||||
extern unsigned int g_node_id;
|
extern unsigned int g_node_id;
|
||||||
extern int g_front_seg_index;
|
extern int g_front_seg_index;
|
||||||
@@ -1391,9 +1387,8 @@ bool shouldSkipTerminal(const std::string& terminal_id) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rocketmq_test_300(int mpnum, int front_index, int type,Front* front) {
|
void rocketmq_test_300(int mpnum, int front_index, int type, Front* front) {
|
||||||
|
if (!INITFLAG) {
|
||||||
if(!INITFLAG){
|
|
||||||
std::cout << "前置未初始化完成\n";
|
std::cout << "前置未初始化完成\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1451,41 +1446,34 @@ void rocketmq_test_300(int mpnum, int front_index, int type,Front* front) {
|
|||||||
|
|
||||||
data.mp_id = dev.line[j].monitor_id;
|
data.mp_id = dev.line[j].monitor_id;
|
||||||
data.monitor_no = static_cast<int>(i + j);
|
data.monitor_no = static_cast<int>(i + j);
|
||||||
std::string modified_time = std::to_string(current_time_ms);
|
std::string modified_time = std::to_string(current_time_ms / 1000);
|
||||||
|
|
||||||
std::string modified_strText = base_strText;
|
std::string modified_strText = base_strText;
|
||||||
|
try {
|
||||||
// 替换 Monitor
|
auto j = nlohmann::json::parse(modified_strText);
|
||||||
size_t monitor_pos = modified_strText.find("\"Monitor\"");
|
j["Did"] = i;
|
||||||
if (monitor_pos != std::string::npos) {
|
if (j.contains("Msg") && j["Msg"].is_object()) {
|
||||||
size_t colon_pos = modified_strText.find(":", monitor_pos);
|
j["Msg"]["Cldid"] = j;
|
||||||
size_t quote_pos = modified_strText.find("\"", colon_pos);
|
if (j["Msg"].contains("DataArray") && j["Msg"]["DataArray"].is_array()) {
|
||||||
size_t end_quote_pos = modified_strText.find("\"", quote_pos + 1);
|
for (auto& item : j["Msg"]["DataArray"]) {
|
||||||
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
|
if (item.is_object()) {
|
||||||
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, data.mp_id);
|
item["DataTimeSec"] = std::stoll(modified_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// 替换 TIME
|
|
||||||
size_t time_pos = modified_strText.find("\"TIME\"");
|
|
||||||
if (time_pos != std::string::npos) {
|
|
||||||
size_t colon_pos = modified_strText.find(":", time_pos);
|
|
||||||
size_t quote_pos = colon_pos;
|
|
||||||
size_t end_quote_pos = modified_strText.find(",", quote_pos + 1);
|
|
||||||
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
|
|
||||||
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, modified_time);
|
|
||||||
}
|
}
|
||||||
|
modified_strText = j.dump();
|
||||||
|
} catch (...) {
|
||||||
|
// 保持原始文本
|
||||||
}
|
}
|
||||||
|
|
||||||
data.strText = modified_strText;
|
data.strText = modified_strText;
|
||||||
//my_rocketmq_send(data,front->m_producer);
|
|
||||||
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
||||||
queue_data_list.push_back(data);
|
queue_data_list.push_back(data);
|
||||||
|
|
||||||
std::cout << "Sent message " << (i + 1)
|
std::cout << "Sent message " << (i + 1)
|
||||||
<< " with Monitor " << data.monitor_no
|
<< " with Monitor " << data.monitor_no
|
||||||
<< " and TIME " << modified_time << std::endl;
|
<< " and TIME " << modified_time << std::endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1493,43 +1481,36 @@ void rocketmq_test_300(int mpnum, int front_index, int type,Front* front) {
|
|||||||
|
|
||||||
for (int i = 0; (total_messages > 0 && g_front_seg_index == 1 && g_node_id == 100) && i < total_messages; ++i) {
|
for (int i = 0; (total_messages > 0 && g_front_seg_index == 1 && g_node_id == 100) && i < total_messages; ++i) {
|
||||||
std::string monitor_id = "testmonitor" + std::to_string(i);
|
std::string monitor_id = "testmonitor" + std::to_string(i);
|
||||||
|
|
||||||
data.mp_id = monitor_id;
|
data.mp_id = monitor_id;
|
||||||
data.monitor_no = i;
|
data.monitor_no = i;
|
||||||
std::string modified_time = std::to_string(current_time_ms);
|
std::string modified_time = std::to_string(current_time_ms / 1000);
|
||||||
std::string modified_strText = base_strText;
|
std::string modified_strText = base_strText;
|
||||||
|
|
||||||
// 替换 Monitor
|
try {
|
||||||
size_t monitor_pos = modified_strText.find("\"Monitor\"");
|
auto j = nlohmann::json::parse(modified_strText);
|
||||||
if (monitor_pos != std::string::npos) {
|
j["Did"] = 0;
|
||||||
size_t colon_pos = modified_strText.find(":", monitor_pos);
|
if (j.contains("Msg") && j["Msg"].is_object()) {
|
||||||
size_t quote_pos = modified_strText.find("\"", colon_pos);
|
j["Msg"]["Cldid"] = data.mp_id;
|
||||||
size_t end_quote_pos = modified_strText.find("\"", quote_pos + 1);
|
if (j["Msg"].contains("DataArray") && j["Msg"]["DataArray"].is_array()) {
|
||||||
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
|
for (auto& item : j["Msg"]["DataArray"]) {
|
||||||
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, data.mp_id);
|
if (item.is_object()) {
|
||||||
}
|
item["DataTimeSec"] = std::stoll(modified_time);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// 替换 TIME
|
}
|
||||||
size_t time_pos = modified_strText.find("\"TIME\"");
|
|
||||||
if (time_pos != std::string::npos) {
|
|
||||||
size_t colon_pos = modified_strText.find(":", time_pos);
|
|
||||||
size_t quote_pos = colon_pos;
|
|
||||||
size_t end_quote_pos = modified_strText.find(",", quote_pos + 1);
|
|
||||||
if (colon_pos != std::string::npos && quote_pos != std::string::npos && end_quote_pos != std::string::npos) {
|
|
||||||
modified_strText.replace(quote_pos + 1, end_quote_pos - quote_pos - 1, modified_time);
|
|
||||||
}
|
}
|
||||||
|
modified_strText = j.dump();
|
||||||
|
} catch (...) {
|
||||||
|
// 保持原始文本
|
||||||
}
|
}
|
||||||
|
|
||||||
data.strText = modified_strText;
|
data.strText = modified_strText;
|
||||||
//my_rocketmq_send(data,front->m_producer);
|
|
||||||
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
||||||
queue_data_list.push_back(data);
|
queue_data_list.push_back(data);
|
||||||
|
|
||||||
std::cout << "Sent message " << (i + 1)
|
std::cout << "Sent message " << (i + 1)
|
||||||
<< " with Monitor " << data.monitor_no
|
<< " with Monitor " << data.monitor_no
|
||||||
<< " and TIME " << modified_time << std::endl;
|
<< " and TIME " << modified_time << std::endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,11 +48,6 @@ bool showinshellflag =false;
|
|||||||
extern std::list<std::string> errorList, warnList, normalList;
|
extern std::list<std::string> errorList, warnList, normalList;
|
||||||
extern std::mutex errorListMutex, warnListMutex, normalListMutex;
|
extern std::mutex errorListMutex, warnListMutex, normalListMutex;
|
||||||
|
|
||||||
extern std::vector<terminal_dev> terminal_devlist;
|
|
||||||
extern std::mutex ledgermtx;
|
|
||||||
|
|
||||||
extern std::list<queue_data_t> queue_data_list;
|
|
||||||
|
|
||||||
extern int IED_COUNT;
|
extern int IED_COUNT;
|
||||||
extern int INITFLAG;
|
extern int INITFLAG;
|
||||||
extern int g_front_seg_index;
|
extern int g_front_seg_index;
|
||||||
@@ -281,7 +276,7 @@ extern bool normalOutputEnabled;
|
|||||||
if (G_TEST_NUM != 0) {
|
if (G_TEST_NUM != 0) {
|
||||||
std::cout << "[PeriodicTask] Executing rocketmq_test_300()\n";
|
std::cout << "[PeriodicTask] Executing rocketmq_test_300()\n";
|
||||||
rocketmq_test_300(G_TEST_NUM, g_front_seg_index, G_TEST_TYPE,m_front);
|
rocketmq_test_300(G_TEST_NUM, g_front_seg_index, G_TEST_TYPE,m_front);
|
||||||
upload_data_test();
|
//upload_data_test();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,8 @@ void* client_manager_thread(void* arg) {
|
|||||||
// <20><><EFBFBD><EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
|
// <20><><EFBFBD><EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
|
||||||
std::vector<DeviceInfo> test_devices = generate_test_devices(100);
|
std::vector<DeviceInfo> test_devices = generate_test_devices(100);
|
||||||
|
|
||||||
|
//std::vector<DeviceInfo> devices = GenerateDeviceInfoFromLedger(terminal_devlist);//lnk<6E><6B><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
start_client_connect(devices);
|
start_client_connect(devices);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user