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-09 09:39:29 +08:00
|
|
|
|
|
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>
|
|
|
|
|
|
time_t ConvertToTimestamp(const tagPqData_Float& data) {
|
|
|
|
|
|
struct tm t = {};
|
|
|
|
|
|
t.tm_year = data.time.DeviceYear - 1900; // tm_year <20><> 1900 <20><>ʼ<EFBFBD><CABC>
|
|
|
|
|
|
t.tm_mon = data.time.DeviceMonth - 1; // tm_mon <20><> 0<><30>1<EFBFBD>£<EFBFBD><C2A3><EFBFBD>ʼ
|
|
|
|
|
|
t.tm_mday = data.time.DeviceDay;
|
|
|
|
|
|
t.tm_hour = data.time.DeviceHour;
|
|
|
|
|
|
t.tm_min = data.time.DeviceMinute;
|
|
|
|
|
|
t.tm_sec = data.time.DeviceSecond;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣩
|
|
|
|
|
|
return mktime(&t);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-25 10:54:09 +08:00
|
|
|
|
std::cout << "Active connections: " << mac << " id:" << id << " size:" << length << std::endl;
|
2025-06-20 09:25:17 +08:00
|
|
|
|
// ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// ע<>⣺<EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>ʵ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
|
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>¼
|
|
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<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;
|
|
|
|
|
|
}
|
|
|
|
|
|
// <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>״̬
|
|
|
|
|
|
std::cout << "READING_STATS state: Processing stats data from " << mac << std::endl;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>ĵ<EFBFBD><C4B5><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];
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
|
2025-07-09 09:39:29 +08:00
|
|
|
|
std::string max_base64Str = max_data.ConvertToBase64();
|
|
|
|
|
|
std::string min_base64Str = min_data.ConvertToBase64();
|
|
|
|
|
|
std::string avg_base64Str = avg_data.ConvertToBase64();
|
|
|
|
|
|
std::string cp95_base64Str = cp95_data.ConvertToBase64();
|
|
|
|
|
|
|
|
|
|
|
|
//lnk20250708ʹ<38>ýӿڷ<D3BF><DAB7><EFBFBD>
|
|
|
|
|
|
time_t data_time = ConvertToTimestamp(avg_data);
|
|
|
|
|
|
|
|
|
|
|
|
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>
|
|
|
|
|
|
-1, //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD>꣬<EAA3AC><CEA2><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>롰-1<><31>
|
|
|
|
|
|
0, //<2F><><EFBFBD>ݱ<EFBFBD>ʶ<EFBFBD><CAB6>1-<2D><>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>쳣
|
|
|
|
|
|
max_base64Str});
|
|
|
|
|
|
arr.push_back({2, data_time, -1, 0, min_base64Str});
|
|
|
|
|
|
arr.push_back({3, data_time, -1, 0, avg_base64Str});
|
|
|
|
|
|
arr.push_back({4, data_time, -1, 0, cp95_base64Str});
|
|
|
|
|
|
|
|
|
|
|
|
std::string js = generate_json(
|
|
|
|
|
|
-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>
|
|
|
|
|
|
123456, //<2F>豸Ψһ<CEA8><D2BB>ʶLdid<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>Ndid
|
|
|
|
|
|
1, //<2F><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
|
|
|
|
|
0x1302, //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
max_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
|
|
|
|
|
|
max_data.Data_Type, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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>
|
|
|
|
|
|
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
|
|
|
|
|
|
arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
);
|
|
|
|
|
|
std::cout << js << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
queue_data_t data;
|
|
|
|
|
|
data.monitor_no = 1;
|
|
|
|
|
|
data.strTopic = TOPIC_STAT;
|
|
|
|
|
|
data.strText = js;
|
|
|
|
|
|
data.mp_id = "test";
|
|
|
|
|
|
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>״̬
|
|
|
|
|
|
std::cout << "READING_STATS_TIME state: Processing stats time from " << mac << std::endl;
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|