新增暂态事件补招功能

This commit is contained in:
zw
2025-09-08 14:37:39 +08:00
parent 722512fad6
commit 1e2dcf76a0
6 changed files with 516 additions and 10 deletions

View File

@@ -703,3 +703,66 @@ std::vector<uint8_t> generate_righttime_message(const std::tm& time) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>134(0x86) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>134(0x86)
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_RightTime)); return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_RightTime));
} }
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
* @param Time1 <20><>ʼʱ<CABC><CAB1>
* @param Time2 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
* @param eventType <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><C4AC>2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D>澯ʱ<E6BEAF><CAB1>
* @param monitorPoint <20><><EFBFBD><EFBFBD><EFBFBD>㣬Ĭ<E3A3AC><C4AC>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 1-6 <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*/
std::vector<uint8_t> generate_recallevent_message(const std::tm& Time1, const std::tm& Time2,
uint8_t eventType, uint8_t monitorPoint)
{
std::vector<uint8_t> DataBuf(25, 0x00); // <20><><EFBFBD><EFBFBD>25<32>ֽڻ<D6BD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
// ǰ3<C7B0>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ã<EFBFBD><C3A3>ѳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
DataBuf[3] = eventType; // 2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D><EFBFBD>¼<EFBFBD>
DataBuf[4] = monitorPoint; // 0-<2D><><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڸ<D6BD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t year1 = static_cast<uint16_t>(Time1.tm_year + 1900);
DataBuf[5] = static_cast<uint8_t>((year1 >> 8) & 0xFF);
DataBuf[6] = static_cast<uint8_t>(year1 & 0xFF);
uint16_t month1 = static_cast<uint16_t>(Time1.tm_mon + 1);
DataBuf[7] = static_cast<uint8_t>((month1 >> 8) & 0xFF);
DataBuf[8] = static_cast<uint8_t>(month1 & 0xFF);
uint16_t day1 = static_cast<uint16_t>(Time1.tm_mday);
DataBuf[9] = static_cast<uint8_t>((day1 >> 8) & 0xFF);
DataBuf[10] = static_cast<uint8_t>(day1 & 0xFF);
uint16_t hour1 = static_cast<uint16_t>(Time1.tm_hour);
DataBuf[11] = static_cast<uint8_t>((hour1 >> 8) & 0xFF);
DataBuf[12] = static_cast<uint8_t>(hour1 & 0xFF);
uint16_t minute1 = static_cast<uint16_t>(Time1.tm_min);
DataBuf[13] = static_cast<uint8_t>((minute1 >> 8) & 0xFF);
DataBuf[14] = static_cast<uint8_t>(minute1 & 0xFF);
uint16_t year2 = static_cast<uint16_t>(Time2.tm_year + 1900);
DataBuf[15] = static_cast<uint8_t>((year2 >> 8) & 0xFF);
DataBuf[16] = static_cast<uint8_t>(year2 & 0xFF);
uint16_t month2 = static_cast<uint16_t>(Time2.tm_mon + 1);
DataBuf[17] = static_cast<uint8_t>((month2 >> 8) & 0xFF);
DataBuf[18] = static_cast<uint8_t>(month2 & 0xFF);
uint16_t day2 = static_cast<uint16_t>(Time2.tm_mday);
DataBuf[19] = static_cast<uint8_t>((day2 >> 8) & 0xFF);
DataBuf[20] = static_cast<uint8_t>(day2 & 0xFF);
uint16_t hour2 = static_cast<uint16_t>(Time2.tm_hour);
DataBuf[21] = static_cast<uint8_t>((hour2 >> 8) & 0xFF);
DataBuf[22] = static_cast<uint8_t>(hour2 & 0xFF);
uint16_t minute2 = static_cast<uint16_t>(Time2.tm_min);
DataBuf[23] = static_cast<uint8_t>((minute2 >> 8) & 0xFF);
DataBuf[24] = static_cast<uint8_t>(minute2 & 0xFF);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x0D(<28>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>)
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_Read_Event));
}

View File

