调整了实时数据与统计数据的转换方式。更新了暂态事件与波形的处理
This commit is contained in:
@@ -7,7 +7,8 @@
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
#include <atomic>
|
||||
|
||||
#include <fstream>
|
||||
#include <sys/stat.h> // <20><><EFBFBD><EFBFBD>mkdir
|
||||
#include <iostream>
|
||||
|
||||
#include "cloudfront/code/interface.h" //lnk20250708
|
||||
@@ -32,12 +33,23 @@ time_t ConvertToTimestamp(const tagPqData_Float& data) {
|
||||
return mktime(&t);
|
||||
}
|
||||
|
||||
//<2F>ļ<EFBFBD><C4BC>ָ<EFBFBD>ȡ<EFBFBD>ֶ<EFBFBD>
|
||||
std::string extract_filename(const std::string& path) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>'/'<27><>λ<EFBFBD><CEBB>
|
||||
size_t last_slash = path.find_last_of('/');
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>'/'<27><><EFBFBD><EFBFBD>'/'֮<><D6AE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
|
||||
if (last_slash != std::string::npos) {
|
||||
return path.substr(last_slash + 1);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>'/'<27><>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>ԭ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
return path;
|
||||
}
|
||||
void process_received_message(string mac, string id,const char* data, size_t length) {
|
||||
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl;
|
||||
// ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ע<>⣺<EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>ʵ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (length > 0) {
|
||||
@@ -72,7 +84,142 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
//<2F><>¼<EFBFBD><C2BC><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return;
|
||||
}
|
||||
//װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD> <20><>̬<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>/<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Event)) {
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>̬<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
NewTaglogbuffer event = NewTaglogbuffer::createFromData(parser.RecvData.data(), parser.RecvData.size());
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||
int nPTType;//<2F><><EFBFBD>߷<EFBFBD>ʽ
|
||||
float fPT = 1.0f;
|
||||
float fCT = 1.0f;
|
||||
if (ClientManager::instance().get_point_scale_and_pttype(
|
||||
id, // <20><>ʹ<EFBFBD><CAB9>id
|
||||
event.head.name, // <20>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
strScale,
|
||||
nPTType) && ClientManager::instance().get_pt_ct_ratio(id, event.head.name, fPT, fCT))
|
||||
{
|
||||
// ʹ<>û<EFBFBD>ȡ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>¼
|
||||
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;
|
||||
|
||||
}
|
||||
else {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡʧ<C8A1>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::cerr << "Failed to get point parameters for: " << mac << std::endl;
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ĺ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||
return;
|
||||
}
|
||||
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_ActiveSOEInfo)) {
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
unsigned char file_type = udata[12];//¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> cfg dat hdr 1-3
|
||||
unsigned char line_id = udata[13];//¼<><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-6
|
||||
const uint8_t* data_ptr = parser.RecvData.data() + 2;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5>ǰ<EFBFBD><C7B0>λ
|
||||
size_t data_size = parser.RecvData.size() - 2;
|
||||
// ֱ<>ӹ<EFBFBD><D3B9><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2BFBD><EFBFBD><EFBFBD>
|
||||
std::string tempfilename(
|
||||
reinterpret_cast<const char*>(data_ptr),
|
||||
data_size
|
||||
);
|
||||
|
||||
// ========== <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==========
|
||||
// 1. <20>ָ<EFBFBD>ԭʼ<D4AD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ͺ<EFBFBD>
|
||||
size_t dotPos = tempfilename.find_last_of('.');
|
||||
std::string baseName, originalExt;
|
||||
if (dotPos != std::string::npos) {
|
||||
baseName = tempfilename.substr(0, dotPos);
|
||||
originalExt = tempfilename.substr(dotPos);
|
||||
}
|
||||
else {
|
||||
baseName = tempfilename;
|
||||
originalExt = "";
|
||||
}
|
||||
|
||||
// 2. ȷ<><C8B7><EFBFBD><EFBFBD>Сд<D0A1><D0B4><EFBFBD><EFBFBD>
|
||||
bool isUppercase = false;
|
||||
if (!originalExt.empty()) {
|
||||
isUppercase = true;
|
||||
for (char c : originalExt) {
|
||||
if (std::isalpha(c) && std::islower(c)) {
|
||||
isUppercase = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ĺ<EFBFBD><EFBFBD>б<EFBFBD>
|
||||
std::vector<std::string> requiredExts;
|
||||
if (file_type == 3) { // <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
requiredExts = { ".cfg", ".dat", ".hdr" };
|
||||
}
|
||||
else { // Ĭ<><C4AC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
requiredExts = { ".cfg", ".dat" };
|
||||
//requiredExts = { ".dat" };
|
||||
}
|
||||
|
||||
// 4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BA>Сд
|
||||
if (isUppercase) {
|
||||
for (auto& ext : requiredExts) {
|
||||
for (char& c : ext) {
|
||||
if (std::isalpha(c)) c = std::toupper(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD>б<EFBFBD>
|
||||
std::vector<std::string> fullFilenames;
|
||||
for (const auto& ext : requiredExts) {
|
||||
fullFilenames.push_back(baseName + ext);
|
||||
}
|
||||
|
||||
// 6. <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>ʹ<EFBFBD><CAB9><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>滻<EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>ӡ<EFBFBD><EFBFBD><DFBC><EFBFBD>
|
||||
std::cout << "Generated filenames: ";
|
||||
for (const auto& name : fullFilenames) {
|
||||
std::cout << name << " ";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
|
||||
// ========== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊÿ<CEAA><C3BF><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==========
|
||||
for (const auto& filename : fullFilenames) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (֡<><D6A1><EFBFBD>Ź̶<C5B9>Ϊ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
auto downloadMsg = generate_downloadfile_message(1, filename);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().add_action_to_device(
|
||||
id,
|
||||
DeviceState::READING_EVENTFILE,
|
||||
downloadMsg
|
||||
);
|
||||
|
||||
std::cout << "Added download request for: " << filename << std::endl;
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰװ<C7B0>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰװ<C7B0>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>װ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ִ<EFBFBD>У<EFBFBD>
|
||||
DeviceState currentState = DeviceState::IDLE;//<2F><>ȡ<EFBFBD><C8A1>ǰװ<C7B0>õ<EFBFBD>״̬
|
||||
if (!ClientManager::instance().get_device_state(id, currentState)) {
|
||||
std::cerr << "Failed to get device state for: " << id << std::endl;
|
||||
return;
|
||||
}
|
||||
switch (currentState) {
|
||||
case DeviceState::IDLE:
|
||||
//<2F><>ǰװ<C7B0>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().post_message_processing(id);
|
||||
break;
|
||||
default:
|
||||
//<2F>ǿ<EFBFBD><C7BF>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>״ֱ̬<CCAC><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA>ٳ<EFBFBD><D9B3>Ի<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
break;
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ĺ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
||||
return;
|
||||
}
|
||||
//<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
|
||||
{
|
||||
DeviceState currentState = DeviceState::IDLE;//<2F><>ȡ<EFBFBD><C8A1>ǰװ<C7B0>õ<EFBFBD>״̬
|
||||
@@ -170,12 +317,21 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
tagPqData_Float avg_data = all_data[2];
|
||||
tagPqData_Float cp95_data = all_data[3];
|
||||
|
||||
// ת<><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
std::string max_base64Str = max_data.ConvertToBase64();
|
||||
std::string min_base64Str = min_data.ConvertToBase64();
|
||||
std::string avg_base64Str = avg_data.ConvertToBase64();
|
||||
std::string cp95_base64Str = cp95_data.ConvertToBase64();
|
||||
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||
int nPTType = 0;//<2F><><EFBFBD>߷<EFBFBD>ʽ
|
||||
ClientManager::instance().get_point_scale_and_pttype(
|
||||
id, // <20><>ʹ<EFBFBD><CAB9>id
|
||||
pq_data.name, // <20>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
strScale,
|
||||
nPTType);
|
||||
|
||||
// ת<><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
std::string max_base64Str = max_data.ConvertToBase64(nPTType);
|
||||
std::string min_base64Str = min_data.ConvertToBase64(nPTType);
|
||||
std::string avg_base64Str = avg_data.ConvertToBase64(nPTType);
|
||||
std::string cp95_base64Str = cp95_data.ConvertToBase64(nPTType);
|
||||
//std::cout << "New star base64Str0:" << max_base64Str << std::endl;
|
||||
//std::cout << "New del base64Str1:" << avg_data.ConvertToBase64(1) << std::endl;
|
||||
//lnk20250708ʹ<38>ýӿڷ<D3BF><DAB7><EFBFBD>
|
||||
time_t data_time = ConvertToTimestamp(avg_data);
|
||||
|
||||
@@ -339,8 +495,16 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
}
|
||||
}
|
||||
|
||||
std::string base64 = realdata.ConvertToBase64();
|
||||
std::cout << base64 << std::endl;
|
||||
std::string strScale;//<2F><>ѹ<EFBFBD>ȼ<EFBFBD>
|
||||
int nPTType = 0;//<2F><><EFBFBD>߷<EFBFBD>ʽ
|
||||
ClientManager::instance().get_point_scale_and_pttype(
|
||||
id, // <20><>ʹ<EFBFBD><CAB9>id
|
||||
static_cast<unsigned char>(udata[12]), // <20>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
strScale,
|
||||
nPTType);
|
||||
|
||||
std::string base64 = realdata.ConvertToBase64(nPTType);
|
||||
//std::cout << base64 << std::endl;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
@@ -352,6 +516,92 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::READING_EVENTFILE:
|
||||
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::cout << "READING_EVENTFILE state: Processing stats time from " << mac << std::endl;
|
||||
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_File_Download)) {
|
||||
// <20><>ȡ<EFBFBD><C8A1>ǰ֡<C7B0><D6A1><EFBFBD>ţ<EFBFBD>12-15<31>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int current_frame = (static_cast<int>(udata[12]) << 24) |
|
||||
(static_cast<int>(udata[13]) << 16) |
|
||||
(static_cast<int>(udata[14]) << 8) |
|
||||
static_cast<int>(udata[15]);
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>16-19<31>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int total_frames = (static_cast<int>(udata[16]) << 24) |
|
||||
(static_cast<int>(udata[17]) << 16) |
|
||||
(static_cast<int>(udata[18]) << 8) |
|
||||
static_cast<int>(udata[19]);
|
||||
|
||||
//std::cout << "eventfile frames: " << current_frame << "/" << total_frames << std::endl;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD> ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ14λ <20><><EFBFBD><EFBFBD><DFBC>Ժ<EFBFBD><D4BA><EFBFBD>д<EFBFBD><D0B4>
|
||||
const uint8_t* data_ptr = parser.RecvData.data() + 14;
|
||||
size_t data_size = parser.RecvData.size() - 14;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD>¼<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
if (current_frame == 1) {
|
||||
ClientManager::DownloadInfo info;
|
||||
if (ClientManager::instance().parse_download_packet(id, info)) {
|
||||
ClientManager::instance().update_current_filename(id, info.filename);
|
||||
}
|
||||
}
|
||||
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
std::string filename = ClientManager::instance().get_current_filename(id);
|
||||
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().add_file_packet_to_device(id, current_frame, data_ptr, data_size);
|
||||
|
||||
//std::cout << "fileinfo: " << info.filename << "/" << info.current_frame << std::endl;
|
||||
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ<EFBFBD><C8AB>δ<EFBFBD><CEB4>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ģ<EFBFBD><C4A3><EFBFBD>ȫ<EFBFBD><C8AB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
if (current_frame < total_frames) {
|
||||
// δ<><CEB4>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD>״̬,<2C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<DEB8><C4B5>±<EFBFBD><C2B1><EFBFBD>
|
||||
int nextframe = current_frame + 1;
|
||||
auto downloadMsg = generate_downloadfile_message(nextframe, filename);
|
||||
ClientManager::instance().change_device_state(id, DeviceState::READING_EVENTFILE, downloadMsg);
|
||||
}
|
||||
else {
|
||||
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
std::cout << "mac: " << mac << " fileinfo: " << filename <<std::endl;
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>з<EFBFBD>Ƭ
|
||||
auto packets = ClientManager::instance().get_and_clear_file_packets(id);
|
||||
|
||||
// <20>ϲ<EFBFBD><CFB2>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::vector<unsigned char> file_data;
|
||||
for (const auto& packet : packets) {
|
||||
file_data.insert(file_data.end(), packet.begin(), packet.end());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
std::string mac_dir = mac; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
|
||||
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
|
||||
if (mkdir(mac_dir.c_str(), 0777) != 0 && errno != EEXIST) {
|
||||
std::cerr << "Failed to create directory: " << mac_dir << std::endl;
|
||||
}
|
||||
|
||||
std::string path = extract_filename(filename);
|
||||
|
||||
std::string file_path = mac_dir + "/" + path;
|
||||
std::ofstream out_file(file_path, std::ios::binary);
|
||||
if (out_file) {
|
||||
out_file.write(reinterpret_cast<const char*>(file_data.data()),
|
||||
file_data.size());
|
||||
std::cout << "File saved: " << file_path << std::endl;
|
||||
}
|
||||
else {
|
||||
std::cerr << "Failed to save file: " << file_path
|
||||
<< ", Error: " << strerror(errno) << std::endl;
|
||||
}
|
||||
|
||||
//<2F><>ǰ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>أ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>еȺ<D0B5><C8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>״̬<D7B4><CCAC>ֱ<EFBFBD>ӾͻῪʼ<E1BFAA><CABC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD>
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
||||
// <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><F3A3ACB5><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
||||
std::cout << "udata[8]: " << static_cast<int>(udata[8]) << std::endl;
|
||||
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
||||
}
|
||||
break;
|
||||
|
||||
case DeviceState::CUSTOM_ACTION:
|
||||
// <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>״̬
|
||||
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
||||
|
||||
Reference in New Issue
Block a user