2025-06-20 09:25:17 +08:00
|
|
|
|
#include <pthread.h>
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
#include <queue>
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <atomic>
|
2025-07-25 10:47:50 +08:00
|
|
|
|
#include <fstream>
|
|
|
|
|
|
#include <sys/stat.h> // <20><><EFBFBD><EFBFBD>mkdir
|
2025-06-24 10:33:31 +08:00
|
|
|
|
#include <iostream>
|
2025-07-09 09:39:29 +08:00
|
|
|
|
|
|
|
|
|
|
#include "cloudfront/code/interface.h" //lnk20250708
|
|
|
|
|
|
#include "cloudfront/code/rocketmq.h" //lnk20250708
|
|
|
|
|
|
#include "client2.h"
|
|
|
|
|
|
|
2025-06-24 10:33:31 +08:00
|
|
|
|
using namespace std;
|
2025-06-20 09:25:17 +08:00
|
|
|
|
|
|
|
|
|
|
SafeMessageQueue message_queue; // ȫ<><C8AB><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
2025-07-09 09:39:29 +08:00
|
|
|
|
//ʱ<><CAB1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-11 14:12:47 +08:00
|
|
|
|
time_t ConvertToTimestamp(const tagTime& time) {
|
2025-07-09 09:39:29 +08:00
|
|
|
|
struct tm t = {};
|
2025-07-11 14:12:47 +08:00
|
|
|
|
t.tm_year = time.DeviceYear - 1900; // tm_year <20><> 1900 <20><>ʼ<EFBFBD><CABC>
|
|
|
|
|
|
t.tm_mon = time.DeviceMonth - 1; // tm_mon <20><> 0<><30>1<EFBFBD>£<EFBFBD><C2A3><EFBFBD>ʼ
|
|
|
|
|
|
t.tm_mday = time.DeviceDay;
|
|
|
|
|
|
t.tm_hour = time.DeviceHour;
|
|
|
|
|
|
t.tm_min = time.DeviceMinute;
|
|
|
|
|
|
t.tm_sec = time.DeviceSecond;
|
2025-07-09 09:39:29 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣩
|
|
|
|
|
|
return mktime(&t);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
//<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;
|
|
|
|
|
|
}
|
2025-08-05 15:41:04 +08:00
|
|
|
|
|
2025-09-08 14:37:39 +08:00
|
|
|
|
//<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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-25 10:54:09 +08:00
|
|
|
|
void process_received_message(string mac, string id,const char* data, size_t length) {
|
2025-06-20 09:25:17 +08:00
|
|
|
|
// ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-25 10:54:09 +08:00
|
|
|
|
std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl;
|
2025-09-04 15:37:26 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ָ<EFBFBD><D6B8>װ<EFBFBD><D7B0>ˢ<EFBFBD>¶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ͨѶʱ<D1B6><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
ClientManager::instance().set_cloudmessage_time(id);
|
2025-06-25 10:54:09 +08:00
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
//<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (length > 0) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תΪ<D7AA><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա㴦<D4B1><E3B4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
const unsigned char* udata = reinterpret_cast<const unsigned char*>(data);
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><>¼<EFBFBD><C2BC><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
MessageParser parser;
|
|
|
|
|
|
bool bool_msgset = parser.SetMsg(udata, length);
|
2025-06-25 10:54:09 +08:00
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
//<2F>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (udata[0] == 0xEB && udata[1] == 0x90 && udata[2] == 0xEB && udata[3] == 0x90) {
|
|
|
|
|
|
//ͨѶ״̬<D7B4><CCAC><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (udata[8] == 0x01) {
|
|
|
|
|
|
std::cout << "cloud login: " << mac << " state: " << static_cast<int>(udata[16]) << static_cast<int>(udata[17]) << static_cast<int>(udata[18]) << static_cast<int>(udata[19]) << std::endl;
|
|
|
|
|
|
if (udata[19] == 0x10) {
|
|
|
|
|
|
std::cout << "cloud login: " << mac << " state: success!" << std::endl;
|
|
|
|
|
|
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
|
|
|
|
|
|
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼
|
2025-09-04 15:37:26 +08:00
|
|
|
|
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>
|
2025-09-09 13:55:29 +08:00
|
|
|
|
|
|
|
|
|
|
//ClientManager::instance().get_dev_status(id);//<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> ture<72><65><EFBFBD><EFBFBD> false<73><65><EFBFBD><EFBFBD>
|
2025-07-30 13:52:52 +08:00
|
|
|
|
//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_download_action_to_device("D002", "/etc/NPQS570_VX_ZJ_2(V103).icd");//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
2025-08-05 15:41:04 +08:00
|
|
|
|
//ClientManager::instance().get_fixedvalue_action_to_device(id,1);//<2F><><EFBFBD>Ի<EFBFBD>ȡװ<C8A1>ò<EFBFBD><C3B2>㶨ֵ<E3B6A8><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
//ClientManager::instance().get_fixedvaluedes_action_to_device(id);//<2F><><EFBFBD>Ի<EFBFBD>ȡװ<C8A1>ö<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
//ClientManager::instance().set_fixedvalue_action_to_device();//װ<><D7B0><EFBFBD>Ķ<DEB8>ֵ<EFBFBD><D6B5><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ⲿ<EFBFBD>ṩ<EFBFBD><E1B9A9>
|
|
|
|
|
|
//ClientManager::instance().get_interfixedvalue_action_to_device(id);//װ<>û<EFBFBD>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
|
|
|
|
|
|
//ClientManager::instance().get_fixedvalucontrolword_action_to_device(id,1);//<2F><>ȡ 1-<2D>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 2-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//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>
|
2025-09-03 08:49:38 +08:00
|
|
|
|
//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>Ϣ
|
2025-09-04 15:37:26 +08:00
|
|
|
|
|
2025-09-08 14:37:39 +08:00
|
|
|
|
//// <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);
|
2025-07-03 11:13:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (udata[19] == 0x00) {
|
|
|
|
|
|
std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
|
|
|
|
|
|
//װ<>õ<EFBFBD>¼ʧ<C2BC><CAA7> <20>رտͻ<D5BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>20<32><30><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>¼
|
|
|
|
|
|
ClientManager::instance().restart_device(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
std::cout << "cloud login: " << mac << " state: error!"<< std::endl;
|
|
|
|
|
|
//װ<>õ<EFBFBD>¼ʧ<C2BC><CAA7> <20>رտͻ<D5BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>20<32><30><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>¼
|
|
|
|
|
|
ClientManager::instance().restart_device(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
//<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;
|
|
|
|
|
|
}
|
2025-07-25 10:47:50 +08:00
|
|
|
|
//װ<><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>
|
2025-09-03 08:49:38 +08:00
|
|
|
|
NewTaglogbuffer event = NewTaglogbuffer::createFromData(parser.RecvData.data(), parser.RecvData.size());
|
2025-07-25 10:47:50 +08:00
|
|
|
|
|
|
|
|
|
|
// <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;
|
2025-07-03 11:13:16 +08:00
|
|
|
|
|
2025-08-07 18:59:11 +08:00
|
|
|
|
//lnk20250805 <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>¼<EFBFBD><C2BC>¼<EFBFBD><C2BC><EFBFBD>ļ<EFBFBD><C4BC>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
transfer_json_qvvr_data(id,event.head.name,
|
|
|
|
|
|
record.fMagntitude,record.fPersisstime,record.triggerTimeMs,record.nType,record.phase,
|
|
|
|
|
|
"");
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
2025-08-07 18:59:11 +08:00
|
|
|
|
//lnk20250805¼<35><C2BC><EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF>ӿ<EFBFBD>
|
|
|
|
|
|
assign_qvvr_file_list(id, line_id, fullFilenames);
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
// ========== <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;
|
|
|
|
|
|
}
|
2025-07-03 11:13:16 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><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;
|
|
|
|
|
|
}
|
2025-07-10 10:32:29 +08:00
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
switch (currentState) {
|
|
|
|
|
|
case DeviceState::IDLE:
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::cout << "IDLE state: Received active report from " << mac << std::endl;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DeviceState::READING_STATS:
|
|
|
|
|
|
// <20><>ȡͳ<C8A1><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Stat)) {
|
|
|
|
|
|
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> һ֡1K ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//<2F><>ǰ֡δ<D6A1><CEB4>ȫ<EFBFBD><C8AB>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>֡
|
|
|
|
|
|
std::cout << "mac: " << mac << " count" << static_cast<int>(udata[10]) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>Ϣ (<28><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
int current_packet = static_cast<int>(udata[10]); // <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
int total_packets = Stat_PacketNum; // <20><>֡<EFBFBD><D6A1>
|
|
|
|
|
|
std::vector<unsigned char> packet_data(udata, udata + length);
|
|
|
|
|
|
bool complete = ClientManager::instance().add_stat_packet_to_device(
|
|
|
|
|
|
id, packet_data, current_packet, total_packets
|
|
|
|
|
|
);
|
|
|
|
|
|
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ
|
|
|
|
|
|
if (complete) {
|
|
|
|
|
|
// 1. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|
|
|
|
|
auto packets = ClientManager::instance().get_and_clear_stat_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;
|
|
|
|
|
|
MessageParser parser;
|
|
|
|
|
|
|
|
|
|
|
|
for (const auto& packet : packets) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (!parser.SetMsg(packet.data.data(), packet.data.size())) {
|
|
|
|
|
|
std::cerr << "Failed to parse packet " << packet.packet_index
|
|
|
|
|
|
<< " for device " << id << std::endl;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <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(),
|
|
|
|
|
|
parser.RecvData.begin(),
|
|
|
|
|
|
parser.RecvData.end());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 4. <20><>װ tagPqData <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
tagPqData pq_data;
|
|
|
|
|
|
if (!pq_data.SetStructBuf(full_data.data(), full_data.size())) {
|
|
|
|
|
|
std::cerr << "Failed to assemble tagPqData for device " << id << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// <20>ɹ<EFBFBD><C9B9><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> pq_data <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::cout << "Successfully assembled tagPqData for device: "
|
|
|
|
|
|
<< id << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
float fPT = 1.0f;
|
|
|
|
|
|
float fCT = 1.0f;
|
|
|
|
|
|
if (ClientManager::instance().get_pt_ct_ratio(id, pq_data.name, fPT, fCT)) {
|
|
|
|
|
|
// ʹ<>û<EFBFBD>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
|
|
|
|
|
|
tagPqData_Float float_data;
|
|
|
|
|
|
float_data.SetFloatValue(pq_data, fPT, fCT);
|
|
|
|
|
|
float_data.name = pq_data.name;
|
|
|
|
|
|
float_data.Data_Type = pq_data.Data_Type;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>沢<EFBFBD><E6B2A2><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȫ
|
|
|
|
|
|
bool complete = ClientManager::instance().add_float_data_to_device(
|
|
|
|
|
|
id, pq_data.name, pq_data.Data_Type, float_data);
|
|
|
|
|
|
|
|
|
|
|
|
if (complete) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::array<tagPqData_Float, 4> all_data =
|
|
|
|
|
|
ClientManager::instance().get_and_clear_float_data(id, pq_data.name);
|
|
|
|
|
|
|
|
|
|
|
|
if (!all_data.empty()) {
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4<><34><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
tagPqData_Float max_data = all_data[0];
|
|
|
|
|
|
tagPqData_Float min_data = all_data[1];
|
|
|
|
|
|
tagPqData_Float avg_data = all_data[2];
|
|
|
|
|
|
tagPqData_Float cp95_data = all_data[3];
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
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);
|
2025-07-09 09:39:29 +08:00
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
// ת<><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;
|
2025-07-09 09:39:29 +08:00
|
|
|
|
//lnk20250708ʹ<38>ýӿڷ<D3BF><DAB7><EFBFBD>
|
2025-07-11 14:12:47 +08:00
|
|
|
|
time_t data_time = ConvertToTimestamp(avg_data.time);
|
2025-07-09 09:39:29 +08:00
|
|
|
|
|
|
|
|
|
|
std::vector<DataArrayItem> arr;
|
|
|
|
|
|
arr.push_back({1, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1-<2D>ޣ<EFBFBD> 0-<2D><>Rt<52><74>,1-<2D><>Max<61><78>,2-<2D><>Min<69><6E>,3-<2D><>Avg<76><67>,4-<2D><>Cp95<39><35>
|
|
|
|
|
|
data_time, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>ʱ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>1970<37><30><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EBA3AC>Ч<EFBFBD><D0A7><EFBFBD>롰-1<><31>
|
2025-08-08 11:16:38 +08:00
|
|
|
|
0, //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD>꣬<EAA3AC><CEA2><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>롰-1<><31>
|
2025-07-09 09:39:29 +08:00
|
|
|
|
0, //<2F><><EFBFBD>ݱ<EFBFBD>ʶ<EFBFBD><CAB6>1-<2D><>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
max_base64Str});
|
2025-08-08 11:16:38 +08:00
|
|
|
|
arr.push_back({2, data_time, 0, 0, min_base64Str});
|
|
|
|
|
|
arr.push_back({3, data_time, 0, 0, avg_base64Str});
|
|
|
|
|
|
arr.push_back({4, data_time, 0, 0, cp95_base64Str});
|
2025-07-09 09:39:29 +08:00
|
|
|
|
|
|
|
|
|
|
std::string js = generate_json(
|
2025-08-08 11:16:38 +08:00
|
|
|
|
normalize_mac(mac),
|
2025-07-09 09:39:29 +08:00
|
|
|
|
-1, //<2F><>Ӧ<EFBFBD><D3A6><EFBFBD>ı<EFBFBD><C4B1>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>IDӦ<44><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>롰-1<><31>
|
2025-08-08 11:16:38 +08:00
|
|
|
|
1, //<2F>豸Ψһ<CEA8><D2BB>ʶLdid<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>Ndid,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
1, //<2F><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>1 I<><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>Ӧ 2 II<49><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>Ӧ 3 <20><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>/<2F><>Ӧ 4 <20>㲥<EFBFBD><E3B2A5><EFBFBD><EFBFBD>
|
2025-07-09 09:39:29 +08:00
|
|
|
|
0x1302, //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-11 14:12:47 +08:00
|
|
|
|
avg_data.name, //<2F><EFBFBD><DFBC><EFBFBD><EFBFBD>豸ID<49><44>0-<2D><EFBFBD><DFBC>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
|
2025-07-14 13:27:38 +08:00
|
|
|
|
0x04, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<CDB9>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-09 09:39:29 +08:00
|
|
|
|
2, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3>ޡ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1>1<EFBFBD><31><EFBFBD><EFBFBD>ͳ<EFBFBD>ơ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
|
2025-08-08 11:16:38 +08:00
|
|
|
|
1, //<2F><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
|
2025-07-09 09:39:29 +08:00
|
|
|
|
arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
);
|
2025-07-30 13:52:52 +08:00
|
|
|
|
|
2025-07-10 10:32:29 +08:00
|
|
|
|
//std::cout << js << std::endl;
|
2025-07-09 09:39:29 +08:00
|
|
|
|
|
2025-07-30 13:52:52 +08:00
|
|
|
|
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
|
|
|
|
|
|
//std::ofstream outFile("json.txt"); // <20>ȼ<EFBFBD><C8BC><EFBFBD> std::ofstream outFile(filePath, std::ios::out);
|
|
|
|
|
|
|
|
|
|
|
|
//if (outFile.is_open()) { // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// outFile << js; // д<><D0B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
// outFile.close(); // <20>ر<EFBFBD><D8B1>ļ<EFBFBD>
|
|
|
|
|
|
// // <20>ɹ<EFBFBD><C9B9><EFBFBD>ʾ<EFBFBD><CABE>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD>н<EFBFBD><D0BD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>־<EFBFBD><D6BE>
|
|
|
|
|
|
//}
|
|
|
|
|
|
//else {
|
|
|
|
|
|
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
2025-07-09 09:39:29 +08:00
|
|
|
|
queue_data_t data;
|
2025-07-11 14:12:47 +08:00
|
|
|
|
data.monitor_no = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
data.strTopic = TOPIC_STAT;//ͳ<><CDB3>topic
|
2025-07-09 09:39:29 +08:00
|
|
|
|
data.strText = js;
|
2025-07-11 14:12:47 +08:00
|
|
|
|
data.mp_id = "test"; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-09 09:39:29 +08:00
|
|
|
|
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
|
|
|
|
|
queue_data_list.push_back(data);
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-09 09:39:29 +08:00
|
|
|
|
//std::cout << "Base64 Encoded Data (" << max_data.CalculateFloatCount()
|
|
|
|
|
|
// << " floats): " << base64Str << std::endl;
|
2025-07-03 11:13:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ֵʧ<D6B5>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::cerr << "Failed to get PT/CT ratio for device: "
|
|
|
|
|
|
<< mac << " lineno: " << pq_data.name << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4>ȴ<EFBFBD><C8B4><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4>
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DeviceState::READING_STATS_TIME:
|
|
|
|
|
|
// <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>״̬
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_StatTime)) {
|
|
|
|
|
|
std::vector<PointInfo> points;//װ<>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
if (ClientManager::instance().get_device_points(mac, points)) {
|
|
|
|
|
|
// <20>ɹ<EFBFBD><C9B9><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
tagTime t3;
|
|
|
|
|
|
t3.SetStructBuf(parser.RecvData.data(), parser.RecvData.size());
|
|
|
|
|
|
int first = 0;//<2F><>һ<EFBFBD>α<EFBFBD><CEB1><EFBFBD>
|
|
|
|
|
|
for (const auto& point : points) {
|
|
|
|
|
|
for (ushort i = 0; i < 4; i++)//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>95<39><35><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
{
|
|
|
|
|
|
auto sendbuff = generate_statequerystat_message(t3, point.nCpuNo, i);//<2F><>װѯ<D7B0><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
|
|
|
|
|
|
if (first == 0) {
|
|
|
|
|
|
//<2F>״γ<D7B4><CEB3><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD> ֱ<>ӽ<EFBFBD><D3BD><EFBFBD>ǰ״̬<D7B4><CCAC><EFBFBD><EFBFBD> <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
first++;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::READING_STATS, sendbuff);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
//<2F><><EFBFBD>״ν<D7B4><CEBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еȴ<D0B5>
|
|
|
|
|
|
ClientManager::instance().add_action_to_device(id, DeviceState::READING_STATS, sendbuff);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// δ<>ҵ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2025-07-10 10:32:29 +08:00
|
|
|
|
case DeviceState::READING_REALSTAT:
|
|
|
|
|
|
//<2F><>ȡʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_New_3S)) {
|
|
|
|
|
|
unsigned char packet_type = udata[13];
|
2025-07-14 13:27:38 +08:00
|
|
|
|
|
|
|
|
|
|
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
unsigned char cid = udata[12];
|
|
|
|
|
|
|
2025-07-10 10:32:29 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
const uint8_t* data_ptr = parser.RecvData.data() + 4;
|
|
|
|
|
|
size_t data_size = parser.RecvData.size() - 4;
|
|
|
|
|
|
ClientManager::instance().add_realtime_packet_to_device(
|
|
|
|
|
|
id, packet_type, data_ptr, data_size
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (packet_type != 0x06) {
|
|
|
|
|
|
unsigned char next_packet_type = packet_type + 1;
|
|
|
|
|
|
auto sendbuff = generate_realstat_message(
|
|
|
|
|
|
static_cast<unsigned char>(udata[12]),
|
|
|
|
|
|
next_packet_type,
|
|
|
|
|
|
static_cast<unsigned char>(0x01)
|
|
|
|
|
|
);
|
|
|
|
|
|
ClientManager::instance().change_device_state(
|
|
|
|
|
|
id, DeviceState::READING_REALSTAT, sendbuff
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
|
|
|
|
auto packets = ClientManager::instance().get_and_clear_realtime_packets(id);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>01-06<30><36>
|
|
|
|
|
|
std::sort(packets.begin(), packets.end(),
|
|
|
|
|
|
[](const ClientContext::RealtimePacket& a,
|
|
|
|
|
|
const ClientContext::RealtimePacket& b) {
|
|
|
|
|
|
return a.packet_type < b.packet_type;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
RealtagPqDate_float realdata;
|
|
|
|
|
|
// <20><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>
|
|
|
|
|
|
for (const auto& packet : packets) {
|
|
|
|
|
|
switch (packet.packet_type) {
|
|
|
|
|
|
case 0x01:
|
|
|
|
|
|
realdata.ParsePacket1(packet.data.data(), packet.data.size());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 0x02:
|
|
|
|
|
|
realdata.ParsePacket2(packet.data.data(), packet.data.size());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 0x03:
|
|
|
|
|
|
realdata.ParsePacket3(packet.data.data(), packet.data.size());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 0x04:
|
|
|
|
|
|
realdata.ParsePacket4(packet.data.data(), packet.data.size());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 0x05:
|
|
|
|
|
|
realdata.ParsePacket5(packet.data.data(), packet.data.size());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 0x06:
|
|
|
|
|
|
realdata.ParsePacket6(packet.data.data(), packet.data.size());
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-25 10:50:49 +08:00
|
|
|
|
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;
|
2025-07-11 14:12:47 +08:00
|
|
|
|
|
|
|
|
|
|
//lnkʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>ʹ<EFBFBD>ýӿڷ<D3BF><DAB7><EFBFBD>20250711
|
|
|
|
|
|
time_t data_time = ConvertToTimestamp(realdata.time);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<DataArrayItem> arr;
|
|
|
|
|
|
arr.push_back({1, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1-<2D>ޣ<EFBFBD> 0-<2D><>Rt<52><74>,1-<2D><>Max<61><78>,2-<2D><>Min<69><6E>,3-<2D><>Avg<76><67>,4-<2D><>Cp95<39><35>
|
|
|
|
|
|
data_time, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>ʱ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>1970<37><30><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EBA3AC>Ч<EFBFBD><D0A7><EFBFBD>롰-1<><31>
|
2025-08-08 11:16:38 +08:00
|
|
|
|
0, //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD>꣬<EAA3AC><CEA2><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>롰-1<><31>
|
2025-07-11 14:12:47 +08:00
|
|
|
|
0, //<2F><><EFBFBD>ݱ<EFBFBD>ʶ<EFBFBD><CAB6>1-<2D><>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
base64});
|
|
|
|
|
|
std::string js = generate_json(
|
2025-08-08 11:16:38 +08:00
|
|
|
|
normalize_mac(mac),
|
2025-07-11 14:12:47 +08:00
|
|
|
|
-1, //<2F><>Ӧ<EFBFBD><D3A6><EFBFBD>ı<EFBFBD><C4B1>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>IDӦ<44><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>롰-1<><31>
|
2025-08-08 11:16:38 +08:00
|
|
|
|
1, //<2F>豸Ψһ<CEA8><D2BB>ʶLdid<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>Ndid,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
1, //<2F><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>1 I<><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>Ӧ 2 II<49><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>Ӧ 3 <20><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>/<2F><>Ӧ 4 <20>㲥<EFBFBD><E3B2A5><EFBFBD><EFBFBD>
|
2025-07-11 14:12:47 +08:00
|
|
|
|
0x1302, //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-14 13:27:38 +08:00
|
|
|
|
cid, //<2F><EFBFBD><DFBC><EFBFBD><EFBFBD>豸ID<49><44>0-<2D><EFBFBD><DFBC>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
|
|
|
|
|
|
0x04, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<CDB9>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-07-11 14:12:47 +08:00
|
|
|
|
1, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3>ޡ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1>1<EFBFBD><31><EFBFBD><EFBFBD>ͳ<EFBFBD>ơ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
|
2025-08-08 11:16:38 +08:00
|
|
|
|
1, //<2F><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
|
2025-07-11 14:12:47 +08:00
|
|
|
|
arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
);
|
|
|
|
|
|
//std::cout << js << std::en
|
|
|
|
|
|
queue_data_t data;
|
|
|
|
|
|
data.monitor_no = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
data.strTopic = TOPIC_RTDATA; //ʵʱtopic
|
|
|
|
|
|
data.strText = js;
|
|
|
|
|
|
data.mp_id = "test"; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
|
|
|
|
|
|
queue_data_list.push_back(data);
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
|
2025-07-10 10:32:29 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::READING_REALSTAT));
|
2025-07-10 10:32:29 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
case DeviceState::READING_EVENTFILE:
|
|
|
|
|
|
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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>
|
2025-07-30 13:52:52 +08:00
|
|
|
|
std::string wavefile = "wave"; // ʹ<><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(wavefile.c_str(), 0777) != 0 && errno != EEXIST) {
|
|
|
|
|
|
std::cerr << "Failed to create directory: " << wavefile << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
std::string mac_dir = wavefile + "/" + mac; // ʹ<><CAB9>MAC<41><43>ַ<EFBFBD><D6B7>ΪĿ¼<C4BF><C2BC>
|
2025-07-25 10:47:50 +08:00
|
|
|
|
// <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;
|
2025-08-07 18:59:11 +08:00
|
|
|
|
|
|
|
|
|
|
//lnk20250805<30>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ͽӿ<CDBD>
|
|
|
|
|
|
update_qvvr_file_download(file_path, id);
|
2025-07-25 10:47:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
std::cerr << "Failed to save file: " << file_path
|
|
|
|
|
|
<< ", Error: " << strerror(errno) << std::endl;
|
2025-09-05 16:28:26 +08:00
|
|
|
|
|
|
|
|
|
|
// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>֪ͨ<CDA8>ƶ<EFBFBD>
|
|
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::BAD_REQUEST),
|
|
|
|
|
|
id, static_cast<int>(DeviceState::READING_EVENTFILE));
|
2025-07-25 10:47:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<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>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::READING_EVENTFILE));
|
2025-07-25 10:47:50 +08:00
|
|
|
|
// <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>
|
2025-07-30 13:52:52 +08:00
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DeviceState::READING_FILEMENU:
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD>ļ<EFBFBD>Ŀ¼
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_FileDir)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD>С
|
|
|
|
|
|
const size_t struct_size = sizeof(tag_dir_info);
|
|
|
|
|
|
const uint8_t* data_ptr = parser.RecvData.data();
|
|
|
|
|
|
size_t data_size = parser.RecvData.size();
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<tag_dir_info> FileList;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
for (size_t i = 0; i < data_size; i += struct_size) {
|
|
|
|
|
|
if (i + struct_size > data_size) break;
|
|
|
|
|
|
|
|
|
|
|
|
tag_dir_info dir_info;
|
|
|
|
|
|
memcpy(&dir_info, data_ptr + i, struct_size);
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ֽ<EFBFBD><D6BD><EFBFBD>ת<EFBFBD><D7AA> (<28><><EFBFBD><EFBFBD> -> С<><D0A1>)
|
|
|
|
|
|
dir_info.flag = ntohl(dir_info.flag);
|
|
|
|
|
|
dir_info.size = ntohl(dir_info.size);
|
|
|
|
|
|
|
|
|
|
|
|
std::string gbk_name(dir_info.name, strnlen(dir_info.name, sizeof(dir_info.name)));
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ӡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
std::cout << "file name:" << gbk_name << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5>ļ<EFBFBD><C4BC>б<EFBFBD>
|
|
|
|
|
|
FileList.push_back(dir_info);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
|
2025-09-02 14:58:19 +08:00
|
|
|
|
send_file_list(id,FileList);//lnk20250813
|
2025-07-30 13:52:52 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
2025-09-08 14:37:39 +08:00
|
|
|
|
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;
|
2025-07-30 13:52:52 +08:00
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::READING_FILEMENU));
|
2025-07-30 13:52:52 +08:00
|
|
|
|
// <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);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DeviceState::READING_FILEDATA:
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>̬<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ع<EFBFBD><D8B9><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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]);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
//<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_FILEDATA, 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 wavefile = "download"; // ʹ<><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(wavefile.c_str(), 0777) != 0 && errno != EEXIST) {
|
|
|
|
|
|
std::cerr << "Failed to create directory: " << wavefile << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
std::string mac_dir = wavefile + "/" + 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;
|
2025-09-02 14:58:19 +08:00
|
|
|
|
|
|
|
|
|
|
//ʹ<>ýӿ<C3BD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>lnk20250826
|
|
|
|
|
|
std::string filename;
|
2025-09-05 16:28:26 +08:00
|
|
|
|
SendFileWeb(WEB_FILEUPLOAD, file_path, file_path, filename);
|
2025-09-02 14:58:19 +08:00
|
|
|
|
std::cout << "File upload: " << filename << std::endl;
|
|
|
|
|
|
|
2025-07-30 13:52:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
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>
|
2025-09-05 16:28:26 +08:00
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::READING_FILEDATA);
|
2025-07-30 13:52:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::READING_FILEDATA));
|
2025-07-30 13:52:52 +08:00
|
|
|
|
// <20><><EFBFBD><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>
|
2025-07-25 10:47:50 +08:00
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
case DeviceState::READING_FIXEDVALUE:
|
|
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>㶨ֵ<E3B6A8><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_FixValue)) {
|
|
|
|
|
|
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>㹻<EFBFBD><E3B9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (parser.RecvData.size() < 1) {
|
|
|
|
|
|
std::cout << "Invalid fix value data length" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>)
|
|
|
|
|
|
uint8_t monitor_index = parser.RecvData[0];
|
|
|
|
|
|
std::cout << "Monitor Index: " << static_cast<int>(monitor_index) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> (<28>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
size_t bufflen = parser.RecvData.size() - 1;
|
|
|
|
|
|
const size_t structlen = 4; // ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ4<D5BC>ֽ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
|
|
|
|
|
|
if (bufflen % structlen != 0) {
|
|
|
|
|
|
std::cout << "Invalid fix value data length: " << bufflen
|
|
|
|
|
|
<< " (not multiple of 4)" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<float> fList;
|
|
|
|
|
|
fList.reserve(bufflen / structlen); // Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>ӵڶ<D3B5><DAB6><EFBFBD><EFBFBD>ֽڿ<D6BD>ʼ)
|
|
|
|
|
|
for (size_t i = 1; i < parser.RecvData.size(); i += structlen) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint8_t bytes[4] = {
|
|
|
|
|
|
parser.RecvData[i],
|
|
|
|
|
|
parser.RecvData[i + 1],
|
|
|
|
|
|
parser.RecvData[i + 2],
|
|
|
|
|
|
parser.RecvData[i + 3]
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ת<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> (<28><><EFBFBD><EFBFBD>תС<D7AA><D0A1>)
|
|
|
|
|
|
std::swap(bytes[0], bytes[3]);
|
|
|
|
|
|
std::swap(bytes[1], bytes[2]);
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊfloat
|
|
|
|
|
|
float value;
|
|
|
|
|
|
memcpy(&value, bytes, sizeof(float));
|
|
|
|
|
|
fList.push_back(value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::cout << "Parsed " << fList.size() << " fix values:" << std::endl;
|
|
|
|
|
|
for (size_t j = 0; j < fList.size(); ++j) {
|
|
|
|
|
|
std::cout << " Value[" << j << "]: " << fList[j] << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 14:58:19 +08:00
|
|
|
|
//<2F>洢<EFBFBD><E6B4A2>ֵlnk20250827
|
2025-09-05 16:28:26 +08:00
|
|
|
|
save_set_value(id, monitor_index, fList);
|
2025-09-02 14:58:19 +08:00
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
//<2F><><EFBFBD>Զ<EFBFBD>ֵ<EFBFBD>Ĺ<DEB8><C4B9><EFBFBD>
|
|
|
|
|
|
//ClientManager::instance().set_fixedvalue_action_to_device(id, monitor_index, fList);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ֵ<EFBFBD><D6B5>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR),id,static_cast<int>(DeviceState::READING_FIXEDVALUE));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ֵ<EFBFBD><D6B5><EFBFBD><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DeviceState::READING_FIXEDVALUEDES:
|
|
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>㶨ֵ<E3B6A8><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_FixDes)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD>С
|
|
|
|
|
|
const size_t structlen = sizeof(DZ_TAB_STRUCT);
|
|
|
|
|
|
const size_t bufflen = parser.RecvData.size();
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (bufflen == 0 || bufflen % structlen != 0) {
|
|
|
|
|
|
std::cerr << "Invalid fixdes data length: " << bufflen
|
|
|
|
|
|
<< " (expected multiple of " << structlen << ")" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<DZ_TAB_STRUCT> dz_list;
|
|
|
|
|
|
dz_list.reserve(bufflen / structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
|
|
|
|
|
for (size_t i = 0, j = 1; i < bufflen; i += structlen, j++) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t> buff(structlen);
|
|
|
|
|
|
memcpy(buff.data(), parser.RecvData.data() + i, structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// ִ<><D6B4><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C#<23><>ͬ<EFBFBD><CDAC>
|
|
|
|
|
|
ReversalBuff(buff.data(), 0, 2); // LN_Num
|
|
|
|
|
|
ReversalBuff(buff.data(), 2, 2); // DZ_Num
|
|
|
|
|
|
ReversalBuff(buff.data(), 70, 2); // DZ_Type
|
|
|
|
|
|
ReversalBuff(buff.data(), 72, 4); // DZ_Min
|
|
|
|
|
|
ReversalBuff(buff.data(), 76, 4); // DZ_Max
|
|
|
|
|
|
ReversalBuff(buff.data(), 80, 4); // DZ_Default
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
|
|
|
|
|
DZ_TAB_STRUCT dz_info;
|
|
|
|
|
|
memcpy(&dz_info, buff.data(), structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> - <20><><EFBFBD>ҵ<EFBFBD>һ<EFBFBD><D2BB>'\0'<27><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
auto find_string_end = [](const char* arr, size_t max_len) -> size_t {
|
|
|
|
|
|
for (size_t i = 0; i < max_len; i++) {
|
|
|
|
|
|
if (arr[i] == '\0') return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
return max_len;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡԭʼGBK<42>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
size_t name_len = find_string_end(dz_info.DZ_Name, sizeof(dz_info.DZ_Name));
|
|
|
|
|
|
size_t unit_len = find_string_end(dz_info.DZ_UNIT, sizeof(dz_info.DZ_UNIT));
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊ<EFBFBD>ɴ<EFBFBD>ӡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>(GBK<42><4B><EFBFBD><EFBFBD>)
|
|
|
|
|
|
std::string dz_name(dz_info.DZ_Name, name_len);
|
|
|
|
|
|
std::string dz_unit(dz_info.DZ_UNIT, unit_len);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
dz_list.push_back(dz_info);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
|
|
|
|
|
|
std::cout << "Parsed DZ entry #" << j << ": "
|
|
|
|
|
|
<< "LN=" << dz_info.LN_Num
|
|
|
|
|
|
<< ", ID=" << dz_info.DZ_Num
|
|
|
|
|
|
<< ", Name=" << dz_name
|
|
|
|
|
|
<< ", Type=" << dz_info.DZ_Type
|
|
|
|
|
|
<< ", Min=" << dz_info.DZ_Min
|
|
|
|
|
|
<< ", Max=" << dz_info.DZ_Max
|
|
|
|
|
|
<< ", Default=" << dz_info.DZ_Default
|
|
|
|
|
|
<< ", Unit=" << dz_unit << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 14:58:19 +08:00
|
|
|
|
//lnk20250828
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>)
|
|
|
|
|
|
uint8_t monitor_index = parser.RecvData[0];
|
|
|
|
|
|
std::cout << "Monitor Index: " << static_cast<int>(monitor_index) << std::endl;
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_set_value_reply(id, monitor_index, dz_list);
|
2025-08-05 15:41:04 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR),id,static_cast<int>(DeviceState::READING_FIXEDVALUEDES));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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::SET_FIXEDVALUE:
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ֵ
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewACK)) {
|
|
|
|
|
|
std::cout << "set success" << mac << std::endl;
|
2025-09-02 14:58:19 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><>Ӧlnk20250828
|
|
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::OK),id,static_cast<int>(DeviceState::SET_FIXEDVALUE));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD>óɹ<C3B3><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewNACK)) {
|
|
|
|
|
|
std::cout << "set error" << mac << std::endl;
|
|
|
|
|
|
// װ<>÷<EFBFBD><C3B7><EFBFBD>Ӧ<EFBFBD>𣬶<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
2025-09-04 20:59:17 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><>Ӧlnk20250828
|
|
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::BAD_REQUEST),id,static_cast<int>(DeviceState::SET_FIXEDVALUE));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ֵʧ<D6B5>ܣ<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 {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ֵʧ<D6B5>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EEB9A4><EFBFBD><EFBFBD>
|
2025-09-04 20:59:17 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><>Ӧlnk20250828
|
|
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR),id,static_cast<int>(DeviceState::SET_FIXEDVALUE));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DeviceState::READING_INTERFIXEDVALUE:
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_InterFix)) {
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|
|
|
|
|
size_t bufflen = parser.RecvData.size();
|
|
|
|
|
|
const size_t structlen = 2; // ÿ<><C3BF>ushortռ2<D5BC>ֽ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<ushort> fList;
|
|
|
|
|
|
fList.reserve(bufflen / structlen); // Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>ushort<72><74><EFBFBD><EFBFBD>
|
|
|
|
|
|
for (size_t i = 0; i < bufflen; i += structlen) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint8_t bytes[2] = {
|
|
|
|
|
|
parser.RecvData[i],
|
|
|
|
|
|
parser.RecvData[i + 1]
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ת<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> (<28><><EFBFBD><EFBFBD>תС<D7AA><D0A1>)
|
|
|
|
|
|
std::swap(bytes[0], bytes[1]);
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊushort - ʹ<><CAB9>memcpyȷ<79><C8B7><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
|
|
|
|
ushort value;
|
|
|
|
|
|
memcpy(&value, bytes, sizeof(ushort));
|
|
|
|
|
|
fList.push_back(value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
|
|
|
|
|
|
std::cout << "Parsed " << fList.size() << " internal fixed values:" << std::endl;
|
|
|
|
|
|
for (size_t j = 0; j < fList.size(); ++j) {
|
|
|
|
|
|
std::cout << " Value[" << j << "]: " << fList[j] << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-02 14:58:19 +08:00
|
|
|
|
//<2F>洢<EFBFBD><E6B4A2>ֵlnk20250827
|
2025-09-05 16:28:26 +08:00
|
|
|
|
save_internal_value(id, fList);
|
2025-09-02 14:58:19 +08:00
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
//<2F>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD>IJ<DEB8><C4B2><EFBFBD>
|
|
|
|
|
|
//ClientManager::instance().set_interfixedvalue_action_to_device(id, fList);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
|
|
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::READING_INTERFIXEDVALUE));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><>ȡװ<C8A1><D7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵʧ<D6B5>ܣ<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::READING_INTERFIXEDVALUEDES:
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_InterFixDes)) {
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t>& recvData = parser.RecvData;
|
|
|
|
|
|
size_t bufflen = recvData.size();
|
|
|
|
|
|
const size_t structlen = sizeof(NameFixValue);
|
|
|
|
|
|
|
|
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<NameFixValue> fixValueList;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD>
|
|
|
|
|
|
if (bufflen == 0 || bufflen % structlen != 0) {
|
|
|
|
|
|
std::cerr << "Invalid internal fixdes data length: " << bufflen
|
|
|
|
|
|
<< " (expected multiple of " << structlen << ")" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
size_t structCount = bufflen / structlen;
|
|
|
|
|
|
fixValueList.reserve(structCount);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>нṹ<D0BD><E1B9B9>
|
|
|
|
|
|
for (size_t i = 0, k = 1; i < bufflen; i += structlen, k++)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>Ƶ<EFBFBD>ǰ<EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t> buff(structlen);
|
|
|
|
|
|
memcpy(buff.data(), recvData.data() + i, structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DataType (ƫ<><C6AB>22, 2<>ֽ<EFBFBD>)
|
|
|
|
|
|
ReversalBuff(buff.data(), 22, 2);
|
|
|
|
|
|
// <20><>ת<EFBFBD><D7AA>СֵMinValue (ƫ<><C6AB>24, 2<>ֽ<EFBFBD>)
|
|
|
|
|
|
ReversalBuff(buff.data(), 24, 2);
|
|
|
|
|
|
// <20><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ֵMaxValue (ƫ<><C6AB>26, 2<>ֽ<EFBFBD>)
|
|
|
|
|
|
ReversalBuff(buff.data(), 26, 2);
|
|
|
|
|
|
// <20><>תȱʡֵDefaultValue (ƫ<><C6AB>28, 2<>ֽ<EFBFBD>)
|
|
|
|
|
|
ReversalBuff(buff.data(), 28, 2);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
|
|
|
|
|
NameFixValue dz_info;
|
|
|
|
|
|
memcpy(&dz_info, buff.data(), structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|
|
|
|
|
fixValueList.push_back(dz_info);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string fixName(dz_info.sFixValueName,
|
|
|
|
|
|
strnlen(dz_info.sFixValueName, sizeof(dz_info.sFixValueName)));
|
|
|
|
|
|
std::string dimension(dz_info.sDimension,
|
|
|
|
|
|
strnlen(dz_info.sDimension, sizeof(dz_info.sDimension)));
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << "Parsed internal fix value #" << k << ": "
|
|
|
|
|
|
<< "Name=" << fixName << ", "
|
|
|
|
|
|
<< "Type=" << dz_info.DataType << ", "
|
|
|
|
|
|
<< "Min=" << dz_info.MinValue << ", "
|
|
|
|
|
|
<< "Max=" << dz_info.MaxValue << ", "
|
|
|
|
|
|
<< "Default=" << dz_info.DefaultValue << ", "
|
|
|
|
|
|
<< "Unit=" << dimension << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-05 16:28:26 +08:00
|
|
|
|
//lnk20250905
|
|
|
|
|
|
save_internal_info(id, fixValueList);
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
//<2F>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<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 {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
|
|
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::READING_INTERFIXEDVALUEDES));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><>ȡװ<C8A1><D7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<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::READING_CONTROLWORD:
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_InterFixDes)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD>С
|
|
|
|
|
|
const size_t structlen = sizeof(DZ_kzz_bit);
|
|
|
|
|
|
const size_t bufflen = parser.RecvData.size();
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (bufflen == 0 || bufflen % structlen != 0) {
|
|
|
|
|
|
std::cerr << "Invalid control word data length: " << bufflen
|
|
|
|
|
|
<< " (expected multiple of " << structlen << ")" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<DZ_kzz_bit> control_words;
|
|
|
|
|
|
control_words.reserve(bufflen / structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
|
|
|
|
|
for (size_t i = 0; i < bufflen; i += structlen) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t> buff(structlen);
|
|
|
|
|
|
memcpy(buff.data(), parser.RecvData.data() + i, structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
|
|
|
|
|
DZ_kzz_bit dz_info;
|
|
|
|
|
|
memcpy(&dz_info, buff.data(), structlen);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> - <20><><EFBFBD>ҵ<EFBFBD>һ<EFBFBD><D2BB>'\0'<27><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
auto find_string_end = [](const char* arr, size_t max_len) -> size_t {
|
|
|
|
|
|
for (size_t i = 0; i < max_len; i++) {
|
|
|
|
|
|
if (arr[i] == '\0') return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
return max_len;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡԭʼGBK<42>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
size_t name_len = find_string_end(dz_info.kzz_bit, sizeof(dz_info.kzz_bit));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ֱ<>Ӵ洢ԭʼGBK<42><4B><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ת<EFBFBD><D7AA>UTF-8<><38>
|
|
|
|
|
|
control_words.push_back(dz_info);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
|
|
|
|
|
|
std::string gbk_name(dz_info.kzz_bit,name_len);
|
|
|
|
|
|
std::cout << "Control word: " << gbk_name
|
|
|
|
|
|
<< ", enable: " << static_cast<int>(dz_info.bit_enable) << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_internal_value_reply(id, control_words);
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::READING_CONTROLWORD));
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><>ȡװ<C8A1>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<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::SET_INTERFIXEDVALUE:
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewACK)) {
|
|
|
|
|
|
std::cout << "set success" << mac << std::endl;
|
|
|
|
|
|
//<2F>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>óɹ<C3B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::OK), id, static_cast<int>(DeviceState::SET_INTERFIXEDVALUE));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
// װ<>÷<EFBFBD><C3B7><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::BAD_REQUEST), id, static_cast<int>(DeviceState::SET_INTERFIXEDVALUE));
|
|
|
|
|
|
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵʧ<D6B5>ܣ<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 {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
2025-09-05 16:28:26 +08:00
|
|
|
|
send_reply_to_cloud(static_cast<int>(ResponseCode::INTERNAL_ERROR), id, static_cast<int>(DeviceState::SET_INTERFIXEDVALUE));
|
2025-08-05 15:41:04 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵʧ<D6B5>ܣ<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;
|
|
|
|
|
|
|
2025-09-03 08:49:38 +08:00
|
|
|
|
case DeviceState::READING_RUNNINGINFORMATION_1:
|
|
|
|
|
|
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_RunningInformation)) {
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t>& recvData = parser.RecvData;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
|
|
|
|
|
if (recvData.size() < 2) {
|
|
|
|
|
|
std::cerr << "Invalid running information data: too short ("
|
|
|
|
|
|
<< recvData.size() << " bytes)" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>Ч<EFBFBD>غɳ<D8BA><C9B3><EFBFBD>
|
|
|
|
|
|
size_t payloadLength = recvData.size() - 2;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t> payloadBytes(payloadLength);
|
|
|
|
|
|
if (recvData.size() >= 2 + payloadLength) {
|
|
|
|
|
|
std::copy(recvData.begin() + 2, recvData.begin() + 2 + payloadLength, payloadBytes.begin());
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
std::cerr << "Invalid payload length: " << payloadLength
|
|
|
|
|
|
<< ", available: " << (recvData.size() - 2) << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>ΪUTF-8<>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
std::string payload(payloadBytes.begin(), payloadBytes.end());
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>New_MachMessage<67>Ľṹ<C4BD><E1B9B9>
|
|
|
|
|
|
struct RunningInformation {
|
|
|
|
|
|
std::string Time;
|
|
|
|
|
|
std::string CpuLoad;
|
|
|
|
|
|
std::string FreeMemory;
|
|
|
|
|
|
std::string TotalMemory;
|
|
|
|
|
|
std::string FreeStorage;
|
|
|
|
|
|
std::string TotalStorage;
|
|
|
|
|
|
std::string HardTimeSync;
|
|
|
|
|
|
std::string SntpTimeSync;
|
|
|
|
|
|
std::string CloudTimeSync;
|
|
|
|
|
|
std::string SignalStrength;
|
|
|
|
|
|
} result;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
auto trimQuotes = [](const std::string& str) -> std::string {
|
|
|
|
|
|
if (str.size() >= 2 && str.front() == '"' && str.back() == '"') {
|
|
|
|
|
|
return str.substr(1, str.size() - 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
return str;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
auto processCpuLoad = [](const std::string& cpuValue) -> std::string {
|
|
|
|
|
|
if (cpuValue.empty()) return cpuValue;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>"39_38"<22><>
|
|
|
|
|
|
if (cpuValue.find('_') != std::string::npos) {
|
|
|
|
|
|
std::vector<std::string> cores;
|
|
|
|
|
|
size_t start = 0, end;
|
|
|
|
|
|
while ((end = cpuValue.find('_', start)) != std::string::npos) {
|
|
|
|
|
|
cores.push_back(cpuValue.substr(start, end - start));
|
|
|
|
|
|
start = end + 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
cores.push_back(cpuValue.substr(start)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
for (auto& core : cores) {
|
|
|
|
|
|
// <20>ֶ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>std::stoi<6F><69>
|
|
|
|
|
|
const char* str = core.c_str();
|
|
|
|
|
|
char* endptr = nullptr;
|
|
|
|
|
|
long value = strtol(str, &endptr, 10);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (endptr != str && *endptr == '\0') {
|
|
|
|
|
|
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χֵ
|
|
|
|
|
|
if (value > 100) value /= 100;
|
|
|
|
|
|
core = std::to_string(value);
|
|
|
|
|
|
}
|
|
|
|
|
|
// ת<><D7AA>ʧ<EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>ԭֵ
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::string result;
|
|
|
|
|
|
for (size_t i = 0; i < cores.size(); ++i) {
|
|
|
|
|
|
if (i > 0) result += '_';
|
|
|
|
|
|
result += cores[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ
|
|
|
|
|
|
else {
|
|
|
|
|
|
const char* str = cpuValue.c_str();
|
|
|
|
|
|
char* endptr = nullptr;
|
|
|
|
|
|
long value = strtol(str, &endptr, 10);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (endptr != str && *endptr == '\0') {
|
|
|
|
|
|
if (value > 100) value /= 100;
|
|
|
|
|
|
return std::to_string(value);
|
|
|
|
|
|
}
|
|
|
|
|
|
return cpuValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ָ<EFBFBD><D6B8>ֶβ<D6B6><CEB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<std::string> fields;
|
|
|
|
|
|
size_t start = 0;
|
|
|
|
|
|
while (start < payload.length()) {
|
|
|
|
|
|
size_t end = payload.find(',', start);
|
|
|
|
|
|
if (end == std::string::npos) {
|
|
|
|
|
|
fields.push_back(payload.substr(start));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
fields.push_back(payload.substr(start, end - start));
|
|
|
|
|
|
start = end + 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (const auto& field : fields) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
|
|
|
|
|
if (field.empty()) continue;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ð<EFBFBD><C3B0>λ<EFBFBD><CEBB>
|
|
|
|
|
|
size_t colonPos = field.find(':');
|
|
|
|
|
|
if (colonPos == std::string::npos || colonPos == 0 || colonPos == field.length() - 1) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ָ<EFBFBD><D6B8><EFBFBD>ֵ<EFBFBD><D6B5>
|
|
|
|
|
|
std::string key = field.substr(0, colonPos);
|
|
|
|
|
|
std::string value = field.substr(colonPos + 1);
|
|
|
|
|
|
|
|
|
|
|
|
// ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD>Ŀհ<C4BF>
|
|
|
|
|
|
size_t keyStart = key.find_first_not_of(" \t");
|
|
|
|
|
|
size_t keyEnd = key.find_last_not_of(" \t");
|
|
|
|
|
|
if (keyStart != std::string::npos && keyEnd != std::string::npos) {
|
|
|
|
|
|
key = key.substr(keyStart, keyEnd - keyStart + 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ȥ<><C8A5>ֵ<EFBFBD>Ŀհ<C4BF>
|
|
|
|
|
|
size_t valStart = value.find_first_not_of(" \t");
|
|
|
|
|
|
size_t valEnd = value.find_last_not_of(" \t");
|
|
|
|
|
|
if (valStart != std::string::npos && valEnd != std::string::npos) {
|
|
|
|
|
|
value = value.substr(valStart, valEnd - valStart + 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ȥ<><C8A5>ֵ<EFBFBD><D6B5><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (value.size() >= 2 && value.front() == '"' && value.back() == '"') {
|
|
|
|
|
|
value = value.substr(1, value.size() - 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
|
const char* keyStr = key.c_str();
|
|
|
|
|
|
char* endPtr = nullptr;
|
|
|
|
|
|
long fieldId = strtol(keyStr, &endPtr, 10);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (endPtr != keyStr && *endPtr == '\0' && fieldId >= 1 && fieldId <= 10) {
|
|
|
|
|
|
switch (fieldId) {
|
|
|
|
|
|
case 1: result.Time = value; break;
|
|
|
|
|
|
case 2: result.CpuLoad = value; break;
|
|
|
|
|
|
case 3: result.FreeMemory = value; break;
|
|
|
|
|
|
case 4: result.TotalMemory = value; break;
|
|
|
|
|
|
case 5: result.FreeStorage = value; break;
|
|
|
|
|
|
case 6: result.TotalStorage = value; break;
|
|
|
|
|
|
case 7: result.HardTimeSync = value; break;
|
|
|
|
|
|
case 8: result.SntpTimeSync = value; break;
|
|
|
|
|
|
case 9: result.CloudTimeSync = value; break;
|
|
|
|
|
|
case 10: result.SignalStrength = value; break;
|
|
|
|
|
|
default: break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><E2B4A6>CPU<50><55><EFBFBD><EFBFBD>
|
|
|
|
|
|
result.CpuLoad = processCpuLoad(result.CpuLoad);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD>п<EFBFBD><D0BF>滻Ϊ<E6BBBB><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD>
|
|
|
|
|
|
std::cout << "Device Running Information (" << mac << "):\n"
|
|
|
|
|
|
<< " Time: " << result.Time << "\n"
|
|
|
|
|
|
<< " CPU Load: " << result.CpuLoad << "\n"
|
|
|
|
|
|
<< " Memory: " << result.FreeMemory << "/" << result.TotalMemory << " MB\n"
|
|
|
|
|
|
<< " Storage: " << result.FreeStorage << "/" << result.TotalStorage << " GB\n"
|
|
|
|
|
|
<< " Time Sync: Hard=" << result.HardTimeSync
|
|
|
|
|
|
<< ", SNTP=" << result.SntpTimeSync
|
|
|
|
|
|
<< ", Cloud=" << result.CloudTimeSync << "\n"
|
|
|
|
|
|
<< " Signal: " << result.SignalStrength << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ɹ<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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)ʧ<>ܣ<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::READING_RUNNINGINFORMATION_2:
|
|
|
|
|
|
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>Ͳ<EFBFBD><CDB2><EFBFBD>
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_RunningInformation)) {
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t>& recvData = parser.RecvData;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
|
|
|
|
|
if (recvData.size() < 2) {
|
|
|
|
|
|
std::cerr << "Invalid running information data: too short ("
|
|
|
|
|
|
<< recvData.size() << " bytes)" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>Ч<EFBFBD>غɳ<D8BA><C9B3><EFBFBD>
|
|
|
|
|
|
size_t payloadLength = recvData.size() - 2;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t> payloadBytes(payloadLength);
|
|
|
|
|
|
if (recvData.size() >= 2 + payloadLength) {
|
|
|
|
|
|
std::copy(recvData.begin() + 2, recvData.begin() + 2 + payloadLength, payloadBytes.begin());
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
std::cerr << "Invalid payload length: " << payloadLength
|
|
|
|
|
|
<< ", available: " << (recvData.size() - 2) << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>ΪUTF-8<>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
std::string payload(payloadBytes.begin(), payloadBytes.end());
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>New_MachMessage<67>Ľṹ<C4BD><E1B9B9>
|
|
|
|
|
|
struct RunningInformation {
|
|
|
|
|
|
std::string Time;
|
|
|
|
|
|
std::string CpuLoad;
|
|
|
|
|
|
std::string FreeMemory;
|
|
|
|
|
|
std::string TotalMemory;
|
|
|
|
|
|
std::string FreeStorage;
|
|
|
|
|
|
std::string TotalStorage;
|
|
|
|
|
|
std::string HardTimeSync;
|
|
|
|
|
|
std::string SntpTimeSync;
|
|
|
|
|
|
std::string CloudTimeSync;
|
|
|
|
|
|
std::string SignalStrength;
|
|
|
|
|
|
} result;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
auto trimQuotes = [](const std::string& str) -> std::string {
|
|
|
|
|
|
if (str.size() >= 2 && str.front() == '"' && str.back() == '"') {
|
|
|
|
|
|
return str.substr(1, str.size() - 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
return str;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
auto processCpuLoad = [](const std::string& cpuValue) -> std::string {
|
|
|
|
|
|
if (cpuValue.empty()) return cpuValue;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>"39_38"<22><>
|
|
|
|
|
|
if (cpuValue.find('_') != std::string::npos) {
|
|
|
|
|
|
std::vector<std::string> cores;
|
|
|
|
|
|
size_t start = 0, end;
|
|
|
|
|
|
while ((end = cpuValue.find('_', start)) != std::string::npos) {
|
|
|
|
|
|
cores.push_back(cpuValue.substr(start, end - start));
|
|
|
|
|
|
start = end + 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
cores.push_back(cpuValue.substr(start)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
for (auto& core : cores) {
|
|
|
|
|
|
// <20>ֶ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>std::stoi<6F><69>
|
|
|
|
|
|
const char* str = core.c_str();
|
|
|
|
|
|
char* endptr = nullptr;
|
|
|
|
|
|
long value = strtol(str, &endptr, 10);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (endptr != str && *endptr == '\0') {
|
|
|
|
|
|
// У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χֵ
|
|
|
|
|
|
if (value > 100) value /= 100;
|
|
|
|
|
|
core = std::to_string(value);
|
|
|
|
|
|
}
|
|
|
|
|
|
// ת<><D7AA>ʧ<EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>ԭֵ
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::string result;
|
|
|
|
|
|
for (size_t i = 0; i < cores.size(); ++i) {
|
|
|
|
|
|
if (i > 0) result += '_';
|
|
|
|
|
|
result += cores[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ
|
|
|
|
|
|
else {
|
|
|
|
|
|
const char* str = cpuValue.c_str();
|
|
|
|
|
|
char* endptr = nullptr;
|
|
|
|
|
|
long value = strtol(str, &endptr, 10);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (endptr != str && *endptr == '\0') {
|
|
|
|
|
|
if (value > 100) value /= 100;
|
|
|
|
|
|
return std::to_string(value);
|
|
|
|
|
|
}
|
|
|
|
|
|
return cpuValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ָ<EFBFBD><D6B8>ֶβ<D6B6><CEB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<std::string> fields;
|
|
|
|
|
|
size_t start = 0;
|
|
|
|
|
|
while (start < payload.length()) {
|
|
|
|
|
|
size_t end = payload.find(',', start);
|
|
|
|
|
|
if (end == std::string::npos) {
|
|
|
|
|
|
fields.push_back(payload.substr(start));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
fields.push_back(payload.substr(start, end - start));
|
|
|
|
|
|
start = end + 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (const auto& field : fields) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
|
|
|
|
|
if (field.empty()) continue;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ð<EFBFBD><C3B0>λ<EFBFBD><CEBB>
|
|
|
|
|
|
size_t colonPos = field.find(':');
|
|
|
|
|
|
if (colonPos == std::string::npos || colonPos == 0 || colonPos == field.length() - 1) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ָ<EFBFBD><D6B8><EFBFBD>ֵ<EFBFBD><D6B5>
|
|
|
|
|
|
std::string key = field.substr(0, colonPos);
|
|
|
|
|
|
std::string value = field.substr(colonPos + 1);
|
|
|
|
|
|
|
|
|
|
|
|
// ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD>Ŀհ<C4BF>
|
|
|
|
|
|
size_t keyStart = key.find_first_not_of(" \t");
|
|
|
|
|
|
size_t keyEnd = key.find_last_not_of(" \t");
|
|
|
|
|
|
if (keyStart != std::string::npos && keyEnd != std::string::npos) {
|
|
|
|
|
|
key = key.substr(keyStart, keyEnd - keyStart + 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ȥ<><C8A5>ֵ<EFBFBD>Ŀհ<C4BF>
|
|
|
|
|
|
size_t valStart = value.find_first_not_of(" \t");
|
|
|
|
|
|
size_t valEnd = value.find_last_not_of(" \t");
|
|
|
|
|
|
if (valStart != std::string::npos && valEnd != std::string::npos) {
|
|
|
|
|
|
value = value.substr(valStart, valEnd - valStart + 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ȥ<><C8A5>ֵ<EFBFBD><D6B5><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (value.size() >= 2 && value.front() == '"' && value.back() == '"') {
|
|
|
|
|
|
value = value.substr(1, value.size() - 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
|
const char* keyStr = key.c_str();
|
|
|
|
|
|
char* endPtr = nullptr;
|
|
|
|
|
|
long fieldId = strtol(keyStr, &endPtr, 10);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
|
if (endPtr != keyStr && *endPtr == '\0' && fieldId >= 1 && fieldId <= 10) {
|
|
|
|
|
|
switch (fieldId) {
|
|
|
|
|
|
case 1: result.Time = value; break;
|
|
|
|
|
|
case 2: result.CpuLoad = value; break;
|
|
|
|
|
|
case 3: result.FreeMemory = value; break;
|
|
|
|
|
|
case 4: result.TotalMemory = value; break;
|
|
|
|
|
|
case 5: result.FreeStorage = value; break;
|
|
|
|
|
|
case 6: result.TotalStorage = value; break;
|
|
|
|
|
|
case 7: result.HardTimeSync = value; break;
|
|
|
|
|
|
case 8: result.SntpTimeSync = value; break;
|
|
|
|
|
|
case 9: result.CloudTimeSync = value; break;
|
|
|
|
|
|
case 10: result.SignalStrength = value; break;
|
|
|
|
|
|
default: break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><E2B4A6>CPU<50><55><EFBFBD><EFBFBD>
|
|
|
|
|
|
result.CpuLoad = processCpuLoad(result.CpuLoad);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>Ӧ<EFBFBD><D3A6><EFBFBD>п<EFBFBD><D0BF>滻Ϊ<E6BBBB><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD>
|
|
|
|
|
|
std::cout << "Device Running Information (" << mac << "):\n"
|
|
|
|
|
|
<< " Time: " << result.Time << "\n"
|
|
|
|
|
|
<< " CPU Load: " << result.CpuLoad << "\n"
|
|
|
|
|
|
<< " Memory: " << result.FreeMemory << "/" << result.TotalMemory << " MB\n"
|
|
|
|
|
|
<< " Storage: " << result.FreeStorage << "/" << result.TotalStorage << " GB\n"
|
|
|
|
|
|
<< " Time Sync: Hard=" << result.HardTimeSync
|
|
|
|
|
|
<< ", SNTP=" << result.SntpTimeSync
|
|
|
|
|
|
<< ", Cloud=" << result.CloudTimeSync << "\n"
|
|
|
|
|
|
<< " Signal: " << result.SignalStrength << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ɹ<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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>)ʧ<>ܣ<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::READING_DEVVERSION:
|
|
|
|
|
|
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ȡ<EFBFBD><C8A1>(<28><>άЭ<CEAC><D0AD>ȷ<EFBFBD>϶<EFBFBD>ʱ<EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶг<C6B5><D0B3><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_Read_RunningInformation)) {
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t>& recvData = parser.RecvData;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>㹻
|
|
|
|
|
|
if (recvData.size() < 2) {
|
|
|
|
|
|
std::cerr << "Invalid running information data: too short ("
|
|
|
|
|
|
<< recvData.size() << " bytes)" << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>Ч<EFBFBD>غɳ<D8BA><C9B3><EFBFBD>
|
|
|
|
|
|
size_t payloadLength = recvData.size() - 2;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<uint8_t> payloadBytes(payloadLength);
|
|
|
|
|
|
if (recvData.size() >= 2 + payloadLength) {
|
|
|
|
|
|
std::copy(recvData.begin() + 2, recvData.begin() + 2 + payloadLength, payloadBytes.begin());
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
std::cerr << "Invalid payload length: " << payloadLength
|
|
|
|
|
|
<< ", available: " << (recvData.size() - 2) << std::endl;
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>ΪUTF-8<>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
std::string payload(payloadBytes.begin(), payloadBytes.end());
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>洢װ<E6B4A2>ð汾<C3B0><E6B1BE>Ϣ<EFBFBD>Ľṹ<C4BD><E1B9B9>
|
|
|
|
|
|
struct DeviceVersionInfo {
|
|
|
|
|
|
std::string BaseModel; // 1: װ<>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ͺ<EFBFBD>
|
|
|
|
|
|
std::string CloudProtocolVer; // 2: <20>Ʒ<EFBFBD><C6B7><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>汾
|
|
|
|
|
|
std::string AppVersion; // 3: Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>
|
|
|
|
|
|
std::string AppDate; // 4: Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string AppChecksum; // 5: Ӧ<>ó<EFBFBD><C3B3><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string VoltageWiring; // 6: <20><>ѹ<EFBFBD><D1B9><EFBFBD>߷<EFBFBD>ʽ
|
|
|
|
|
|
std::string CurrentBSynthetic; // 7: <20><><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>Ƿ<EFBFBD><C7B7>ϳ<EFBFBD>
|
|
|
|
|
|
int DataStatInterval = 0; // 8: <20><><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|
|
|
|
|
float RatedVoltage = 0.0f; // 9: <20><EFBFBD><EEB6A8>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>λV<CEBB><56>
|
|
|
|
|
|
float PTRatio = 0.0f; // 10: PT<50><54><EFBFBD><EFBFBD>
|
|
|
|
|
|
float CTRatio = 0.0f; // 11: CT<43><54><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string SntpIP; // 12: sntp<74><70>ʱIP
|
|
|
|
|
|
int SntpPort = 0; // 13: sntp<74><70>ʱ<EFBFBD>˿<EFBFBD>
|
|
|
|
|
|
int SntpInterval = 0; // 14: sntp<74><70>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|
|
|
|
|
int WebPort = 0; // 15: Web<65>˿<EFBFBD>
|
|
|
|
|
|
int FtpPort = 0; // 16: ftp<74>˿<EFBFBD>
|
|
|
|
|
|
int PqdifInterval = 0; // 17: Pqdif<69>ļ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>
|
|
|
|
|
|
int WaveFileTypeCount = 0; // 18: ¼<><C2BC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string SpecialVersion; // 19: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>Ϣ
|
|
|
|
|
|
std::string DeviceModel; // 20: װ<><D7B0><EFBFBD>ͺ<EFBFBD>
|
|
|
|
|
|
int HarmonicEnergyFlag = 0; // 21: г<><D0B3><EFBFBD><EFBFBD><EFBFBD>Ȱ汾<C8B0><E6B1BE>־
|
|
|
|
|
|
std::string PhysicalName; // 22: <20><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string WaveLDName; // 23: ¼<><C2BC>LD<4C><44><EFBFBD><EFBFBD>
|
|
|
|
|
|
int HighFreqHarmonicFlag = 0; // 24: <20><>Ƶг<C6B5><D0B3><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD>־
|
|
|
|
|
|
unsigned int CommProtocols = 0; // 51: Ͷ<><CDB6><EFBFBD><EFBFBD>ͨѶЭ<D1B6><D0AD>
|
|
|
|
|
|
unsigned int TimeSyncMethods = 0;// 52: Ͷ<><CDB6><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>ʽ
|
|
|
|
|
|
unsigned int DeviceFunctions = 0;// 53: װ<>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
} versionInfo;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ָ<EFBFBD><D6B8>ֶ<EFBFBD>
|
|
|
|
|
|
std::vector<std::string> fields;
|
|
|
|
|
|
size_t start = 0;
|
|
|
|
|
|
while (start < payload.length()) {
|
|
|
|
|
|
size_t end = payload.find(',', start);
|
|
|
|
|
|
if (end == std::string::npos) {
|
|
|
|
|
|
fields.push_back(payload.substr(start));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
fields.push_back(payload.substr(start, end - start));
|
|
|
|
|
|
start = end + 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ֶ<EFBFBD>
|
|
|
|
|
|
for (const auto& field : fields) {
|
|
|
|
|
|
if (field.empty()) continue;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ָ<EFBFBD><D6B8><EFBFBD>ֵ<EFBFBD><D6B5>
|
|
|
|
|
|
size_t colonPos = field.find(':');
|
|
|
|
|
|
if (colonPos == std::string::npos || colonPos == 0) continue;
|
|
|
|
|
|
|
|
|
|
|
|
std::string key = field.substr(0, colonPos);
|
|
|
|
|
|
std::string value = field.substr(colonPos + 1);
|
|
|
|
|
|
|
|
|
|
|
|
// ȥ<><C8A5><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>˵Ŀհ<D5B0><D7BA><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
auto trim = [](std::string str) -> std::string {
|
|
|
|
|
|
size_t start = str.find_first_not_of(" \t\"");
|
|
|
|
|
|
size_t end = str.find_last_not_of(" \t\"");
|
|
|
|
|
|
return (start == std::string::npos) ? "" : str.substr(start, end - start + 1);
|
|
|
|
|
|
};
|
|
|
|
|
|
key = trim(key);
|
|
|
|
|
|
value = trim(value);
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊ<EFBFBD><CEAA>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ID
|
|
|
|
|
|
try {
|
|
|
|
|
|
int fieldId = std::stoi(key);
|
|
|
|
|
|
switch (fieldId) {
|
|
|
|
|
|
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
|
|
|
|
|
case 1: versionInfo.BaseModel = value; break;
|
|
|
|
|
|
case 2: versionInfo.CloudProtocolVer = value; break;
|
|
|
|
|
|
case 3: versionInfo.AppVersion = value; break;
|
|
|
|
|
|
case 4: versionInfo.AppDate = value; break;
|
|
|
|
|
|
case 5: versionInfo.AppChecksum = value; break;
|
|
|
|
|
|
case 6: versionInfo.VoltageWiring = value; break;
|
|
|
|
|
|
case 7: versionInfo.CurrentBSynthetic = value; break;
|
|
|
|
|
|
case 12: versionInfo.SntpIP = value; break;
|
|
|
|
|
|
case 19: versionInfo.SpecialVersion = value; break;
|
|
|
|
|
|
case 20: versionInfo.DeviceModel = value; break;
|
|
|
|
|
|
case 22: versionInfo.PhysicalName = value; break;
|
|
|
|
|
|
case 23: versionInfo.WaveLDName = value; break;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
|
|
|
|
|
|
case 8: versionInfo.DataStatInterval = std::stoi(value); break;
|
|
|
|
|
|
case 9: versionInfo.RatedVoltage = std::stof(value); break;
|
|
|
|
|
|
case 10: versionInfo.PTRatio = std::stof(value); break;
|
|
|
|
|
|
case 11: versionInfo.CTRatio = std::stof(value); break;
|
|
|
|
|
|
case 13: versionInfo.SntpPort = std::stoi(value); break;
|
|
|
|
|
|
case 14: versionInfo.SntpInterval = std::stoi(value); break;
|
|
|
|
|
|
case 15: versionInfo.WebPort = std::stoi(value); break;
|
|
|
|
|
|
case 16: versionInfo.FtpPort = std::stoi(value); break;
|
|
|
|
|
|
case 17: versionInfo.PqdifInterval = std::stoi(value); break;
|
|
|
|
|
|
case 18: versionInfo.WaveFileTypeCount = std::stoi(value); break;
|
|
|
|
|
|
case 21: versionInfo.HarmonicEnergyFlag = std::stoi(value); break;
|
|
|
|
|
|
case 24: versionInfo.HighFreqHarmonicFlag = std::stoi(value); break;
|
|
|
|
|
|
|
|
|
|
|
|
// ʮ<><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶΣ<D6B6>51+<2B><>
|
|
|
|
|
|
case 51:
|
|
|
|
|
|
case 52:
|
|
|
|
|
|
case 53: {
|
|
|
|
|
|
if (value.size() > 2 && value.substr(0, 2) == "0x") {
|
|
|
|
|
|
unsigned int hexValue = std::stoul(value.substr(2), nullptr, 16);
|
|
|
|
|
|
switch (fieldId) {
|
|
|
|
|
|
case 51: versionInfo.CommProtocols = hexValue; break;
|
|
|
|
|
|
case 52: versionInfo.TimeSyncMethods = hexValue; break;
|
|
|
|
|
|
case 53: versionInfo.DeviceFunctions = hexValue; break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (const std::exception& e) {
|
|
|
|
|
|
std::cerr << "Error parsing field: " << field
|
|
|
|
|
|
<< ", error: " << e.what() << std::endl;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-04 15:37:26 +08:00
|
|
|
|
//<2F><>Э<EFBFBD><D0AD><EFBFBD>汾<EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>δ<EFBFBD><CEB4>ֵ<EFBFBD><D6B5>ʹ<EFBFBD><CAB9>Ĭ<EFBFBD>ϵ<EFBFBD>V1.0
|
|
|
|
|
|
if (!versionInfo.CloudProtocolVer.empty()) {
|
|
|
|
|
|
ClientManager::instance().set_versioninformation(id, versionInfo.CloudProtocolVer);
|
|
|
|
|
|
}
|
2025-09-03 08:49:38 +08:00
|
|
|
|
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-09-08 14:37:39 +08:00
|
|
|
|
std::cout << "Device Version Info (" << mac << "):\n"
|
2025-09-03 08:49:38 +08:00
|
|
|
|
<< " Base Model: " << versionInfo.BaseModel << "\n"
|
|
|
|
|
|
<< " Cloud Protocol: " << versionInfo.CloudProtocolVer << "\n"
|
|
|
|
|
|
<< " App Version: " << versionInfo.AppVersion << "\n"
|
|
|
|
|
|
<< " App Date: " << versionInfo.AppDate << "\n"
|
|
|
|
|
|
<< " PT Ratio: " << versionInfo.PTRatio << "\n"
|
|
|
|
|
|
<< " CT Ratio: " << versionInfo.CTRatio << "\n"
|
|
|
|
|
|
<< " Wave File Types: " << versionInfo.WaveFileTypeCount << "\n"
|
|
|
|
|
|
<< " Comm Protocols: 0x" << std::hex << versionInfo.CommProtocols << "\n"
|
|
|
|
|
|
<< " Time Sync Methods: 0x" << versionInfo.TimeSyncMethods << "\n"
|
2025-09-08 14:37:39 +08:00
|
|
|
|
<< " Device Functions: 0x" << versionInfo.DeviceFunctions << std::dec << "\n";
|
2025-09-03 08:49:38 +08:00
|
|
|
|
|
|
|
|
|
|
//<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);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʧ<CFA2>ܣ<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;
|
|
|
|
|
|
|
2025-09-04 15:37:26 +08:00
|
|
|
|
case DeviceState::SET_RIGHTTIME:
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
|
|
|
|
|
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_NewACK)) {
|
|
|
|
|
|
std::cout << "set success" << mac << std::endl;
|
|
|
|
|
|
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>óɹ<C3B3><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);
|
|
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
// װ<>÷<EFBFBD><C3B7><EFBFBD>Ӧ<EFBFBD>𣬶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|
|
|
|
|
// <20><><EFBFBD>ö<EFBFBD>ʱʧ<CAB1>ܣ<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 {
|
|
|
|
|
|
// װ<>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
// <20><><EFBFBD>ö<EFBFBD>ʱʧ<CAB1>ܣ<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;
|
|
|
|
|
|
|
2025-09-08 14:37:39 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
case DeviceState::CUSTOM_ACTION:
|
|
|
|
|
|
// <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>״̬
|
|
|
|
|
|
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
|
|
|
|
|
|
ClientManager::instance().change_device_state(id, DeviceState::IDLE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
std::cerr << "Unknown state: " << static_cast<int>(currentState)
|
|
|
|
|
|
<< " for device " << id << std::endl;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ۺ<EFBFBD><DBBA><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<C9BA><F3B4A5B7><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
|
|
|
|
|
|
ClientManager::instance().post_message_processing(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-06-20 09:25:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|