2025-05-05 23:22:43 +08:00
|
|
|
#include "Communicate.h"
|
|
|
|
|
2025-05-10 01:25:02 +08:00
|
|
|
constexpr unsigned char gHeader[] = {0xFF, 0xFE};
|
|
|
|
constexpr unsigned char gTail[] = {0xFF, 0xFF};
|
|
|
|
|
2025-05-05 23:22:43 +08:00
|
|
|
Communicate::Communicate()
|
|
|
|
{
|
2025-05-10 01:25:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
【 transm TCP 数据协议 】
|
2025-05-10 21:43:25 +08:00
|
|
|
header 2 char: 0xFF 0xFE
|
|
|
|
dataType 2 char;
|
|
|
|
from 32 char:
|
|
|
|
to 32 char:
|
|
|
|
len 4 char:
|
|
|
|
data xxxxx:
|
|
|
|
tail 2 char: 0xFF 0xFF
|
2025-05-10 01:25:02 +08:00
|
|
|
*/
|
|
|
|
FrameBuffer* Communicate::ParseBuffer(MutBuffer& buffer)
|
|
|
|
{
|
|
|
|
FrameBuffer* frame = nullptr;
|
|
|
|
|
|
|
|
int find = buffer.IndexOf((const char*)gHeader, sizeof(gHeader));
|
|
|
|
if (find < 0) {
|
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
|
2025-05-11 21:27:59 +08:00
|
|
|
int32_t dataLen = 0;
|
|
|
|
std::memcpy(&dataLen, buffer.GetData() + find + sizeof(gHeader) + sizeof(uint16_t) + 64, sizeof(dataLen));
|
|
|
|
if (buffer.Length() < (find + sizeof(gHeader) + sizeof(uint16_t) + 64 + dataLen + sizeof(dataLen) + sizeof(gTail)) ||
|
|
|
|
dataLen < 0) {
|
2025-05-10 01:25:02 +08:00
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
|
2025-05-11 21:27:59 +08:00
|
|
|
if (std::memcmp(buffer.GetData() + find + sizeof(gHeader) + sizeof(uint16_t) + 64 + sizeof(dataLen) + dataLen, gTail,
|
2025-05-10 21:43:25 +08:00
|
|
|
sizeof(gTail)) != 0) {
|
2025-05-10 01:25:02 +08:00
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
|
|
|
|
frame = new FrameBuffer();
|
2025-05-11 21:27:59 +08:00
|
|
|
frame->len = dataLen;
|
2025-05-10 21:43:25 +08:00
|
|
|
frame->fid = std::string(buffer.GetData() + find + sizeof(gHeader) + sizeof(uint16_t), 32);
|
|
|
|
frame->tid = std::string(buffer.GetData() + find + sizeof(gHeader) + sizeof(uint16_t) + 32, 32);
|
2025-05-11 21:27:59 +08:00
|
|
|
std::memcpy(&frame->dataType, buffer.GetData() + find + sizeof(gHeader), sizeof(frame->dataType));
|
2025-05-10 01:25:02 +08:00
|
|
|
|
2025-05-11 21:27:59 +08:00
|
|
|
if (frame->len > 0) {
|
|
|
|
frame->dataMut = new char[frame->len];
|
|
|
|
std::memcpy(frame->dataMut, buffer.GetData() + find + sizeof(gHeader) + sizeof(uint16_t) + 64 + sizeof(frame->len),
|
|
|
|
frame->len);
|
2025-05-10 01:25:02 +08:00
|
|
|
}
|
2025-05-11 21:27:59 +08:00
|
|
|
buffer.RemoveOf(0, find + sizeof(gHeader) + sizeof(uint16_t) + 64 + frame->len + sizeof(frame->len) + sizeof(gTail));
|
2025-05-10 01:25:02 +08:00
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
|
2025-05-11 21:27:59 +08:00
|
|
|
bool Communicate::PackBuffer(FrameBuffer* frame, char** buf, int32_t& len)
|
2025-05-10 01:25:02 +08:00
|
|
|
{
|
|
|
|
if (frame == nullptr) {
|
|
|
|
return false;
|
|
|
|
}
|
2025-05-10 14:48:42 +08:00
|
|
|
const char* dataPtr = nullptr;
|
2025-05-11 21:27:59 +08:00
|
|
|
if (frame->dataMut == nullptr && frame->dataConst == nullptr) {
|
2025-05-10 01:25:02 +08:00
|
|
|
frame->len = 0;
|
|
|
|
}
|
2025-05-10 14:48:42 +08:00
|
|
|
if (frame->dataConst) {
|
|
|
|
dataPtr = frame->dataConst;
|
|
|
|
} else {
|
|
|
|
dataPtr = frame->dataMut;
|
|
|
|
}
|
2025-05-10 21:43:25 +08:00
|
|
|
len = sizeof(gHeader) + sizeof(uint16_t) + 64 + sizeof(len) + frame->len + sizeof(gTail);
|
2025-05-10 01:25:02 +08:00
|
|
|
*buf = new char[len];
|
|
|
|
std::memcpy(*buf, gHeader, sizeof(gHeader));
|
2025-05-11 21:27:59 +08:00
|
|
|
std::memcpy(*buf + sizeof(gHeader), &frame->dataType, sizeof(frame->dataType));
|
2025-05-10 21:43:25 +08:00
|
|
|
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint16_t), frame->fid.c_str(), 32);
|
|
|
|
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint16_t) + 32, frame->tid.c_str(), 32);
|
2025-05-11 21:27:59 +08:00
|
|
|
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint16_t) + 64, &frame->len, sizeof(frame->len));
|
2025-05-10 01:25:02 +08:00
|
|
|
if (frame->len > 0) {
|
2025-05-11 21:27:59 +08:00
|
|
|
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint16_t) + 64 + sizeof(len), dataPtr, frame->len);
|
2025-05-10 01:25:02 +08:00
|
|
|
}
|
2025-05-11 21:27:59 +08:00
|
|
|
std::memcpy(*buf + sizeof(gHeader) + sizeof(uint16_t) + 64 + sizeof(len) + frame->len, gTail, sizeof(gTail));
|
2025-05-10 14:48:42 +08:00
|
|
|
frame->dataConst = nullptr;
|
2025-05-10 01:25:02 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2025-05-10 14:48:42 +08:00
|
|
|
FrameBuffer::FrameBuffer()
|
|
|
|
{
|
|
|
|
dataConst = nullptr;
|
|
|
|
dataMut = nullptr;
|
|
|
|
len = 0;
|
|
|
|
}
|
|
|
|
|
2025-05-10 01:25:02 +08:00
|
|
|
FrameBuffer::~FrameBuffer()
|
|
|
|
{
|
2025-05-10 14:48:42 +08:00
|
|
|
delete[] dataMut;
|
2025-05-10 01:25:02 +08:00
|
|
|
len = 0;
|
|
|
|
}
|