完成了实时数据的接收和组装字节流

This commit is contained in:
zw
2025-07-10 10:32:29 +08:00
parent 7cfcdd0c5a
commit b1963098eb
5 changed files with 559 additions and 11 deletions

View File

@@ -792,10 +792,419 @@ private:
} }
}; };
//<2F><><EFBFBD><EFBFBD><E3B1A8>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> 1֡1024Ϊ1K //<2F><><EFBFBD><EFBFBD><E3B1A8>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> 1֡1024Ϊ1K ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
constexpr int PqDataLen = tagPqData::GetSize(); constexpr int PqDataLen = tagPqData::GetSize();
constexpr int Stat_PacketNum = (PqDataLen / 1024 > 0) ? (PqDataLen / 1024 + 1) : (PqDataLen / 1024); constexpr int Stat_PacketNum = (PqDataLen / 1024 > 0) ? (PqDataLen / 1024 + 1) : (PqDataLen / 1024);
//ʵʱ<CAB5><CAB1><EFBFBD>ݽṹ<DDBD><E1B9B9>1<EFBFBD>ֽڶ<D6BD><DAB6>
#pragma pack(push, 1)
class RealtagPqDate_float {
public:
tagTime time; // ʱ<><CAB1>
//ʵʱ<CAB5><CAB1><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 9> Rms; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ
std::array<float, 6> UU_Deviation; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<float, 6> UL_Deviation; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<float, 6> THD; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 2> FREQ; //Ƶ<>ʼ<EFBFBD>Ƶ<EFBFBD><C6B5>ƫ<EFBFBD><C6AB>
std::array<std::array<float, 5>, 2> UI_Seq;//<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
std::array<std::array<float, 3>, 4> TOTAL_POWER;//<2F><><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>P<EFBFBD><50>Q<EFBFBD><51>S
std::array<float, 4> COS_PF; //<2F><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 4> COS_DF; //λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//----------- <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMV;//г<><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//----------- <20><><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMI;//г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMVP;//г<><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>λ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><C4B0><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMIP;//г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> INHARMV;//<2F><>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ֵ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><ECBAAF> - <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RealtagPqDate_float() {
// <20><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>
time = tagTime(); // <20><><EFBFBD><EFBFBD>tagTime<6D><65>Ĭ<EFBFBD>Ϲ<EFBFBD><CFB9><EFBFBD><ECBAAF>
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Rms.fill(0.0f);
UU_Deviation.fill(0.0f);
UL_Deviation.fill(0.0f);
THD.fill(0.0f);
FREQ.fill(0.0f);
COS_PF.fill(0.0f);
COS_DF.fill(0.0f);
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (auto& arr : UI_Seq) {
arr.fill(0.0f);
}
for (auto& arr : TOTAL_POWER) {
arr.fill(0.0f);
}
// <20><>ʼ<EFBFBD><CABC>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (auto& arr : HARMV) {
arr.fill(0.0f);
}
for (auto& arr : HARMI) {
arr.fill(0.0f);
}
for (auto& arr : HARMVP) {
arr.fill(0.0f);
}
for (auto& arr : HARMIP) {
arr.fill(0.0f);
}
for (auto& arr : INHARMV) {
arr.fill(0.0f);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ȡfloat
float read_net_float(const uint8_t* ptr) {
uint32_t temp;
memcpy(&temp, ptr, sizeof(uint32_t));
temp = ntohl(temp);
float result;
memcpy(&result, &temp, sizeof(float));
return result;
}
// ʵʱ<CAB5><CAB1><EFBFBD>ݽṹ<DDBD>ķְ<C4B7><D6B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool ParsePacket1(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(59<35><39>float * 4 = 236<33>ֽ<EFBFBD>) = 248<34>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 59 * sizeof(float);
if (size < min_size) {
return false;
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>Rms (9<><39>float)
for (int i = 0; i < 9; ++i) {
Rms[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>UU_Deviation (6<><36>float)
for (int i = 0; i < 6; ++i) {
UU_Deviation[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>UL_Deviation (6<><36>float)
for (int i = 0; i < 6; ++i) {
UL_Deviation[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>THD (6<><36>float)
for (int i = 0; i < 6; ++i) {
THD[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>FREQ (2<><32>float)
for (int i = 0; i < 2; ++i) {
FREQ[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>UI_Seq (2x5<78><35>float)
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 5; ++j) {
UI_Seq[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
// <20><><EFBFBD><EFBFBD>TOTAL_POWER (4x3<78><33>float)
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 3; ++j) {
TOTAL_POWER[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
// <20><><EFBFBD><EFBFBD>COS_PF (4<><34>float)
for (int i = 0; i < 4; ++i) {
COS_PF[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>COS_DF (4<><34>float)
for (int i = 0; i < 4; ++i) {
COS_DF[i] = read_net_float(ptr);
ptr += sizeof(float);
}
return true;
}
bool ParsePacket2(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD>ѹ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3A8><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0>ʱ<EFBFBD>
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMV (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMV[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket3(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMI (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMI[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket4(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>λ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMVP (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMVP[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket5(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMIP (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMIP[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket6(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + <20><>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ѹ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>INHARMV (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
INHARMV[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
// <20><><EFBFBD><EFBFBD><E3B8A1><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
size_t CalculateFloatCount() const {
size_t count = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
count += Rms.size();
count += UU_Deviation.size();
count += UL_Deviation.size();
count += THD.size();
count += FREQ.size();
count += COS_PF.size();
count += COS_DF.size();
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) count += arr.size();
for (const auto& arr : TOTAL_POWER) count += arr.size();
for (const auto& arr : HARMV) count += arr.size();
for (const auto& arr : HARMI) count += arr.size();
for (const auto& arr : HARMVP) count += arr.size();
for (const auto& arr : HARMIP) count += arr.size();
for (const auto& arr : INHARMV) count += arr.size();
return count;
}
// <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SerializeFloats(std::vector<float>& buffer) const {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (float val : Rms) buffer.push_back(val);
for (float val : UU_Deviation) buffer.push_back(val);
for (float val : UL_Deviation) buffer.push_back(val);
for (float val : THD) buffer.push_back(val);
for (float val : FREQ) buffer.push_back(val);
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><E9A3A8>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) {
for (float val : arr) buffer.push_back(val);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : TOTAL_POWER) {
for (float val : arr) buffer.push_back(val);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (float val : COS_PF) buffer.push_back(val);
for (float val : COS_DF) buffer.push_back(val);
// г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : HARMV) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : HARMI) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : HARMVP) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : HARMIP) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : INHARMV) {
for (float val : arr) buffer.push_back(val);
}
}
// Base64<36><34><EFBFBD><EFBFBD><EBBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tagPqData_Float<61><74>ͬ<EFBFBD><CDAC>
static std::string base64_encode(const unsigned char* bytes_to_encode, size_t in_len) {
static const char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; i < 4; i++)
ret += base64_chars[char_array_4[i]];
i = 0;
}
}
if (i) {
for (j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; j < i + 1; j++)
ret += base64_chars[char_array_4[j]];
while (i++ < 3)
ret += '=';
}
return ret;
}
// <20><><EFBFBD><EFBFBD>Base64ת<34><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string ConvertToBase64() const {
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD><EFBFBD><EFBFBD>
const size_t total_floats = CalculateFloatCount();
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<float> float_buffer;
float_buffer.reserve(total_floats);
SerializeFloats(float_buffer);
// 3. ת<><D7AA>Ϊ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>
const size_t byte_size = float_buffer.size() * sizeof(float);
const unsigned char* byte_data =
reinterpret_cast<const unsigned char*>(float_buffer.data());
return base64_encode(byte_data, byte_size);
}
};
#pragma pack(pop)
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD> // <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
std::vector<unsigned char> generate_binary_message( std::vector<unsigned char> generate_binary_message(
uint16_t msg_type, uint16_t msg_type,

View File

@@ -382,8 +382,8 @@ void on_timer(uv_timer_t* handle) {
ctx->real_state_query_time_ = now; ctx->real_state_query_time_ = now;
ctx->real_state_count--; ctx->real_state_count--;
//auto sendbuff = generate_realstat_message(static_cast<unsigned char>(ctx->real_point_id_), static_cast<unsigned char>(0x01), static_cast<unsigned char>(0x01));//组装询问实时数据报文 auto sendbuff = generate_realstat_message(static_cast<unsigned char>(ctx->real_point_id_), static_cast<unsigned char>(0x01), static_cast<unsigned char>(0x01));//组装询问实时数据报文
//ctx->add_action(DeviceState::READING_REALSTAT, sendbuff);//将该状态以及待发送报文存入队列 ctx->add_action(DeviceState::READING_REALSTAT, sendbuff);//将该状态以及待发送报文存入队列
} }
//处理后续工作队列的工作 取出一个并执行 //处理后续工作队列的工作 取出一个并执行
if (ctx->current_state_ == DeviceState::IDLE) { if (ctx->current_state_ == DeviceState::IDLE) {
@@ -985,7 +985,7 @@ bool ClientManager::clear_float_cache(const std::string& identifier) {
return false; return false;
} }
bool ClientManager::set_real_state_count(const std::string& identifier, int count, ushort point_id = 1) { bool ClientManager::set_real_state_count(const std::string& identifier, int count, ushort point_id) {
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
for (auto& pair : clients_) { for (auto& pair : clients_) {

View File

@@ -67,7 +67,7 @@ public:
uint64_t real_state_query_time_ = 0; // ʵʱ<CAB5><CAB1><EFBFBD>ݼ<EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD> uint64_t real_state_query_time_ = 0; // ʵʱ<CAB5><CAB1><EFBFBD>ݼ<EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD>
std::atomic<int> real_state_count{ 0 };//ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD> ԭ<>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>̰߳<DFB3>ȫ std::atomic<int> real_state_count{ 0 };//ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD> ԭ<>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>̰߳<DFB3>ȫ
std::atomic<ushort> real_point_id_{ 1 }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>ԭ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD> std::atomic<ushort> real_point_id_{ 1 }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>ԭ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>
DeviceInfo device_info; // װ<><D7B0><EFBFBD><EFBFBD>Ϣ DeviceInfo device_info; // װ<><D7B0><EFBFBD><EFBFBD>Ϣ
int cloudstatus; // <20><>ǰ<EFBFBD>õ<EFBFBD>¼״̬<D7B4><CCAC>0<EFBFBD><30>δ<EFBFBD><CEB4>¼ 1<><31><EFBFBD>ѵ<EFBFBD>¼<EFBFBD><C2BC> int cloudstatus; // <20><>ǰ<EFBFBD>õ<EFBFBD>¼״̬<D7B4><CCAC>0<EFBFBD><30>δ<EFBFBD><CEB4>¼ 1<><31><EFBFBD>ѵ<EFBFBD>¼<EFBFBD><C2BC>
@@ -127,6 +127,40 @@ public:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
void clear_float_cache(); void clear_float_cache();
// ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>
struct RealtimePacket {
unsigned char packet_type;
std::vector<unsigned char> data;
};
std::vector<RealtimePacket> realtime_packets_cache_; // <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD>
std::mutex realtime_cache_mutex_; // <20><><EFBFBD><EFBFBD><E6BBA5><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void add_realtime_packet(unsigned char packet_type,
const unsigned char* data,
size_t size) {
std::lock_guard<std::mutex> lock(realtime_cache_mutex_);
realtime_packets_cache_.push_back({
packet_type,
std::vector<unsigned char>(data, data + size)
});
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
std::vector<RealtimePacket> get_and_clear_realtime_packets() {
std::lock_guard<std::mutex> lock(realtime_cache_mutex_);
auto packets = std::move(realtime_packets_cache_);
realtime_packets_cache_.clear();
return packets;
}
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void reset_realtime_data() {
std::lock_guard<std::mutex> lock(realtime_cache_mutex_);
realtime_packets_cache_.clear();
}
private: private:
int index_; int index_;
@@ -213,7 +247,38 @@ public:
bool clear_float_cache(const std::string& identifier); bool clear_float_cache(const std::string& identifier);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>
bool set_real_state_count(const std::string& identifier, int count, ushort point_id = 1); bool set_real_state_count(const std::string& identifier, int count, ushort point_id);
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
bool add_realtime_packet_to_device(const std::string& identifier,
unsigned char packet_type,
const unsigned char* data,
size_t size) {
std::lock_guard<std::mutex> lock(mutex_);
for (auto& pair : clients_) {
auto& ctx = pair.second;
if (ctx->device_info.device_id == identifier ||
ctx->device_info.mac == identifier) {
ctx->add_realtime_packet(packet_type, data, size);
return true;
}
}
return false;
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
std::vector<ClientContext::RealtimePacket>
get_and_clear_realtime_packets(const std::string& identifier) {
std::lock_guard<std::mutex> lock(mutex_);
for (auto& pair : clients_) {
auto& ctx = pair.second;
if (ctx->device_info.device_id == identifier ||
ctx->device_info.mac == identifier) {
return ctx->get_and_clear_realtime_packets();
}
}
return {};
}
private: private:
ClientManager() : loop_(nullptr) {} ClientManager() : loop_(nullptr) {}
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_; std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;

View File

@@ -56,7 +56,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
std::cout << "cloud login: " << mac << " state: success!" << std::endl; std::cout << "cloud login: " << mac << " state: success!" << std::endl;
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD> //װ<>õ<EFBFBD>¼<EFBFBD>ɹ<EFBFBD>
ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼ ClientManager::instance().set_cloud_status(id, 1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬Ϊ<CCAC>ѵ<EFBFBD>¼
//ClientManager::instance().set_real_state_count("D002", 10);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ ClientManager::instance().set_real_state_count("D002", 1,1);//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ
} }
if (udata[19] == 0x00) { if (udata[19] == 0x00) {
std::cout << "cloud login: " << mac << " state: fail!" << std::endl; std::cout << "cloud login: " << mac << " state: fail!" << std::endl;
@@ -80,6 +80,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
std::cerr << "Failed to get device state for: " << id << std::endl; std::cerr << "Failed to get device state for: " << id << std::endl;
return; return;
} }
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch (currentState) { switch (currentState) {
case DeviceState::IDLE: case DeviceState::IDLE:
@@ -199,7 +200,7 @@ void process_received_message(string mac, string id,const char* data, size_t len
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 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> arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
); );
std::cout << js << std::endl; //std::cout << js << std::endl;
queue_data_t data; queue_data_t data;
data.monitor_no = 1; data.monitor_no = 1;
@@ -278,6 +279,79 @@ void process_received_message(string mac, string id,const char* data, size_t len
} }
break; break;
case DeviceState::READING_REALSTAT:
//<2F><>ȡʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>״̬
std::cout << "READING_REALSTAT state: Processing stats data from " << mac << std::endl;
if (udata[8] == static_cast<unsigned char>(MsgResponseType::Response_New_3S)) {
unsigned char packet_type = udata[13];
// <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;
}
}
std::string base64 = realdata.ConvertToBase64();
std::cout << base64 << std::endl;
// <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>
// <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;
case DeviceState::CUSTOM_ACTION: case DeviceState::CUSTOM_ACTION:
// <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF>״̬ // <20>Զ<EFBFBD><D4B6><EFBFBD><E5B6AF>״̬
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl; std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;

View File

@@ -131,15 +131,15 @@ void* client_manager_thread(void* arg) {
std::vector<PointInfo> points2 = { std::vector<PointInfo> points2 = {
{"P101", "Generator Output", "D002",1 ,1, 1, 1, 1} {"P101", "Generator Output", "D002",1 ,1, 1, 1, 1}
}; };
//00-B7-8D-A8-00-D6 //00-B7-8D-A8-00-D6 00-B7-8D-01-79-06
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD> // <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>б<EFBFBD>
std::vector<DeviceInfo> devices = { std::vector<DeviceInfo> devices = {
{ {
"D001", "Primary Device", "Model-X", "00-B7-8D-A8-00-D9", "D001", "Primary Device", "Model-X", "00-B7-8D-01-79-06",
1, points1 1, points1
}, },
{ {
"D002", "Backup Device", "Model-Y", "00-B7-8D-01-79-06", "D002", "Backup Device", "Model-Y", "00-B7-8D-A8-00-D6",
1, points2 1, points2
} }
}; };