@@ -43,7 +43,9 @@ enum class MsgRequestType : unsigned char {
//ѯ<><D1AF>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ //ѯ<><D1AF>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
Request_Read_RunningInformation = 0x0e, Request_Read_RunningInformation = 0x0e,
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ //<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
Request_RightTime = 0x86 Request_RightTime = 0x86,
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
Request_Read_Event = 0x0D
}; };
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6> // <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
enum class MsgResponseType : unsigned char { enum class MsgResponseType : unsigned char {
@@ -77,6 +79,8 @@ enum class MsgResponseType : unsigned char {
Response_Read_RunningInformation = 0x8e, Response_Read_RunningInformation = 0x8e,
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ(δʹ<CEB4><CAB9>,<2C><><EFBFBD><EFBFBD>Ĭ<EFBFBD>Ͽ϶<CFBF><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>) //<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ(δʹ<CEB4><CAB9>,<2C><><EFBFBD><EFBFBD>Ĭ<EFBFBD>Ͽ϶<CFBF><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>)
Response_RightTime = 0x86, Response_RightTime = 0x86,
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
Response_Read_Event = 0x8D,
//Ĭ<>Ͽ϶<CFBF>Ӧ<EFBFBD><D3A6> //Ĭ<>Ͽ϶<CFBF>Ӧ<EFBFBD><D3A6>
Response_NewACK = 0x40, Response_NewACK = 0x40,
//Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ӧ<EFBFBD><D3A6> //Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ӧ<EFBFBD><D3A6>
@@ -2190,3 +2194,12 @@ std::vector<unsigned char> generate_machineversion_message();
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD> * @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*/ */
std::vector<uint8_t> generate_righttime_message(const std::tm& time); std::vector<uint8_t> generate_righttime_message(const std::tm& time);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
* @param Time1 <20><>ʼʱ<CABC><CAB1>
* @param Time2 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
* @param eventType <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><C4AC>2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D>澯ʱ<E6BEAF><CAB1>
* @param monitorPoint <20><><EFBFBD><EFBFBD><EFBFBD>㣬Ĭ<E3A3AC><C4AC>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 1-6 <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
*/
std::vector<uint8_t> generate_recallevent_message(const std::tm& Time1, const std::tm& Time2, uint8_t eventType = 2, uint8_t monitorPoint = 1);

View File

@@ -283,6 +283,37 @@ void ClientContext::clear_stat_cache() {
stat_packets_cache_.clear(); stat_packets_cache_.clear();
expected_total_packets_ = 0; expected_total_packets_ = 0;
} }
bool ClientContext::event_add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets) {
std::lock_guard<std::mutex> lock(event_stat_cache_mutex_);
// 如果是第一帧,初始化缓存
if (current_packet == 1) {
event_stat_packets_cache_.clear();
event_expected_total_packets_ = total_packets;
}
// 添加到缓存
event_stat_packets_cache_.push_back({ current_packet, packet });
// 检查是否收齐所有帧
return (event_stat_packets_cache_.size() >= event_expected_total_packets_);
}
std::vector<ClientContext::StatPacket> ClientContext::event_get_and_clear_stat_packets() {
std::lock_guard<std::mutex> lock(event_stat_cache_mutex_);
auto packets = std::move(event_stat_packets_cache_);
event_stat_packets_cache_.clear();
event_expected_total_packets_ = 0;
return packets;
}
void ClientContext::event_clear_stat_cache() {
std::lock_guard<std::mutex> lock(event_stat_cache_mutex_);
event_stat_packets_cache_.clear();
event_expected_total_packets_ = 0;
}
// 添加浮点数据到缓存 // 添加浮点数据到缓存
bool ClientContext::add_float_data(ushort point_id, int data_type, const tagPqData_Float& float_data) { bool ClientContext::add_float_data(ushort point_id, int data_type, const tagPqData_Float& float_data) {
if (data_type < 0 || data_type > 3) return false; if (data_type < 0 || data_type > 3) return false;
@@ -548,6 +579,7 @@ void on_close(uv_handle_t* handle) {
ctx->stop_timers(); ctx->stop_timers();
// 清空缓存 // 清空缓存
ctx->clear_stat_cache(); ctx->clear_stat_cache();
ctx->event_clear_stat_cache();
// 清除浮点数据缓存 // 清除浮点数据缓存
ctx->clear_float_cache(); ctx->clear_float_cache();
// 装置登录状态调整为离线 // 装置登录状态调整为离线
@@ -1055,6 +1087,52 @@ bool ClientManager::clear_stat_cache(const std::string& identifier) {
return false; return false;
} }
//保存多帧事件日志报文至缓存区等待收全
bool ClientManager::add_eventlog_packet_to_device(const std::string& identifier,
const std::vector<unsigned char>& packet,
int current_packet,
int total_packets) {
std::lock_guard<std::mutex> lock(mutex_);
for (auto& pair : clients_) {
auto& ctx = pair.second;
if (ctx->device_info.device_id == identifier ||
ctx->device_info.mac == identifier) {
return ctx->event_add_stat_packet(packet, current_packet, total_packets);
}
}
return false;
}
//获取缓存区内所有多帧事件日志报文并清空缓存
std::vector<ClientContext::StatPacket> ClientManager::get_and_clear_event_packets(const std::string& identifier) {
std::lock_guard<std::mutex> lock(mutex_);
for (auto& pair : clients_) {
auto& ctx = pair.second;
if (ctx->device_info.device_id == identifier ||
ctx->device_info.mac == identifier) {
return ctx->event_get_and_clear_stat_packets();
}
}
return {};
}
//清空所有事件日志缓存区
bool ClientManager::clear_event_cache(const std::string& identifier) {
std::lock_guard<std::mutex> lock(mutex_);
for (auto& pair : clients_) {
auto& ctx = pair.second;
if (ctx->device_info.device_id == identifier ||
ctx->device_info.mac == identifier) {
ctx->event_clear_stat_cache();
return true;
}
}
return false;
}
// 获取pt和CT变比 // 获取pt和CT变比
bool ClientManager::get_pt_ct_ratio(const std::string& identifier, bool ClientManager::get_pt_ct_ratio(const std::string& identifier,
int16_t nCpuNo, int16_t nCpuNo,
@@ -1093,6 +1171,25 @@ bool ClientManager::get_pt_ct_ratio(const std::string& identifier,
return false; return false;
} }
// 获取待补招测点序号
bool ClientManager::get_event_lineid(const std::string& identifier,int& nCpuNo) {
std::lock_guard<std::mutex> lock(mutex_);
for (auto& pair : clients_) {
auto& ctx = pair.second;
// 匹配装置ID或MAC地址
if (ctx->device_info.device_id == identifier ||
ctx->device_info.mac == identifier) {
nCpuNo = ctx->event_lineNo;
return true;
}
}
std::cerr << "[get_pt_ct_ratio] Device not found: " << identifier << std::endl;
return false;
}
// 添加浮点数据到指定设备的缓存 // 添加浮点数据到指定设备的缓存
bool ClientManager::add_float_data_to_device(const std::string& identifier, bool ClientManager::add_float_data_to_device(const std::string& identifier,
ushort point_id, ushort point_id,
@@ -1451,6 +1548,43 @@ bool ClientManager::read_devversion_action_to_device(const std::string& identifi
} }
return false; // 设备未找到 return false; // 设备未找到
} }
/**
* @brief 补招事件日志动作
* @param Time1 起始时间
* @param Time2 结束时间
* @param eventType 事件类型默认2-暂态事件 4-告警时间
* @param monitorPoint 监测点默认1-监测点1 1-6 对应测点
* @return 调用成功或失败的结果
*/
bool ClientManager::read_eventlog_action_to_device(const std::string& identifier, const std::tm& Time1, const std::tm& Time2,
uint8_t eventType, uint8_t monitorPoint) {
std::lock_guard<std::mutex> lock(mutex_);
// 查找匹配的设备
for (auto& pair : clients_) {
auto& ctx = pair.second;
if (ctx->device_info.device_id == identifier ||
ctx->device_info.mac == identifier)
{
ctx->event_lineNo = monitorPoint;
// 生成定值描述报文
auto packet = generate_recallevent_message(Time1, Time2, eventType, monitorPoint);
// 添加动作到队列 (状态: 读取文件目录)
ctx->add_action(DeviceState::READING_EVENTLOG, packet);
// 如果当前空闲则立即执行
if (ctx->current_state_ == DeviceState::IDLE) {
ctx->process_next_action();
}
return true; // 成功添加
}
}
return false; // 设备未找到
}
//获取指定装置测点的电压等级与接线方式 //获取指定装置测点的电压等级与接线方式
bool ClientManager::get_point_scale_and_pttype(const std::string& identifier, bool ClientManager::get_point_scale_and_pttype(const std::string& identifier,
ushort nCpuNo, ushort nCpuNo,

View File

@@ -61,6 +61,7 @@ enum class DeviceState {
READING_RUNNINGINFORMATION_2,// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱִ<CAB1><D6B4>) READING_RUNNINGINFORMATION_2,// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱִ<CAB1><D6B4>)
READING_DEVVERSION, // <20><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ READING_DEVVERSION, // <20><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
SET_RIGHTTIME, // <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ SET_RIGHTTIME, // <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
READING_EVENTLOG, // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬ // <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF> CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF>
}; };
@@ -123,14 +124,21 @@ public:
std::vector<unsigned char> data; std::vector<unsigned char> data;
}; };
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>------------------------------------------------------------------------
std::vector<StatPacket> stat_packets_cache_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> std::vector<StatPacket> stat_packets_cache_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
int expected_total_packets_ = 0; // Ԥ<><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1> int expected_total_packets_ = 0; // Ԥ<><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
std::mutex stat_cache_mutex_; // <20><><EFBFBD><EFBFBD><E6BBA5><EFBFBD><EFBFBD> std::mutex stat_cache_mutex_; // <20><><EFBFBD><EFBFBD><E6BBA5><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bool add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<StatPacket> get_and_clear_stat_packets();//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD> std::vector<StatPacket> get_and_clear_stat_packets();//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
void clear_stat_cache();//<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD> void clear_stat_cache();//<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------------------------------------------------
ushort event_lineNo = 1; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
std::vector<StatPacket> event_stat_packets_cache_; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
int event_expected_total_packets_ = 0; // <20>¼<EFBFBD><C2BC><EFBFBD>־Ԥ<D6BE><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
std::mutex event_stat_cache_mutex_; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><E6BBA5><EFBFBD><EFBFBD>
bool event_add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<StatPacket> event_get_and_clear_stat_packets();//<2F>¼<EFBFBD><C2BC><EFBFBD>־ȡ<D6BE><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
void event_clear_stat_cache();//<2F>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
// ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD> // ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
struct PointFloatCache { struct PointFloatCache {
@@ -296,12 +304,27 @@ public:
//<2F><><EFBFBD>ն<EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><E6BBBA><EFBFBD><EFBFBD> //<2F><><EFBFBD>ն<EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><E6BBBA><EFBFBD><EFBFBD>
bool clear_stat_cache(const std::string& identifier); bool clear_stat_cache(const std::string& identifier);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ȫ
bool add_eventlog_packet_to_device(const std::string& identifier,
const std::vector<unsigned char>& packet,
int current_packet,
int total_packets);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>֡<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
std::vector<ClientContext::StatPacket> get_and_clear_event_packets(const std::string& identifier);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool clear_event_cache(const std::string& identifier);
// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PT<50><54>CT<43><54><EFBFBD><EFBFBD>ֵ // <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PT<50><54>CT<43><54><EFBFBD><EFBFBD>ֵ
bool get_pt_ct_ratio(const std::string& identifier, bool get_pt_ct_ratio(const std::string& identifier,
int16_t nCpuNo, int16_t nCpuNo,
float& pt_ratio, float& pt_ratio,
float& ct_ratio); float& ct_ratio);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool get_event_lineid(const std::string& identifier, int& nCpuNo);
// <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
size_t client_count() { size_t client_count() {
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
@@ -417,6 +440,16 @@ public:
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ //<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool read_devversion_action_to_device(const std::string& identifier); bool read_devversion_action_to_device(const std::string& identifier);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
* @param Time1 <20><>ʼʱ<CABC><CAB1>
* @param Time2 <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
* @param eventType <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><C4AC>2-<2D><>̬<EFBFBD>¼<EFBFBD> 4-<2D>澯ʱ<E6BEAF><CAB1>
* @param monitorPoint <20><><EFBFBD><EFBFBD><EFBFBD>㣬Ĭ<E3A3AC><C4AC>1-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 1-6 <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
* @return <20><><EFBFBD>óɹ<C3B3><C9B9><EFBFBD>ʧ<EFBFBD>ܵĽ<DCB5><C4BD><EFBFBD>
*/
bool read_eventlog_action_to_device(const std::string& identifier, const std::tm& Time1, const std::tm& Time2,uint8_t eventType = 2, uint8_t monitorPoint = 1);
private: private:
ClientManager() : loop_(nullptr) {} ClientManager() : loop_(nullptr) {}
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_; std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;

View File

@@ -47,6 +47,23 @@ std::string extract_filename(const std::string& path) {
return path; return path;
} }
//<2F>ļ<EFBFBD>crcУ<63><EFBFBD><E9BAAF>
uint16_t crc_16_new(const uint8_t* buf, uint32_t len) {
uint16_t crc = 0xffff;
for (uint32_t i = 0; i < len; i++) {
crc = (uint16_t)(crc ^ buf[i]);
for (int j = 0; j < 8; j++) {
if (crc & 1) {
crc = (uint16_t)((crc >> 1) ^ 0xA001);
}
else {
crc = (uint16_t)(crc >> 1);
}
}
}
return crc;
}
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD> //<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
void process_received_message(string mac, string id,const char* data, size_t length) { void process_received_message(string mac, string id,const char* data, size_t length) {
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD> // ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
@@ -73,7 +90,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD> //װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼ ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼
ClientManager::instance().read_devversion_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>¼<EFBFBD><C2BC>ִ<EFBFBD><D6B4>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD>ǰ<EFBFBD><C7B0>ȡ<EFBFBD><EFBFBD><E6B1BE>Ϣȷ<CFA2>϶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ľṹ<C4BD><E1B9B9> ClientManager::instance().read_devversion_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>¼<EFBFBD><C2BC>ִ<EFBFBD><D6B4>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD>ǰ<EFBFBD><C7B0>ȡ<EFBFBD><EFBFBD><E6B1BE>Ϣȷ<CFA2>϶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ľṹ<C4BD><E1B9B9>
ClientManager::instance().add_file_menu_action_to_device(id, "/etcc");
//ClientManager::instance().set_real_state_count("D002", 1,1);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ //ClientManager::instance().set_real_state_count("D002", 1,1);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ
//ClientManager::instance().add_file_menu_action_to_device("D002","/etc");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ //ClientManager::instance().add_file_menu_action_to_device("D002","/etc");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ
//ClientManager::instance().add_file_download_action_to_device("D002", "/etc/NPQS570_VX_ZJ_2(V103).icd");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> //ClientManager::instance().add_file_download_action_to_device("D002", "/etc/NPQS570_VX_ZJ_2(V103).icd");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
@@ -85,7 +102,24 @@ void process_received_message(string mac, string id,const char* data, size_t len
//ClientManager::instance().set_interfixedvalue_action_to_device();װ<><D7B0><EFBFBD>޸<EFBFBD><DEB8>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><E1B9A9> //ClientManager::instance().set_interfixedvalue_action_to_device();װ<><D7B0><EFBFBD>޸<EFBFBD><DEB8>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><E1B9A9>
//ClientManager::instance().read_runninginformation_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ //ClientManager::instance().read_runninginformation_action_to_device(id);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1>: 2025<32><35>9<EFBFBD><39>1<EFBFBD><31> 10:30:45
//std::tm start_time = {};
//start_time.tm_year = 2025 - 1900; // <20><><EFBFBD>ݴ<EFBFBD>1900<30><30>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
//start_time.tm_mon = 8 - 1; // <20>·ݴ<C2B7>0<EFBFBD><30>ʼ (0=һ<><D2BB>)
//start_time.tm_mday = 20;
//start_time.tm_hour = 1;
//start_time.tm_min = 1;
//start_time.tm_sec = 1;
//// <20><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>ʱ<EFBFBD><CAB1>: 2025<32><35>9<EFBFBD><39>4<EFBFBD><34> 12:15:30
//std::tm end_time = {};
//end_time.tm_year = 2025 - 1900;
//end_time.tm_mon = 8 - 1;
//end_time.tm_mday = 25;
//end_time.tm_hour = 1;
//end_time.tm_min = 1;
//end_time.tm_sec = 1;
//ClientManager::instance().read_eventlog_action_to_device(id, start_time, end_time,2,1);
} }
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;
@@ -718,6 +752,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
ClientManager::instance().change_device_state(id, DeviceState::IDLE); ClientManager::instance().change_device_state(id, DeviceState::IDLE);
} }
else { else {
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ݴ<EFBFBD><DDB4>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ݴ<EFBFBD><DDB4>󣬵<EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE); ClientManager::instance().change_device_state(id, DeviceState::IDLE);
@@ -1758,7 +1793,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
ClientManager::instance().set_versioninformation(id, versionInfo.CloudProtocolVer); ClientManager::instance().set_versioninformation(id, versionInfo.CloudProtocolVer);
} }
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*std::cout << "Device Version Info (" << mac << "):\n" std::cout << "Device Version Info (" << mac << "):\n"
<< " Base Model: " << versionInfo.BaseModel << "\n" << " Base Model: " << versionInfo.BaseModel << "\n"
<< " Cloud Protocol: " << versionInfo.CloudProtocolVer << "\n" << " Cloud Protocol: " << versionInfo.CloudProtocolVer << "\n"
<< " App Version: " << versionInfo.AppVersion << "\n" << " App Version: " << versionInfo.AppVersion << "\n"
@@ -1768,7 +1803,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
<< " Wave File Types: " << versionInfo.WaveFileTypeCount << "\n" << " Wave File Types: " << versionInfo.WaveFileTypeCount << "\n"
<< " Comm Protocols: 0x" << std::hex << versionInfo.CommProtocols << "\n" << " Comm Protocols: 0x" << std::hex << versionInfo.CommProtocols << "\n"
<< " Time Sync Methods: 0x" << versionInfo.TimeSyncMethods << "\n" << " Time Sync Methods: 0x" << versionInfo.TimeSyncMethods << "\n"
<< " Device Functions: 0x" << versionInfo.DeviceFunctions << std::dec << "\n";*/ << " Device Functions: 0x" << versionInfo.DeviceFunctions << std::dec << "\n";
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE); ClientManager::instance().change_device_state(id, DeviceState::IDLE);
@@ -1803,6 +1838,234 @@ void process_received_message(string mac, string id,const char* data, size_t len
} }
break; break;
case DeviceState::READING_EVENTLOG:
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_Event)) {
std::cout << "set success" << mac << std::endl;
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
if (parser.RecvData.size() >= 14) {
// <20><>ȡ<EFBFBD><C8A1>ǰ֡
int current_frame = 0;
if (parser.RecvData.size() >= 4) {
std::vector<unsigned char> frame_data(parser.RecvData.begin(), parser.RecvData.begin() + 4);
std::reverse(frame_data.begin(), frame_data.end()); // <20>ֽڷ<D6BD>ת
current_frame = *reinterpret_cast<int*>(frame_data.data());
}
// <20><>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1>
int total_frames = 0;
if (parser.RecvData.size() >= 8) {
std::vector<unsigned char> total_frame_data(parser.RecvData.begin() + 4, parser.RecvData.begin() + 8);
std::reverse(total_frame_data.begin(), total_frame_data.end()); // <20>ֽڷ<D6BD>ת
total_frames = *reinterpret_cast<int*>(total_frame_data.data());
}
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC>ܴ<EFBFBD>С
int file_size = 0;
if (parser.RecvData.size() >= 12) {
std::vector<unsigned char> size_data(parser.RecvData.begin() + 8, parser.RecvData.begin() + 12);
std::reverse(size_data.begin(), size_data.end()); // <20>ֽڷ<D6BD>ת
file_size = *reinterpret_cast<int*>(size_data.data());
}
// <20><>ȡCRCУ<43><D0A3><EFBFBD><EFBFBD>
uint16_t crc = 0;
if (parser.RecvData.size() >= 14) {
std::vector<unsigned char> crc_data(parser.RecvData.begin() + 12, parser.RecvData.begin() + 14);
std::reverse(crc_data.begin(), crc_data.end()); // <20>ֽڷ<D6BD>ת
crc = *reinterpret_cast<uint16_t*>(crc_data.data());
}
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
std::vector<unsigned char> file_data;
if (parser.RecvData.size() > 14) {
file_data.assign(parser.RecvData.begin() + 14, parser.RecvData.end());
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>ʹ<E6A3A8><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>READING_STATS<54><53><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
bool complete = ClientManager::instance().add_eventlog_packet_to_device(
id, file_data, current_frame, total_frames
);
std::cout << "event log:" << current_frame << "/" << total_frames << std::endl;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>֡
if (complete) {
// 1. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
auto packets = ClientManager::instance().get_and_clear_event_packets(id);
// 2. <20><>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::sort(packets.begin(), packets.end(),
[](const ClientContext::StatPacket& a, const ClientContext::StatPacket& b) {
return a.packet_index < b.packet_index;
});
// 3. <20><><EFBFBD><EFBFBD>ÿ֡<C3BF><D6A1><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<unsigned char> full_data;
for (const auto& packet : packets) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
full_data.insert(full_data.end(),
packet.data.begin(),
packet.data.end());
}
//ȷ<>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int event_lineid = 0;
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
int nPTType;//<2F><><EFBFBD>߷<EFBFBD>ʽ
float fPT = 1.0f;
float fCT = 1.0f;
if (!ClientManager::instance().get_event_lineid(id, event_lineid)) {
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
break;
}
if (!ClientManager::instance().get_point_scale_and_pttype(
id,
event_lineid,
strScale,
nPTType) || !ClientManager::instance().get_pt_ct_ratio(id, event_lineid, fPT, fCT)) {
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>PTCT,<2C><>ѹ<EFBFBD>ȼ<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
break;
}
// ========== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>full_data<74>е<EFBFBD>NewTaglogbuffer<65><72><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> ==========
std::list<NewTaglogbuffer> eventList;
size_t offset = 0;
const size_t headSize = sizeof(NewHeadTaglogbuffer);
const size_t bodyItemSize = sizeof(NewBodyTaglogbuffer);
while (offset + headSize <= full_data.size()) {
// <20><>ȡͷ<C8A1><CDB7>
NewHeadTaglogbuffer head;
memcpy(&head, full_data.data() + offset, headSize);
head.convertByteOrder(); // ת<><D7AA><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint32_t logParaNum = head.LogParaNum;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>岿<EFBFBD><E5B2BF><EFBFBD><EFBFBD>full_data<74><61>ռ<EFBFBD>õĿռ<D5BC><E4A3A8><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ
size_t bodySpace;
if (logParaNum <= 4) {
bodySpace = 4 * bodyItemSize;
}
else {
bodySpace = logParaNum * bodyItemSize;
}
// <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>
if (offset + headSize + bodySpace > full_data.size()) {
std::cerr << "Insufficient data for event body at offset " << offset << std::endl;
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
NewTaglogbuffer event;
event.head = head;
event.bodyList.resize(logParaNum);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>岿<EFBFBD><E5B2BF>
const uint8_t* bodyData = full_data.data() + offset + headSize;
for (uint32_t i = 0; i < logParaNum; ++i) {
memcpy(&event.bodyList[i], bodyData, bodyItemSize);
event.bodyList[i].convertByteOrder();
bodyData += bodyItemSize;
}
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (event.head.name == event_lineid) {
eventList.push_back(event);
}
// <20>ƶ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ÿռ<D5BC><E4A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
offset += headSize + bodySpace;
}
// <20><><EFBFBD><EFBFBD>eventList<73>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>󣬿<EFBFBD><F3A3ACBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
std::cout << "Parsed " << eventList.size() << " events from event log." << std::endl;
std::list<QVVRRecord> recordlist;
for (const auto& event : eventList) {
QVVRRecord record = DynamicLog_GetQVVRRecordFromLogBuffer(
strScale, nPTType, fPT, event);
// ʹ<>ü<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ݣ<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>
std::cout << "<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " << record.nType
<< ", <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>: " << record.fPersisstime << "s"
<< ", <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: " << record.fMagntitude << " pu"
<< ", ʱ<><CAB1><EFBFBD><EFBFBD>: " << record.triggerTimeMs << "ms" << std::endl;
recordlist.push_back(record);
}
//<2F><>ʱ<EFBFBD>Ƴ<EFBFBD>CRCУ<43><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//// ========== <20><><EFBFBD><EFBFBD> CRC <20><>֤ ==========
//if (!full_data.empty()) {
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD> CRC
// uint16_t calculated_crc = crc_16_new(full_data.data(), full_data.size());
// // <20>Ƚϼ<C8BD><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRC <20>ʹӱ<CDB4><D3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1> CRC
// if (calculated_crc == crc) {
// std::cout << "CRC verification passed for event log data." << std::endl;
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// }
// else {
// std::cerr << "CRC verification failed! Expected: " << crc
// << ", Calculated: " << calculated_crc << std::endl;
// // <20><><EFBFBD><EFBFBD> CRC У<><D0A3>ʧ<EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
// }
//}
//else {
// //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
// std::cerr << "No data received for event log." << std::endl;
//}
}
else {
//δ<><CEB4>ȫ<EFBFBD><C8AB>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
return;
}
}
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewNACK)) {
std::cout << "set error" << mac << std::endl;
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
if (udata[10] == static_cast<unsigned char>(0x0c)) {
//0x0c<30><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ڣ<EFBFBD>֪ͨǰ̨<C7B0><CCA8>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬
std::cout << "not find event " << mac << std::endl;
}
else if (udata[10] == static_cast<unsigned char>(0x06)) {
//0x0c<30><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨǰ̨<C7B0><CCA8><EFBFBD><EFBFBD><EFBFBD>
}
else {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD>
}
// װ<>÷<EFBFBD><C3B7><EFBFBD>
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־ʧ<D6BE>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
else {
std::cout << "set unknow error" << mac << std::endl;
std::cout << "reason code: " << static_cast<int>(udata[8]) << "-" << static_cast<int>(udata[9]) << "-" << static_cast<int>(udata[10]) << "-" << static_cast<int>(udata[11]) << std::endl;
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>־ʧ<D6BE>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
}
break;
case DeviceState::CUSTOM_ACTION: case DeviceState::CUSTOM_ACTION:
// <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF>״̬ // <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF>״̬
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl; std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;

View File

@@ -158,11 +158,11 @@ void* client_manager_thread(void* arg) {
{"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0}, {"P001", "Main Voltage", "D001",1 ,1, 1, 1, 1,"0.38k",0},
{"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0} {"P002", "Backup Voltage", "D001",2 ,1, 1, 1, 1,"0.38k",0}
}; };
//00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 //00B78DA800D6 00-B7-8D-01-79-06 00-B7-8D-A8-00-D6 00-B7-8D-01-71-09 00-B7-8D-01-88-7f
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD> // <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
std::vector<DeviceInfo> devices = { std::vector<DeviceInfo> devices = {
{ {
"D001", "Primary Device", "Model-X", "00-B7-8D-01-79-06", "D001", "Primary Device", "Model-X", "00-B7-8D-01-88-7f",
1, points1,true 1, points1,true
} }
}; };