Files
front_linux/LFtid1056/PQSMsg.cpp
2025-06-19 13:24:45 +08:00

92 lines
2.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <vector>
#include <cstdint>
#include <cstring>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include "client2.h"
#include "PQSMsg.h"
// 辅助函数解析MAC地址并填充到缓冲区
void GetMAC(const std::string& strMAC, std::vector<unsigned char>& packet, size_t startIndex) {
// 移除所有空格和短横线
std::string cleanedMAC = strMAC;
cleanedMAC.erase(std::remove(cleanedMAC.begin(), cleanedMAC.end(), ' '), cleanedMAC.end());
cleanedMAC.erase(std::remove(cleanedMAC.begin(), cleanedMAC.end(), '-'), cleanedMAC.end());
// 验证长度
if (cleanedMAC.length() != 12) {
throw std::invalid_argument("MAC地址长度必须为12个字符");
}
try {
// 解析每两个字符作为十六进制字节
for (int i = 0; i < 6; i++) {
// 提取两个字符的子串
std::string byteStr = cleanedMAC.substr(i * 2, 2);
// 转换为十六进制字节
unsigned char byte = static_cast<unsigned char>(
std::stoi(byteStr, nullptr, 16)
);
// 填充到指定位置
if (startIndex + i < packet.size()) {
packet[startIndex + i] = byte;
}
}
// 剩余部分填0 (总共需要64字节但MAC只占6字节)
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("无效的MAC地址: " + std::string(e.what()));
}
}
// 生成装置云服务登录报文
std::vector<unsigned char> generate_frontlogin_message(const std::string& strMac)
{
const size_t packetSize = 150; // 报文总长150 数据体+帧序号140
std::vector<unsigned char> packet(packetSize, 0); // 初始化为全0
// 协议头
packet[0] = 0xEB; // 起始标志1
packet[1] = 0x90;
packet[2] = 0xEB; // 起始标志2
packet[3] = 0x90;
packet[4] = 0x8C; // 数据体长度 (140 = 0x008C)
packet[5] = 0x00;
// [6-7] 随机码 (保持为0)
// [8-9] 功能码 (保持为0)
// [10-11] 帧序号 (保持为0)
// 数据体1
packet[12] = 'F';
packet[13] = 'T';
packet[14] = 'I';
packet[15] = 'D';
// [16-19] 数据体2 (保持为0)
// 填充MAC地址 (从位置20开始64字节)
GetMAC(strMac, packet, 20);
// 计算校验和 (从偏移8到137)
unsigned char checksum = 0;
for (size_t i = 8; i < packetSize - 2; i++) {
checksum += packet[i];
}
packet[packetSize - 2] = checksum;
// 结束符
packet[packetSize - 1] = 0x16;
return packet;
}