add rtdata idx
This commit is contained in:
@@ -2285,7 +2285,7 @@ void print_terminal(const terminal_dev& tmnl) {
|
|||||||
std::cout << "Address: " << safe(tmnl.addr_str) << "\n";
|
std::cout << "Address: " << safe(tmnl.addr_str) << "\n";
|
||||||
std::cout << "Port: " << safe(tmnl.port) << "\n";
|
std::cout << "Port: " << safe(tmnl.port) << "\n";
|
||||||
std::cout << "Timestamp: " << safe(tmnl.timestamp) << "\n";
|
std::cout << "Timestamp: " << safe(tmnl.timestamp) << "\n";
|
||||||
|
std::cout << "Righttime: " << safe(tmnl.Righttime) << "\n";
|
||||||
std::cout << "mac: " << safe(tmnl.mac) << "\n";
|
std::cout << "mac: " << safe(tmnl.mac) << "\n";
|
||||||
|
|
||||||
for (size_t i = 0; i < 10 && !tmnl.line[i].monitor_id.empty(); ++i) {
|
for (size_t i = 0; i < 10 && !tmnl.line[i].monitor_id.empty(); ++i) {
|
||||||
|
|||||||
@@ -635,8 +635,9 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
|
|||||||
//dev.dev_series = safe_str(item, "series");
|
//dev.dev_series = safe_str(item, "series");
|
||||||
//dev.port = safe_str(item, "port");
|
//dev.port = safe_str(item, "port");
|
||||||
//dev.timestamp = safe_str(item, "updateTime");
|
//dev.timestamp = safe_str(item, "updateTime");
|
||||||
|
dev.Righttime = safe_str(item, "Righttime");
|
||||||
dev.processNo = safe_str(item, "node");
|
dev.processNo = safe_str(item, "node");
|
||||||
//dev.maxProcessNum = safe_str(item, "maxProcessNum");
|
dev.maxProcessNum = safe_str(item, "maxProcessNum");
|
||||||
|
|
||||||
//dev.mac = safe_str(item, "mac");//添加mac
|
//dev.mac = safe_str(item, "mac");//添加mac
|
||||||
|
|
||||||
@@ -650,7 +651,7 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
|
|||||||
m.logical_device_seq = safe_str(mon, "lineNo");
|
m.logical_device_seq = safe_str(mon, "lineNo");
|
||||||
m.voltage_level = safe_str(mon, "voltageLevel");
|
m.voltage_level = safe_str(mon, "voltageLevel");
|
||||||
m.terminal_connect = safe_str(mon, "ptType");
|
m.terminal_connect = safe_str(mon, "ptType");
|
||||||
m.timestamp = safe_str(mon, "updateTime");
|
//m.timestamp = safe_str(mon, "updateTime");
|
||||||
m.status = safe_str(mon, "status");
|
m.status = safe_str(mon, "status");
|
||||||
|
|
||||||
m.CT1 = mon.value("ct1", 0.0);
|
m.CT1 = mon.value("ct1", 0.0);
|
||||||
|
|||||||
@@ -235,7 +235,8 @@ public:
|
|||||||
std::string dev_series;
|
std::string dev_series;
|
||||||
std::string addr_str; //装置ip
|
std::string addr_str; //装置ip
|
||||||
std::string port; //装置端口
|
std::string port; //装置端口
|
||||||
std::string timestamp;
|
std::string timestamp; //更新时间
|
||||||
|
std::string Righttime; //对时
|
||||||
std::string processNo;
|
std::string processNo;
|
||||||
std::string maxProcessNum;
|
std::string maxProcessNum;
|
||||||
|
|
||||||
@@ -710,6 +711,25 @@ inline std::string now_yyyy_mm_dd_hh_mm_ss() {
|
|||||||
oss << std::put_time(&tmv, "%Y-%m-%d %H:%M:%S");
|
oss << std::put_time(&tmv, "%Y-%m-%d %H:%M:%S");
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////实时数据用
|
||||||
|
// === 专用锁 + 数据表(仅管实时 idx 映射) ===
|
||||||
|
extern std::mutex devidx_lock; // 新锁(不要用 ledgermtx)
|
||||||
|
extern std::unordered_map<std::string,int> devIdxMap; // id -> idx,一对一
|
||||||
|
|
||||||
|
// === 常用操作:全部用这把锁保护 ===
|
||||||
|
inline void devidx_set(const std::string& id, int idx) {
|
||||||
|
std::lock_guard<std::mutex> lk(devidx_lock);
|
||||||
|
devIdxMap[id] = idx; // 覆盖更新
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool devidx_get(const std::string& id, int& out_idx) {
|
||||||
|
std::lock_guard<std::mutex> lk(devidx_lock);
|
||||||
|
auto it = devIdxMap.find(id);
|
||||||
|
if (it == devIdxMap.end()) return false;
|
||||||
|
out_idx = it->second;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
extern int g_front_seg_index;
|
extern int g_front_seg_index;
|
||||||
extern std::string FRONT_INST;
|
extern std::string FRONT_INST;
|
||||||
|
|||||||
@@ -324,7 +324,7 @@ void init_loggers_bydevid(const std::string& dev_id)
|
|||||||
Logger device_logger = init_logger(device_key, device_dir, dev_id, device_appender);
|
Logger device_logger = init_logger(device_key, device_dir, dev_id, device_appender);
|
||||||
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DATA);
|
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DATA);
|
||||||
|
|
||||||
DIY_WARNLOG(dev_id.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str());
|
//DIY_WARNLOG(dev_id.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化监测点日志,monitor.<mp_id>.COM / .DATA
|
// 初始化监测点日志,monitor.<mp_id>.COM / .DATA
|
||||||
@@ -349,7 +349,7 @@ void init_loggers_bydevid(const std::string& dev_id)
|
|||||||
Logger mon_logger = init_logger(mon_key.str(), mon_path.str(), mon_name.str(), monitor_appender);
|
Logger mon_logger = init_logger(mon_key.str(), mon_path.str(), mon_name.str(), monitor_appender);
|
||||||
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DATA);
|
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DATA);
|
||||||
|
|
||||||
DIY_WARNLOG(monitor.monitor_id.c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕", monitor.monitor_name.c_str(), monitor.logical_device_seq.c_str());
|
//DIY_WARNLOG(monitor.monitor_id.c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕", monitor.monitor_name.c_str(), monitor.logical_device_seq.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -389,7 +389,7 @@ void init_loggers()
|
|||||||
|
|
||||||
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DATA);
|
logger_map[device_key] = TypedLogger(device_logger, LOGTYPE_DATA);
|
||||||
|
|
||||||
DIY_WARNLOG(term.terminal_id.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str());
|
//DIY_WARNLOG(term.terminal_id.c_str(), "【WARN】终端id:%s终端级日志初始化完毕", term.terminal_id.c_str());
|
||||||
|
|
||||||
// 初始化监测点日志
|
// 初始化监测点日志
|
||||||
for (size_t i = 0; i < term.line.size(); ++i) {
|
for (size_t i = 0; i < term.line.size(); ++i) {
|
||||||
@@ -412,8 +412,8 @@ void init_loggers()
|
|||||||
|
|
||||||
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DATA);
|
logger_map[mon_key.str()] = TypedLogger(mon_logger, LOGTYPE_DATA);
|
||||||
|
|
||||||
DIY_WARNLOG(mon_key.str().c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕",
|
//DIY_WARNLOG(mon_key.str().c_str(), "【WARN】监测点:%s - id:%s监测点级日志初始化完毕",
|
||||||
monitor.monitor_name.c_str(), monitor.logical_device_seq.c_str());
|
//monitor.monitor_name.c_str(), monitor.logical_device_seq.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ std::list<queue_data_t> queue_data_list;
|
|||||||
|
|
||||||
static rocketmq::RocketMQProducer* g_producer = nullptr; //生产者
|
static rocketmq::RocketMQProducer* g_producer = nullptr; //生产者
|
||||||
|
|
||||||
|
std::mutex devidx_lock;
|
||||||
|
std::unordered_map<std::string, int> devIdxMap;//实时数据用的idx
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
//前置进程
|
//前置进程
|
||||||
@@ -343,7 +346,7 @@ void my_rocketmq_send(queue_data_t& data,rocketmq::RocketMQProducer* producer)
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////回调函数的json处理
|
/////////////////////////////////////////////////////////////////////////////////////////////////回调函数的json处理
|
||||||
|
|
||||||
bool parseJsonMessageRT(const std::string& body,std::string& devSeries,ushort& line,bool& realData,bool& soeData,int& limit){
|
bool parseJsonMessageRT(const std::string& body,std::string& devSeries,ushort& line,bool& realData,bool& soeData,int& limit,int& Idx){
|
||||||
json root;
|
json root;
|
||||||
try {
|
try {
|
||||||
root = json::parse(body);
|
root = json::parse(body);
|
||||||
@@ -378,7 +381,8 @@ bool parseJsonMessageRT(const std::string& body,std::string& devSeries,ushort& l
|
|||||||
!messageBody.contains("line") ||
|
!messageBody.contains("line") ||
|
||||||
!messageBody.contains("realData") ||
|
!messageBody.contains("realData") ||
|
||||||
!messageBody.contains("soeData") ||
|
!messageBody.contains("soeData") ||
|
||||||
!messageBody.contains("limit"))
|
!messageBody.contains("limit")||
|
||||||
|
!messageBody.contains("Idx"))
|
||||||
{
|
{
|
||||||
std::cerr << "Missing expected fields in 'messageBody'." << std::endl;
|
std::cerr << "Missing expected fields in 'messageBody'." << std::endl;
|
||||||
return false;
|
return false;
|
||||||
@@ -390,6 +394,7 @@ bool parseJsonMessageRT(const std::string& body,std::string& devSeries,ushort& l
|
|||||||
realData = messageBody["realData"].get<bool>();
|
realData = messageBody["realData"].get<bool>();
|
||||||
soeData = messageBody["soeData"].get<bool>();
|
soeData = messageBody["soeData"].get<bool>();
|
||||||
limit = messageBody["limit"].get<int>();
|
limit = messageBody["limit"].get<int>();
|
||||||
|
int idx = messageBody["Idx"].get<int>();
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
std::cerr << "Type error while extracting fields: " << e.what() << std::endl;
|
std::cerr << "Type error while extracting fields: " << e.what() << std::endl;
|
||||||
return false;
|
return false;
|
||||||
@@ -679,21 +684,22 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
|
|||||||
|
|
||||||
json_data.terminal_id = item.value("id", "");
|
json_data.terminal_id = item.value("id", "");
|
||||||
json_data.terminal_name = item.value("name", "");
|
json_data.terminal_name = item.value("name", "");
|
||||||
json_data.org_name = item.value("org_name", "");
|
//json_data.org_name = item.value("org_name", "");
|
||||||
json_data.maint_name = item.value("maint_name", "");
|
//json_data.maint_name = item.value("maint_name", "");
|
||||||
json_data.station_name = item.value("stationName", "");
|
//json_data.station_name = item.value("stationName", "");
|
||||||
json_data.tmnl_factory = item.value("manufacturer", "");
|
//json_data.tmnl_factory = item.value("manufacturer", "");
|
||||||
json_data.tmnl_status = item.value("status", "");
|
//json_data.tmnl_status = item.value("status", "");
|
||||||
json_data.dev_type = item.value("devType", "");
|
json_data.dev_type = item.value("devType", "");
|
||||||
json_data.dev_key = item.value("devKey", "");
|
//json_data.dev_key = item.value("devKey", "");
|
||||||
json_data.dev_series = item.value("series", "");
|
//json_data.dev_series = item.value("series", "");
|
||||||
|
|
||||||
int procNo = item.value("processNo", -1);
|
int procNo = item.value("processNo", -1);
|
||||||
json_data.processNo = std::to_string(procNo);
|
json_data.processNo = std::to_string(procNo);
|
||||||
|
|
||||||
json_data.addr_str = item.value("ip", "");
|
//json_data.addr_str = item.value("ip", "");
|
||||||
json_data.port = item.value("port", "");
|
//json_data.port = item.value("port", "");
|
||||||
json_data.timestamp = item.value("updateTime", "");
|
//json_data.timestamp = item.value("updateTime", "");
|
||||||
|
json_data.Righttime = item.value("Righttime", "");
|
||||||
|
|
||||||
if (item.contains("monitorData") && item["monitorData"].is_array()) {
|
if (item.contains("monitorData") && item["monitorData"].is_array()) {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
@@ -706,7 +712,7 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
|
|||||||
m.status = monitor_item.value("status", "");
|
m.status = monitor_item.value("status", "");
|
||||||
m.logical_device_seq = monitor_item.value("lineNo", "");
|
m.logical_device_seq = monitor_item.value("lineNo", "");
|
||||||
m.terminal_connect = monitor_item.value("ptType", "");
|
m.terminal_connect = monitor_item.value("ptType", "");
|
||||||
m.timestamp = json_data.timestamp;
|
//m.timestamp = json_data.timestamp;
|
||||||
m.terminal_id = json_data.terminal_id;
|
m.terminal_id = json_data.terminal_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -777,8 +783,9 @@ rocketmq::ConsumeStatus myMessageCallbackrtdata(const rocketmq::MQMessageExt& ms
|
|||||||
ushort line;
|
ushort line;
|
||||||
bool realData = false, soeData = false;
|
bool realData = false, soeData = false;
|
||||||
int limit = 0;
|
int limit = 0;
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
if (!parseJsonMessageRT(body, devid, line, realData, soeData, limit)) {
|
if (!parseJsonMessageRT(body, devid, line, realData, soeData, limit,idx)) {
|
||||||
std::cerr << "Failed to parse the JSON message." << std::endl;
|
std::cerr << "Failed to parse the JSON message." << std::endl;
|
||||||
DIY_ERRORLOG("process", "【ERROR】前置消费topic:%s_%s的实时触发消息失败,消息的json格式不正确", FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str());
|
DIY_ERRORLOG("process", "【ERROR】前置消费topic:%s_%s的实时触发消息失败,消息的json格式不正确", FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str());
|
||||||
return rocketmq::RECONSUME_LATER;
|
return rocketmq::RECONSUME_LATER;
|
||||||
@@ -794,10 +801,13 @@ rocketmq::ConsumeStatus myMessageCallbackrtdata(const rocketmq::MQMessageExt& ms
|
|||||||
if (ClientManager::instance().get_dev_status(devid) != 1) {
|
if (ClientManager::instance().get_dev_status(devid) != 1) {
|
||||||
std::cout << "devid对应装置不在线: " << devid << std::endl;
|
std::cout << "devid对应装置不在线: " << devid << std::endl;
|
||||||
// 记录日志不响应 web 端
|
// 记录日志不响应 web 端
|
||||||
DIY_ERRORLOG("process","【ERROR】前置的%d号进程处理topic:%s_%s的补招触发消息失败,装置%s不在线", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str(),devid.c_str());
|
DIY_ERRORLOG("process","【ERROR】前置的%d号进程处理topic:%s_%s的实时数据触发消息失败,装置%s不在线", g_front_seg_index,FRONT_INST.c_str(), G_MQCONSUMER_TOPIC_RT.c_str(),devid.c_str());
|
||||||
return rocketmq::CONSUME_SUCCESS;
|
return rocketmq::CONSUME_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//记录idx
|
||||||
|
devidx_set(devid, idx);//每次下发都会更新,不加入运行用的结构体
|
||||||
|
|
||||||
ClientManager::instance().set_real_state_count(devid, 60, line);//一秒询问一次,询问60次,下一次同一个测点调用的话就会刷新
|
ClientManager::instance().set_real_state_count(devid, 60, line);//一秒询问一次,询问60次,下一次同一个测点调用的话就会刷新
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|||||||
@@ -429,6 +429,7 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
|
|||||||
os << "\r\x1B[K|-- tmnl_factory : " << dev.tmnl_factory << "\n";
|
os << "\r\x1B[K|-- tmnl_factory : " << dev.tmnl_factory << "\n";
|
||||||
os << "\r\x1B[K|-- tmnl_status : " << dev.tmnl_status << "\n";
|
os << "\r\x1B[K|-- tmnl_status : " << dev.tmnl_status << "\n";
|
||||||
os << "\r\x1B[K|-- timestamp : " << dev.timestamp << "\n";
|
os << "\r\x1B[K|-- timestamp : " << dev.timestamp << "\n";
|
||||||
|
os << "\r\x1B[K|-- Righttime : " << dev.Righttime << "\n";
|
||||||
os << "\r\x1B[K|-- mac : " << dev.mac << "\n";
|
os << "\r\x1B[K|-- mac : " << dev.mac << "\n";
|
||||||
|
|
||||||
// ========================= 终端级 · 内部定值 =========================
|
// ========================= 终端级 · 内部定值 =========================
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "cloudfront/code/interface.h" //lnk20250708
|
#include "cloudfront/code/interface.h" //lnk20250708
|
||||||
#include "cloudfront/code/rocketmq.h" //lnk20250708
|
#include "cloudfront/code/rocketmq.h" //lnk20250708
|
||||||
|
#include "cloudfront/code/log4.h" //lnk20250924
|
||||||
#include "client2.h"
|
#include "client2.h"
|
||||||
#include "cloudfront/code/log4.h"
|
#include "cloudfront/code/log4.h"
|
||||||
|
|
||||||
@@ -122,17 +123,13 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
//end_time.tm_min = 1;
|
//end_time.tm_min = 1;
|
||||||
//end_time.tm_sec = 1;
|
//end_time.tm_sec = 1;
|
||||||
//ClientManager::instance().read_eventlog_action_to_device(id, start_time, end_time,2,1);
|
//ClientManager::instance().read_eventlog_action_to_device(id, start_time, end_time,2,1);
|
||||||
|
DIY_ERRORLOG_CODE("111", 0, static_cast<int>(LogCode::LOG_CODE_OTHER), "【ERROR】测试告警发送 前置");
|
||||||
//DIY_ERRORLOG_CODE("111", 0, static_cast<int>(LogCode::LOG_CODE_OTHER), "【ERROR】测试告警发送 前置");
|
DIY_ERRORLOG_CODE(id, 1, static_cast<int>(LogCode::LOG_CODE_OTHER), "【ERROR】测试告警发送 设备");
|
||||||
//DIY_ERRORLOG_CODE(id, 1, static_cast<int>(LogCode::LOG_CODE_OTHER), "【ERROR】测试告警发送 设备");
|
std::string mpid;
|
||||||
/*std::string mpid;
|
|
||||||
get_monitor_id_by_dev_and_seq(id, 1, mpid);
|
get_monitor_id_by_dev_and_seq(id, 1, mpid);
|
||||||
if (!mpid.empty()) {
|
if (!mpid.empty()) {
|
||||||
DIY_ERRORLOG_CODE(mpid, 2, static_cast<int>(LogCode::LOG_CODE_OTHER), "【ERROR】测试告警发送 测点");
|
DIY_ERRORLOG_CODE(mpid, 2, static_cast<int>(LogCode::LOG_CODE_OTHER), "【ERROR】测试告警发送 测点");
|
||||||
}*/
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (udata[19] == 0x00) {
|
if (udata[19] == 0x00) {
|
||||||
std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
|
std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
|
||||||
@@ -153,6 +150,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
//处理主动上送的暂态事件报文
|
//处理主动上送的暂态事件报文
|
||||||
NewTaglogbuffer event = NewTaglogbuffer::createFromData(parser.RecvData.data(), parser.RecvData.size());
|
NewTaglogbuffer event = NewTaglogbuffer::createFromData(parser.RecvData.data(), parser.RecvData.size());
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
//获取测点id
|
//获取测点id
|
||||||
std::string mpid;
|
std::string mpid;
|
||||||
get_monitor_id_by_dev_and_seq(id, 1, mpid);
|
get_monitor_id_by_dev_and_seq(id, 1, mpid);
|
||||||
@@ -234,6 +232,8 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
=======
|
||||||
|
>>>>>>> 096e590 (add rtdata idx)
|
||||||
// 获取测点参数
|
// 获取测点参数
|
||||||
std::string strScale;//电压等级
|
std::string strScale;//电压等级
|
||||||
int nPTType;//接线方式
|
int nPTType;//接线方式
|
||||||
|
|||||||
Reference in New Issue
Block a user