2025-06-13 11:29:59 +08:00
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
#include <stdexcept>
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
#include <cctype>
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
|
|
#include "client2.h"
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
float IntToFloat(int num) {
|
|
|
|
|
|
return static_cast<float>(num) / 65536.0f;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float ShorToFloat100(short num) {
|
|
|
|
|
|
return static_cast<float>(num) / 100.0f;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float ShorToFloat1000(short num) {
|
|
|
|
|
|
return static_cast<float>(num) / 1000.0f;
|
|
|
|
|
|
}
|
2025-06-13 11:29:59 +08:00
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
float ShorToFloat10000(short num) {
|
|
|
|
|
|
return static_cast<float>(num) / 10000.0f;
|
|
|
|
|
|
}
|
2025-06-13 11:29:59 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>䵽<EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void GetMAC(const std::string& strMAC, std::vector<unsigned char>& packet, size_t startIndex) {
|
|
|
|
|
|
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>пո<D0BF><D5B8>Ͷ̺<CDB6><CCBA><EFBFBD>
|
|
|
|
|
|
std::string cleanedMAC = strMAC;
|
|
|
|
|
|
cleanedMAC.erase(std::remove(cleanedMAC.begin(), cleanedMAC.end(), ' '), cleanedMAC.end());
|
|
|
|
|
|
cleanedMAC.erase(std::remove(cleanedMAC.begin(), cleanedMAC.end(), '-'), cleanedMAC.end());
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (cleanedMAC.length() != 12) {
|
|
|
|
|
|
throw std::invalid_argument("MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><EFBFBD><EFBFBD>Ϊ12<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϊʮ<CEAA><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ӵ<EFBFBD>
|
|
|
|
|
|
std::string byteStr = cleanedMAC.substr(i * 2, 2);
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊʮ<CEAA><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
|
unsigned char byte = static_cast<unsigned char>(
|
|
|
|
|
|
std::stoi(byteStr, nullptr, 16)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>䵽ָ<E4B5BD><D6B8>λ<EFBFBD><CEBB>
|
|
|
|
|
|
if (startIndex + i < packet.size()) {
|
|
|
|
|
|
packet[startIndex + i] = byte;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ʣ<>ಿ<EFBFBD><E0B2BF><EFBFBD><EFBFBD>0 (<28>ܹ<EFBFBD><DCB9><EFBFBD>Ҫ64<36>ֽڣ<D6BD><DAA3><EFBFBD>MACֻռ6<D5BC>ֽ<EFBFBD>)
|
|
|
|
|
|
for (int i = 6; i < 64; i++) {
|
|
|
|
|
|
if (startIndex + i < packet.size()) {
|
|
|
|
|
|
packet[startIndex + i] = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (const std::exception& e) {
|
|
|
|
|
|
throw std::invalid_argument("<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ: " + std::string(e.what()));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// CRC<52><43><EFBFBD>㺯<EFBFBD><E3BAAF>
|
|
|
|
|
|
unsigned char GetCrcSum(const std::vector<unsigned char>& Check, int nOffset, int nLen) {
|
|
|
|
|
|
unsigned char reg_b = 0x00;
|
|
|
|
|
|
for (int i = 0; i < nLen; ++i) {
|
|
|
|
|
|
if (static_cast<size_t>(i + nOffset) >= Check.size()) {
|
|
|
|
|
|
throw std::out_of_range("Index out of range in GetCrcSum");
|
|
|
|
|
|
}
|
|
|
|
|
|
reg_b += Check[i + nOffset];
|
|
|
|
|
|
}
|
|
|
|
|
|
return reg_b;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
// ʱ<><CAB1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TagMsTime -> <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint64_t convertTagMsTimeToMsTimestamp(const TagMsTime& t) {
|
|
|
|
|
|
struct tm tm_time = {};
|
|
|
|
|
|
tm_time.tm_year = t.Year - 1900;
|
|
|
|
|
|
tm_time.tm_mon = t.Month - 1;
|
|
|
|
|
|
tm_time.tm_mday = t.Day;
|
|
|
|
|
|
tm_time.tm_hour = t.Hour;
|
|
|
|
|
|
tm_time.tm_min = t.Min;
|
|
|
|
|
|
tm_time.tm_sec = t.Sec;
|
|
|
|
|
|
tm_time.tm_isdst = -1; // <20>Զ<EFBFBD><D4B6>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊʱ<CEAA><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩
|
|
|
|
|
|
time_t seconds = mktime(&tm_time);
|
|
|
|
|
|
if (seconds == -1) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Ϻ<EFBFBD><CFBA><EFBFBD>
|
|
|
|
|
|
return static_cast<uint64_t>(seconds) * 1000 + t.Ms;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>QVVRRecord
|
|
|
|
|
|
QVVRRecord DynamicLog_GetQVVRRecordFromLogBuffer(
|
|
|
|
|
|
const std::string& strScale,
|
|
|
|
|
|
uint32_t nPTType,
|
|
|
|
|
|
float fPT,
|
|
|
|
|
|
const NewTaglogbuffer& log) {
|
|
|
|
|
|
|
|
|
|
|
|
QVVRRecord record;
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
// ת<><D7AA>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
record.triggerTimeMs = convertTagMsTimeToMsTimestamp(log.head.Devtime);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
float fParam1 = 0.0f; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
float fParam2 = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
float fParam3 = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>ֵ
|
|
|
|
|
|
|
|
|
|
|
|
for (const auto& body : log.bodyList) {
|
|
|
|
|
|
switch (body.ParaCode) {
|
|
|
|
|
|
case 0: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
|
|
|
|
|
fParam2 = static_cast<float>(body.ParaValue) / 65536.0f;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1: // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>(˲̬<CBB2><CCAC><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>)
|
|
|
|
|
|
fParam1 = static_cast<float>(body.ParaValue) / 65536.0f;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 25: // <20><><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD>ֵ(˲̬<CBB2><CCAC><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>)
|
|
|
|
|
|
fParam3 = static_cast<float>(body.ParaValue) / 65536.0f;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3: //<2F><>ѹ<EFBFBD><D1B9><EFBFBD>ȣ<EFBFBD>˲̬<CBB2><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
|
|
|
|
|
record.fMagntitude = (static_cast<float>(body.ParaValue) / 65536.0f) / 100.0f;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲̬<CBB2><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
|
|
|
|
|
record.phase = static_cast<float>(body.ParaValue) / 65536.0f;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 6: //˲<><CBB2><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>˲̬<CBB2><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
|
|
|
|
|
record.transientValue = (static_cast<float>(body.ParaValue) / 65536.0f) / 100.0f;
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
record.fPersisstime = fParam1;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵfBase
|
|
|
|
|
|
float fBase = 0.0f;
|
|
|
|
|
|
if (fParam3 < 50.0f) { // δ<><CEB4><EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>ż<EFBFBD>
|
|
|
|
|
|
if (fPT != 1.0f) { // <20><><EFBFBD>Ȳ<EFBFBD>Ϊ1
|
|
|
|
|
|
fBase = (nPTType == 0) ? 57.74f : 100.0f;
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
std::string strTemp = strScale;
|
|
|
|
|
|
std::transform(strTemp.begin(), strTemp.end(), strTemp.begin(), ::tolower);
|
|
|
|
|
|
size_t pos = strTemp.find('k');
|
|
|
|
|
|
if (pos != std::string::npos) {
|
|
|
|
|
|
std::string numPart = strTemp.substr(0, pos);
|
|
|
|
|
|
try {
|
|
|
|
|
|
float fTemp = std::stof(numPart) * 1000.0f;
|
|
|
|
|
|
fBase = (nPTType == 0) ? (fTemp / std::sqrt(3.0f)) : fTemp;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (...) {
|
|
|
|
|
|
fBase = (nPTType == 0) ? 57.74f : 100.0f;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
fBase = (nPTType == 0) ? 57.74f : 100.0f;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
fBase = fParam3; // ʹ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>ż<EFBFBD>ֵ
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
switch (log.head.LogCode) {
|
|
|
|
|
|
case 0: case 26: case 40: case 54: case 68: case 82:
|
|
|
|
|
|
record.nType = 3;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1: case 27: case 41: case 55: case 69: case 83:
|
|
|
|
|
|
record.nType = 1;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 13: case 36: case 50: case 64: case 78: case 92:
|
|
|
|
|
|
record.nType = 2;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 24:
|
|
|
|
|
|
// <20>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 100:
|
|
|
|
|
|
record.nType = 1; // ģ<><C4A3><EFBFBD><EFBFBD>ѹ<EFBFBD>ݽ<EFBFBD>
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
record.nType = 4; // ˲̬<CBB2>¼<EFBFBD>
|
|
|
|
|
|
default:
|
|
|
|
|
|
// δ֪<CEB4><D6AA><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>0
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><E2B4A6><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>¼<EFBFBD><C2BC>ҷ<EFBFBD>ֵ<EFBFBD>ϴ<EFBFBD>
|
|
|
|
|
|
if (record.nType == 3 && fParam2 > fBase * 0.1f) {
|
|
|
|
|
|
fParam2 /= 100.0f;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
|
|
|
|
|
record.fMagntitude = fParam2 / fBase;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (...) {
|
|
|
|
|
|
// <20>쳣ʱ<ECB3A3><CAB1><EFBFBD>ؿռ<D8BF>¼
|
|
|
|
|
|
record = QVVRRecord{};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return record;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
|
|
|
|
|
std::vector<unsigned char> GetMsg(const std::vector<unsigned char>& SrcData, unsigned char nType) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (SrcData.empty() ||
|
|
|
|
|
|
((nType < 0x01 || nType > 0xA4) && nType != 0xFF)) {
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ͷ(6) + <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>(2) + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1) + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + CRC+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(2)
|
|
|
|
|
|
const size_t total_len = 6 + 2 + 1 + SrcData.size() + 2;
|
|
|
|
|
|
std::vector<unsigned char> msg(total_len);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ͷ (6<>ֽ<EFBFBD>)
|
|
|
|
|
|
msg[0] = 0xEB; // <20><><EFBFBD><EFBFBD>ͷ
|
|
|
|
|
|
msg[1] = 0x90; // <20><><EFBFBD><EFBFBD>ͷ
|
|
|
|
|
|
msg[2] = 0x00; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
msg[3] = 0x00; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>峤<EFBFBD><E5B3A4>+<2B><><EFBFBD><EFBFBD><EFBFBD>룩
|
|
|
|
|
|
uint16_t data_len = static_cast<uint16_t>(SrcData.size() + 1);
|
|
|
|
|
|
msg[4] = static_cast<unsigned char>(data_len >> 8); // <20><><EFBFBD>ȸ<EFBFBD><C8B8>ֽ<EFBFBD>
|
|
|
|
|
|
msg[5] = static_cast<unsigned char>(data_len & 0xFF); // <20><><EFBFBD>ȵ<EFBFBD><C8B5>ֽ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD> (2<>ֽ<EFBFBD>)
|
|
|
|
|
|
msg[6] = 0x00; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
msg[7] = 0xFF; // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
msg[8] = nType;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (!SrcData.empty()) {
|
|
|
|
|
|
std::copy(SrcData.begin(), SrcData.end(), msg.begin() + 9);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>CRC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><38>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD>壩
|
|
|
|
|
|
unsigned char crc = GetCrcSum(msg, 8, 1 + SrcData.size());
|
|
|
|
|
|
msg[msg.size() - 2] = crc;
|
|
|
|
|
|
msg[msg.size() - 1] = 0x16; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
return msg;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (const std::exception& ex) {
|
|
|
|
|
|
throw std::runtime_error(std::string("Exception in GetMsg: ") + ex.what());
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (...) {
|
|
|
|
|
|
throw std::runtime_error("Unknown exception in GetMsg");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-13 11:29:59 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<unsigned char> generate_frontlogin_message(const std::string& strMac)
|
|
|
|
|
|
{
|
|
|
|
|
|
const size_t packetSize = 150; // <20><><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD>150 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+֡<><D6A1><EFBFBD><EFBFBD>140
|
|
|
|
|
|
std::vector<unsigned char> packet(packetSize, 0); // <20><>ʼ<EFBFBD><CABC>Ϊȫ0
|
|
|
|
|
|
|
|
|
|
|
|
// Э<><D0AD>ͷ
|
|
|
|
|
|
packet[0] = 0xEB; // <20><>ʼ<EFBFBD><CABC>־1
|
|
|
|
|
|
packet[1] = 0x90;
|
|
|
|
|
|
packet[2] = 0xEB; // <20><>ʼ<EFBFBD><CABC>־2
|
|
|
|
|
|
packet[3] = 0x90;
|
|
|
|
|
|
packet[4] = 0x8C; // <20><><EFBFBD><EFBFBD><EFBFBD>峤<EFBFBD><E5B3A4> (140 = 0x008C)
|
|
|
|
|
|
packet[5] = 0x00;
|
|
|
|
|
|
// [6-7] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>Ϊ0)
|
|
|
|
|
|
// [8-9] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>Ϊ0)
|
|
|
|
|
|
// [10-11] ֡<><D6A1><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>Ϊ0)
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
|
|
|
|
|
|
packet[12] = 'F';
|
|
|
|
|
|
packet[13] = 'T';
|
|
|
|
|
|
packet[14] = 'I';
|
|
|
|
|
|
packet[15] = 'D';
|
|
|
|
|
|
// [16-19] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 (<28><><EFBFBD><EFBFBD>Ϊ0)
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>MAC<41><43>ַ (<28><>λ<EFBFBD><CEBB>20<32><30>ʼ<EFBFBD><CABC>64<36>ֽ<EFBFBD>)
|
|
|
|
|
|
GetMAC(strMac, packet, 20);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD> (<28><>ƫ<EFBFBD><C6AB>8<EFBFBD><38>137)
|
|
|
|
|
|
unsigned char checksum = 0;
|
|
|
|
|
|
for (size_t i = 8; i < packetSize - 2; i++) {
|
|
|
|
|
|
checksum += packet[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
packet[packetSize - 2] = checksum;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
packet[packetSize - 1] = 0x16;
|
|
|
|
|
|
|
|
|
|
|
|
return packet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䱨<EFBFBD><E4B1A8>
|
|
|
|
|
|
std::vector<unsigned char> generate_statequerytime_message() {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30>
|
|
|
|
|
|
std::vector<unsigned char> DataBuf(2, 0x00);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_StatTime));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
|
|
|
|
|
|
std::vector<unsigned char> generate_statequerystat_message(tagTime time, uint16_t nDeviceNo, uint16_t nDataType) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С<EFBFBD><D0A1>3(<28><><EFBFBD><EFBFBD>) + 2(nDeviceNo) + 2(nDataType) + time<6D>ṹ<EFBFBD><E1B9B9>С
|
|
|
|
|
|
const size_t totalSize = 3 + 2 * sizeof(uint16_t) + time.GetSize();
|
|
|
|
|
|
std::vector<unsigned char> DataBuf(totalSize, 0x00); // <20><>ʼ<EFBFBD><CABC>Ϊȫ0
|
|
|
|
|
|
|
|
|
|
|
|
size_t offset = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// 1. <20><><EFBFBD><EFBFBD>3<EFBFBD>ֽڱ<D6BD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30>
|
|
|
|
|
|
offset += 3;
|
|
|
|
|
|
|
|
|
|
|
|
// 2. д<><D0B4>nDeviceNo<4E><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint16_t netDeviceNo = htons(nDeviceNo);
|
|
|
|
|
|
memcpy(DataBuf.data() + offset, &netDeviceNo, sizeof(uint16_t));
|
|
|
|
|
|
offset += sizeof(uint16_t);
|
|
|
|
|
|
|
|
|
|
|
|
// 3. д<><D0B4>nDataType<70><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint16_t netDataType = htons(nDataType);
|
|
|
|
|
|
memcpy(DataBuf.data() + offset, &netDataType, sizeof(uint16_t));
|
|
|
|
|
|
offset += sizeof(uint16_t);
|
|
|
|
|
|
|
|
|
|
|
|
// 4. д<><D0B4>time<6D>ṹ<EFBFBD><E1B9B9><EFBFBD>ڲ<EFBFBD><DAB2>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
time.GetStructBuf(DataBuf.data(), DataBuf.size(), offset);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_Stat));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-09 10:03:37 +08:00
|
|
|
|
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD> <20><><EFBFBD><EFBFBD>1-6 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-11 г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-2
|
|
|
|
|
|
std::vector<unsigned char> generate_realstat_message(unsigned char nCpuNo,
|
|
|
|
|
|
unsigned char StaTtype,
|
|
|
|
|
|
unsigned char flag)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С<EFBFBD><D0A1>3(<28><><EFBFBD><EFBFBD>) + 1(nCpuNo) + 1(StaTtype) + 1(<28>̶<EFBFBD>ֵ) + 1(flag)
|
|
|
|
|
|
const size_t totalSize = 7;
|
|
|
|
|
|
std::vector<unsigned char> DataBuf(totalSize, 0x00); // <20><>ʼ<EFBFBD><CABC>Ϊȫ0
|
|
|
|
|
|
|
|
|
|
|
|
size_t offset = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// 1. <20><><EFBFBD><EFBFBD>3<EFBFBD>ֽڱ<D6BD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30>
|
|
|
|
|
|
offset += 3;
|
2025-07-03 11:13:16 +08:00
|
|
|
|
|
2025-07-09 10:03:37 +08:00
|
|
|
|
// 2. д<><D0B4>nCpuNo<4E><6F>1<EFBFBD>ֽڣ<D6BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-6
|
|
|
|
|
|
memcpy(DataBuf.data() + offset, &nCpuNo, sizeof(unsigned char));
|
|
|
|
|
|
offset += sizeof(unsigned char);
|
|
|
|
|
|
|
|
|
|
|
|
// 3. д<><D0B4>StaTtype<70><65>1<EFBFBD>ֽڣ<D6BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-11 һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-6
|
|
|
|
|
|
memcpy(DataBuf.data() + offset, &StaTtype, sizeof(unsigned char));
|
|
|
|
|
|
offset += sizeof(unsigned char);
|
|
|
|
|
|
|
|
|
|
|
|
// 4. д<><D0B4><EFBFBD>̶<EFBFBD>ֵ1<D6B5><31>1<EFBFBD>ֽڣ<D6BD> 3<><33>ʵʱ<CAB5><CAB1><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>1 <20><>ʾƽ<CABE><C6BD>ֵ
|
|
|
|
|
|
const unsigned char fixedValue = 1;
|
|
|
|
|
|
memcpy(DataBuf.data() + offset, &fixedValue, sizeof(unsigned char));
|
|
|
|
|
|
offset += sizeof(unsigned char);
|
|
|
|
|
|
|
|
|
|
|
|
// 5. д<><D0B4>flag<61><67>1<EFBFBD>ֽڣ<D6BD> <20><>־λ 0-2 г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 25 50 100<30><30>
|
|
|
|
|
|
memcpy(DataBuf.data() + offset, &flag, sizeof(unsigned char));
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
return GetMsg(DataBuf, static_cast<unsigned char>(MsgRequestType::Request_New_3S));
|
|
|
|
|
|
}
|
2025-07-03 11:13:16 +08:00
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
std::vector<unsigned char> generate_downloadfile_message(int frameIndex, const std::string& fileName) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С: 3(<28><><EFBFBD><EFBFBD>) + 4(֡<><D6A1><EFBFBD><EFBFBD>) + 128(<28>ļ<EFBFBD><C4BC><EFBFBD>) = 135<33>ֽ<EFBFBD>
|
|
|
|
|
|
std::vector<unsigned char> dataBuf(135, 0x00);
|
|
|
|
|
|
|
|
|
|
|
|
// д<><D0B4>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> (4<>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
//uint32_t netFrameIndex = htonl(static_cast<uint32_t>(frameIndex));
|
|
|
|
|
|
//memcpy(dataBuf.data() + 3, &netFrameIndex, sizeof(uint32_t));
|
|
|
|
|
|
// <20>Ƴ<EFBFBD>htonlת<6C><D7AA><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ʹ<EFBFBD><CAB9>ԭʼ֡<CABC><D6A1><EFBFBD><EFBFBD>(С<><D0A1><EFBFBD><EFBFBD>)
|
|
|
|
|
|
uint32_t rawFrameIndex = static_cast<uint32_t>(frameIndex);
|
|
|
|
|
|
memcpy(dataBuf.data() + 3, &rawFrameIndex, sizeof(uint32_t));
|
|
|
|
|
|
|
|
|
|
|
|
// д<><D0B4><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> (<28><><EFBFBD><EFBFBD>128<32>ֽ<EFBFBD>)
|
|
|
|
|
|
size_t copyLen = std::min(fileName.size(), static_cast<size_t>(128));
|
|
|
|
|
|
if (copyLen > 0) {
|
|
|
|
|
|
memcpy(dataBuf.data() + 7, fileName.c_str(), copyLen);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
return GetMsg(dataBuf, static_cast<unsigned char>(MsgRequestType::Request_File_Download));
|
2025-07-30 13:52:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<2F>ļ<EFBFBD>Ŀ¼<C4BF><C2BC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
|
std::vector<unsigned char> generate_getfilemenu_message(const std::string& filedir) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>131<33>ֽڻ<D6BD><DABB><EFBFBD><EFBFBD><EFBFBD> (3 + 128)<29><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
|
|
|
|
|
|
std::vector<unsigned char> dataBuf(131, 0x00);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>3<EFBFBD><33>ʼ<EFBFBD><CABC>
|
|
|
|
|
|
size_t copyLen = std::min(filedir.size(), static_cast<size_t>(128));
|
|
|
|
|
|
if (copyLen > 0) {
|
|
|
|
|
|
memcpy(dataBuf.data() + 3, filedir.c_str(), copyLen);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>GetMsg<73><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
return GetMsg(dataBuf, static_cast<unsigned char>(MsgRequestType::Request_FileDir));
|
2025-07-25 10:47:50 +08:00
|
|
|
|
}
|