|
- #include "NetDataRecv.h"
- #include <QNetworkDatagram>
-
- NetDataRecv::NetDataRecv(QObject* parent)
- : QThread(parent)
- , m_bNeedWork(false)
- , m_pProcess(nullptr)
- , m_pFrame(nullptr)
- , m_socketId(nullptr)
- {
- m_network.ip = "";
- m_network.port = 0;
- m_network.type = 0;
- }
-
- NetDataRecv::~NetDataRecv()
- {
- m_file.write(m_fileArray);
- m_file.flush();
- m_file.close();
- }
-
- void NetDataRecv::init(Frame* frame, Network network, IProcess* process)
- {
- m_pFrame = frame;
- m_network = network;
- m_pProcess = process;
- createDataPath("Network");
- initNetwork();
- }
-
- void NetDataRecv::createDataPath(QString title)
- {
- QString strFilePath = m_pFrame->m_dataStore.m_strDataPath + "/" + title + "_"
- + m_pFrame->m_dataStore.m_strStoreType + "_"
- + m_pFrame->m_dataStore.m_strDateTime + ".bin";
- m_file.setFileName(strFilePath);
- m_file.open(QIODevice::WriteOnly);
- }
-
- void NetDataRecv::initNetwork()
- {
- // 创建用于监听的套接字
- m_socketId = new QUdpSocket(this);
-
- m_socketId->bind(QHostAddress::AnyIPv4, m_network.port,
- QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
-
- // 设置套接字缓冲区: 1M
- m_socketId->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, NET_BUFFER);
-
- // 组播
- if (m_network.type == 2) {
- m_socketId->joinMulticastGroup(QHostAddress(m_network.ip));
- m_socketId->setSocketOption(QAbstractSocket::MulticastLoopbackOption, true);
- }
- }
-
- void NetDataRecv::send()
- {
- QByteArray sendArray;
- m_socketId->writeDatagram(sendArray, QHostAddress(m_network.ip), m_network.port);
- }
-
- void NetDataRecv::run()
- {
- m_bNeedWork = true;
-
- while (m_bNeedWork) {
- // 接收数据
- QNetworkDatagram datagram = m_socketId->receiveDatagram(NET_BUFFER);
- if (!datagram.isValid()) {
- QThread::usleep(1);
- continue;
- }
-
- auto recvdata = datagram.data();
-
- // 将数据放到缓冲区
- if (m_pProcess) {
- QMutexLocker locker(&m_mutex);
- m_pProcess->getConstBuffer()->write((unsigned char*)recvdata.data(),
- (unsigned short)recvdata.size());
- m_fileArray.append((char*)recvdata.data(), recvdata.size());
- if (DataAchiveBuffer <= m_fileArray.size()) {
- m_file.write(m_fileArray);
- m_file.flush();
- m_fileArray.clear();
- }
- }
- }
- }
-
- void NetDataRecv::stop()
- {
- m_bNeedWork = false;
-
- quit();
- wait();
-
- if (m_network.type == 2) {
- m_socketId->leaveMulticastGroup(QHostAddress(m_network.ip));
- }
-
- delete m_socketId;
- m_socketId = nullptr;
- }
|