235 lines
6.1 KiB
C++
235 lines
6.1 KiB
C++
#include "Parse.h"
|
|
|
|
//解析线程
|
|
Parse::Parse(QObject *parent) : QObject(parent)
|
|
{
|
|
setAutoDelete(true);
|
|
|
|
qRegisterMetaType<QList<QByteArray>>("QList<QByteArray>");
|
|
qRegisterMetaType<QMap<quint16,QList<QByteArray>>>("QMap<quint16,QList<QByteArray>>");
|
|
qRegisterMetaType<QMap<quint32,QMap<quint16,QList<QByteArray>>>>("QMap<quint32,QMap<quint16,QList<QByteArray>>>");
|
|
|
|
Packer_init(&packer);
|
|
Parser_init(&parser);
|
|
|
|
datagram.clear();
|
|
}
|
|
|
|
Parse::~Parse()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void Parse::run()
|
|
{
|
|
uint64_t all = 0;
|
|
uint64_t current = 0;
|
|
QElapsedTimer time;
|
|
time.start();
|
|
qDebug() << "parse thread:" << QThread::currentThreadId();
|
|
|
|
union{uint8_t B[8];qint16 h[4];quint16 H[4]; qint32 i[2];quint32 I[2];qint64 q;quint64 Q;}src;
|
|
|
|
QByteArray header;
|
|
header[0] = 0x55;
|
|
header[1] = 0xAA;
|
|
|
|
|
|
all = datagram.size();
|
|
|
|
while (datagram.size() > 0) {
|
|
|
|
#if 0 //方法1
|
|
while (datagram.size() > 0) {
|
|
|
|
int index = datagram.indexOf(header);
|
|
|
|
if(index >= 0)
|
|
{
|
|
|
|
uint8_t id = datagram.at(index + 2);
|
|
|
|
uint32_t len = 0;
|
|
|
|
len = ((uint32_t)datagram.at(index + 3)) << 0;
|
|
len |= ((uint32_t)datagram.at(index + 4)) << 8;
|
|
len |= ((uint32_t)datagram.at(index + 5)) << 16;
|
|
len |= ((uint32_t)datagram.at(index + 6)) << 24;
|
|
|
|
uint8_t sum = 0;
|
|
|
|
QByteArray frame = datagram.mid(index + 7,len);
|
|
|
|
sum = std::accumulate(frame.begin(),frame.end(),0);
|
|
|
|
if(sum == datagram.at(index + 7 + len))
|
|
{
|
|
//ok
|
|
//qDebug() << "ok" << id << len << sum << datagram.size();
|
|
|
|
|
|
uint8_t raw_index = 16;
|
|
|
|
src.B[0] = frame.at(raw_index++);
|
|
src.B[1] = frame.at(raw_index++);
|
|
src.B[2] = frame.at(raw_index++);
|
|
src.B[3] = frame.at(raw_index++);
|
|
quint32 ip = src.I[0];
|
|
|
|
|
|
src.B[0] = frame.at(raw_index++);
|
|
src.B[1] = frame.at(raw_index++);
|
|
quint16 port =src.H[0];
|
|
|
|
current = all - datagram.size();
|
|
|
|
emit frameok(ip,port,frame);
|
|
|
|
emit progress(all,current);
|
|
|
|
}
|
|
|
|
datagram = datagram.mid(index + 7 + len + 1);
|
|
}
|
|
else
|
|
{
|
|
datagram.clear();
|
|
}
|
|
|
|
}
|
|
#else //方法2
|
|
|
|
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
|
|
{
|
|
current ++;
|
|
|
|
uint8_t id = -1;
|
|
switch (id = Parser_char(&parser,*i))
|
|
{
|
|
case 0x01:
|
|
{
|
|
union{uint8_t B[8];qint16 h[4];quint16 H[4]; qint32 i[2];quint32 I[2];qint64 q;quint64 Q;}src;
|
|
|
|
uint32_t index = 0;
|
|
|
|
/*
|
|
src.B[0] = parser.buff[index++];
|
|
src.B[1] = parser.buff[index++];
|
|
src.B[2] = parser.buff[index++];
|
|
src.B[3] = parser.buff[index++];
|
|
src.B[4] = parser.buff[index++];
|
|
src.B[5] = parser.buff[index++];
|
|
src.B[6] = parser.buff[index++];
|
|
src.B[7] = parser.buff[index++];
|
|
qint64 time_t =src.Q;
|
|
|
|
QDateTime time = QDateTime::fromMSecsSinceEpoch(time_t);
|
|
|
|
src.B[0] = parser.buff[index++];
|
|
src.B[1] = parser.buff[index++];
|
|
src.B[2] = parser.buff[index++];
|
|
src.B[3] = parser.buff[index++];
|
|
src.B[4] = parser.buff[index++];
|
|
src.B[5] = parser.buff[index++];
|
|
src.B[6] = parser.buff[index++];
|
|
src.B[7] = parser.buff[index++];
|
|
qint64 save_count =src.Q;
|
|
*/
|
|
|
|
index += 16;
|
|
|
|
src.B[0] = parser.buff[index++];
|
|
src.B[1] = parser.buff[index++];
|
|
src.B[2] = parser.buff[index++];
|
|
src.B[3] = parser.buff[index++];
|
|
quint32 ip = src.I[0];
|
|
|
|
|
|
src.B[0] = parser.buff[index++];
|
|
src.B[1] = parser.buff[index++];
|
|
quint16 port =src.H[0];
|
|
|
|
QByteArray frame;
|
|
frame.clear();
|
|
|
|
for(int i =0;i < parser.len;i++)
|
|
{
|
|
frame.append((const char)parser.buff[i]);
|
|
}
|
|
/*
|
|
if(port_data.contains(port))//包含
|
|
{
|
|
QList<QByteArray> frame_list = port_data.value(port);
|
|
frame_list.append(frame);
|
|
port_data.insert(port,frame_list);
|
|
}
|
|
else//不包含
|
|
{
|
|
QList<QByteArray> frame_list;
|
|
frame_list.append(frame);
|
|
port_data.insert(port,frame_list);
|
|
}
|
|
*/
|
|
|
|
frame_data.append(frame);//超限了
|
|
|
|
emit frameok(ip,port,frame);
|
|
|
|
//emit progress(all,current);
|
|
|
|
}
|
|
break;
|
|
default:{
|
|
|
|
}break;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
emit frameList(frame_data);
|
|
emit frameport(port_data);
|
|
|
|
|
|
|
|
datagram.clear();
|
|
break;//退出,结束线程
|
|
}
|
|
|
|
qDebug() << "thread finished, time: " << time.nsecsElapsed()/1000000.0 << "ms";
|
|
}
|
|
|
|
|
|
|
|
//每次读取一个缓存大小的数据
|
|
void Parse::parseData(const QString filename)
|
|
{
|
|
qDebug() << "Parse data:" << QThread::currentThreadId();
|
|
|
|
if(filename.size() <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
QFile *file = new QFile(filename);
|
|
|
|
if(!file->open(QIODevice::ReadOnly))
|
|
{
|
|
delete file;
|
|
file = nullptr;
|
|
|
|
return;
|
|
}
|
|
|
|
frame_data.clear();
|
|
datagram.clear();
|
|
datagram.append(file->readAll());
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|