79 lines
1.6 KiB
C++
79 lines
1.6 KiB
C++
#ifndef MESSAGE_H
|
|
#define MESSAGE_H
|
|
|
|
// 协议类:用于接收外部 网络通信 发送的打印内容
|
|
|
|
#include <QObject>
|
|
#include <QByteArray>
|
|
|
|
/*
|
|
| 起始标识(1B) | 预留字段(1B) | 内容长度(2B) | 数据内容(NB) | 结束标识(1B) |
|
|
| 0x2B | 自定义 | N() | 实际数据 | 0x3C |
|
|
2B 00 02 00 08 08 3C
|
|
*/
|
|
// 内存对齐
|
|
#pragma pack(push, 1)
|
|
struct MsgHead {
|
|
char start;
|
|
char reserved;
|
|
unsigned short length;
|
|
|
|
MsgHead() {
|
|
start = 0x2B;
|
|
reserved = 0;
|
|
length = 0;
|
|
}
|
|
|
|
bool isValid() {
|
|
return start == 0x2B;
|
|
}
|
|
};
|
|
|
|
struct MsgTail {
|
|
quint8 end;
|
|
|
|
MsgTail() {
|
|
end = 0x3C;
|
|
}
|
|
|
|
bool isValid() {
|
|
return end == 0x3C;
|
|
}
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
class Message : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
Message(QObject *parent = 0);
|
|
~Message();
|
|
|
|
// 打包:数据 + 预留字段 -> 完整帧
|
|
QByteArray pack(const QByteArray &data);
|
|
|
|
// 解包:完整帧 -> 数据和预留字段
|
|
bool unpack(const QByteArray &frame, QByteArray &data);
|
|
|
|
// 验证帧格式
|
|
bool validate(const QByteArray &frame);
|
|
|
|
QByteArray extractFrame(const QByteArray &buffer, int &consumedBytes);
|
|
|
|
private:
|
|
// 协议常量
|
|
char FRAME_START ; // '+' 0x2b
|
|
char FRAME_END; // '<' 0x3c
|
|
int HEADER_SIZE ; // 1(起始) + 2(长度) + 1(预留)
|
|
int TRAILER_SIZE; // 1(结束)
|
|
int MIN_FRAME_SIZE; // 5字节
|
|
|
|
quint16 readLength(const QByteArray &frame);
|
|
|
|
bool checkFrameBoundary(const QByteArray &frame);
|
|
};
|
|
|
|
#endif // MESSAGE_H
|