137 lines
3.7 KiB
C++
137 lines
3.7 KiB
C++
|
|
#include <vector>
|
|||
|
|
#include <cstdint>
|
|||
|
|
#include <cstring>
|
|||
|
|
#include <string>
|
|||
|
|
#include <stdexcept>
|
|||
|
|
#include <algorithm>
|
|||
|
|
#include <cctype>
|
|||
|
|
#include <cstdlib>
|
|||
|
|
#include "client2.h"
|
|||
|
|
#include "PQSMsg.h"
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
|
|||
|
|
std::vector<unsigned char> generate_binary_message(
|
|||
|
|
uint16_t msg_type,
|
|||
|
|
const std::vector<unsigned char>& payload)
|
|||
|
|
{
|
|||
|
|
std::vector<unsigned char> packet;
|
|||
|
|
|
|||
|
|
// Э<><D0AD>ͷ (4<>ֽ<EFBFBD>)
|
|||
|
|
packet.push_back(0xAA); // <20><>ʼ<EFBFBD><CABC>־
|
|||
|
|
packet.push_back((msg_type >> 8) & 0xFF); // <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><CDB8>ֽ<EFBFBD>
|
|||
|
|
packet.push_back(msg_type & 0xFF); // <20><>Ϣ<EFBFBD><CFA2><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD>
|
|||
|
|
uint8_t length = payload.size();
|
|||
|
|
packet.push_back(length); // <20>غɳ<D8BA><C9B3><EFBFBD>
|
|||
|
|
|
|||
|
|
// <20>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
packet.insert(packet.end(), payload.begin(), payload.end());
|
|||
|
|
|
|||
|
|
// У<><D0A3>λ (1<>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>)
|
|||
|
|
uint8_t checksum = 0;
|
|||
|
|
for (auto byte : packet) {
|
|||
|
|
checksum ^= byte;
|
|||
|
|
}
|
|||
|
|
packet.push_back(checksum);
|
|||
|
|
|
|||
|
|
return packet;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
|||
|
|
void send_message(client_context_t* ctx) {
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
std::vector<unsigned char> payload = {
|
|||
|
|
0x01, 0x02, 0x03, 0x04 // ʾ<><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>0x1001)
|
|||
|
|
auto binary_data = generate_binary_message(0x1001, payload);
|
|||
|
|
|
|||
|
|
// ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
|||
|
|
unsigned char* binary_array = binary_data.data();
|
|||
|
|
size_t data_size = binary_data.size();
|
|||
|
|
|
|||
|
|
// <20>˴<EFBFBD><CBB4>ɵ<EFBFBD><C9B5>÷<EFBFBD><C3B7>ͺ<EFBFBD><CDBA><EFBFBD>
|
|||
|
|
send_binary_data(ctx, binary_array, data_size);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <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()));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <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;
|
|||
|
|
}
|
|||
|
|
|