完成了实时数据的接收和组装字节流
This commit is contained in:
@@ -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 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>
|
||||
std::vector<unsigned char> generate_binary_message(
|
||||
uint16_t msg_type,
|
||||
|
||||
@@ -382,8 +382,8 @@ void on_timer(uv_timer_t* handle) {
|
||||
ctx->real_state_query_time_ = now;
|
||||
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));//组装询问实时数据报文
|
||||
//ctx->add_action(DeviceState::READING_REALSTAT, sendbuff);//将该状态以及待发送报文存入队列
|
||||
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);//将该状态以及待发送报文存入队列
|
||||
}
|
||||
//处理后续工作队列的工作 取出一个并执行
|
||||
if (ctx->current_state_ == DeviceState::IDLE) {
|
||||
@@ -985,7 +985,7 @@ bool ClientManager::clear_float_cache(const std::string& identifier) {
|
||||
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_);
|
||||
|
||||
for (auto& pair : clients_) {
|
||||
|
||||
@@ -127,6 +127,40 @@ public:
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
||||
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:
|
||||
int index_;
|
||||
|
||||
@@ -213,7 +247,38 @@ public:
|
||||
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>
|
||||
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:
|
||||
ClientManager() : loop_(nullptr) {}
|
||||
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
||||
|
||||
@@ -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;
|
||||
//װ<>õ<EFBFBD>¼<EFBFBD>ɹ<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) {
|
||||
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;
|
||||
return;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
switch (currentState) {
|
||||
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
|
||||
arr //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
);
|
||||
std::cout << js << std::endl;
|
||||
//std::cout << js << std::endl;
|
||||
|
||||
queue_data_t data;
|
||||
data.monitor_no = 1;
|
||||
@@ -278,6 +279,79 @@ void process_received_message(string mac, string id,const char* data, size_t len
|
||||
}
|
||||
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:
|
||||
// <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>״̬
|
||||
std::cout << "CUSTOM_ACTION state: Processing custom response from " << mac << std::endl;
|
||||
|
||||
@@ -131,15 +131,15 @@ void* client_manager_thread(void* arg) {
|
||||
std::vector<PointInfo> points2 = {
|
||||
{"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>
|
||||
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
|
||||
},
|
||||
{
|
||||
"D002", "Backup Device", "Model-Y", "00-B7-8D-01-79-06",
|
||||
"D002", "Backup Device", "Model-Y", "00-B7-8D-A8-00-D6",
|
||||
1, points2
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user