#include "mainwindow.h"
#include <QPushButton>
#include <QGridLayout>
#include <QSettings>
#include <QFile>
#include <QDir>
#include <QDateTime>
#include <QLabel>
#include <QLineEdit>
UdpThread::UdpThread(QWidget *receiver) : m_receiver(receiver)
{
qDebug() << "UdpThread::UdpThread threadid=" << (unsigned int)QThread::currentThreadId();
}
UdpThread::~UdpThread()
{
qDebug() << "~UdpThread";
}
void UdpThread::run()
{
qDebug() << "UdpThread::run threadid=" << (unsigned int)QThread::currentThreadId();
UdpWorker udpWorker;
if (!m_receiver.isNull())
{
connect(m_receiver.data(), SIGNAL(sendKS()), &udpWorker, SLOT(onSendKS()));
connect(m_receiver.data(), SIGNAL(sendJZ()), &udpWorker, SLOT(onSendJZ()));
connect(m_receiver.data(), SIGNAL(ipChanged(QString)), &udpWorker, SLOT(onIpChanged(QString)));
connect(m_receiver.data(), SIGNAL(portChanged(QString)), &udpWorker, SLOT(onPortChanged(QString)));
}
exec();
}
UdpWorker::UdpWorker()
{
qDebug() << "UdpWorker::UdpWorker threadid=" << (unsigned int)QThread::currentThreadId();
// 定时器扫描1s内没有再接收数据,判断为接收完毕
timer.setInterval(1000);
connect(&timer, &QTimer::timeout, this, &UdpWorker::onTimeOut);
// 创建接收文件目录
recvFilePath = "receivefile";
QDir mDir;
if (!mDir.exists(recvFilePath))
{
mDir.mkpath(recvFilePath);
}
// 监听目标端口号等待接收数据
bool flag = udpSocket.bind(destPort, QUdpSocket::DontShareAddress);
qDebug() << "udpSocket.bind flag=" << flag;
udpSocket.setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 104857600);
connect(&udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}
UdpWorker::~UdpWorker()
{
}
void UdpWorker::onSendJZ()
{
qDebug() << "UdpWorker::onSendJZ";
allRecData.clear();
createNewFile();
QByteArray byteArray0 = QByteArray::fromHex("A5A500010000");
udpSocket.writeDatagram(byteArray0, destAddress, destPort);
QByteArray byteArray1 = QByteArray::fromHex("A5A500010001");
udpSocket.writeDatagram(byteArray1, destAddress, destPort);
QByteArray byteArray2 = QByteArray::fromHex("A5A500010000");
udpSocket.writeDatagram(byteArray2, destAddress, destPort);
}
void UdpWorker::onSendKS()
{
qDebug() << "UdpWorker::onSendKS";
allRecData.clear();
createNewFile();
QByteArray byteArray0 = QByteArray::fromHex("A5A500020000");
udpSocket.writeDatagram(byteArray0, destAddress, destPort);
QByteArray byteArray1 = QByteArray::fromHex("A5A500020001");
udpSocket.writeDatagram(byteArray1, destAddress, destPort);
QByteArray byteArray2 = QByteArray::fromHex("A5A500020000");
udpSocket.writeDatagram(byteArray2, destAddress, destPort);
}
void UdpWorker::onIpChanged(QString ip)
{
destAddress.setAddress(ip);
}
void UdpWorker::onPortChanged(QString port)
{
destPort = port.toInt();
udpSocket.close();
bool flag = udpSocket.bind(destPort, QUdpSocket::DontShareAddress);
qDebug() << "reset port, then bind again, flag=" << "flag=" << flag;
}
void UdpWorker::readPendingDatagrams()
{
timer.stop();
while (udpSocket.hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket.pendingDatagramSize());
udpSocket.readDatagram(datagram.data(), datagram.size());
allRecData.append(datagram);
}
timer.start();
}
void UdpWorker::onTimeOut()
{
timer.stop();
qDebug() << "UdpWorker::onTimeOut begin fileName=" << fileName;
qDebug() << "UdpWorker::onTimeOut end allRecData.size=" << allRecData.size();
QFile localFile(fileName);
if(!localFile.open(QFile::WriteOnly | QIODevice::Append))
{
qDebug() << "UdpWorker::onTimeOut file canot open";
return;
}
//直接保存数据
localFile.write(allRecData);
localFile.close();
allRecData.clear();
}
void UdpWorker::createNewFile()
{
QDateTime dateTime = QDateTime::currentDateTime();
fileName = dateTime.toString("yyyyMMdd-hhmmss").append(".dat");
fileName = QString("%1%2%3").arg(recvFilePath).arg("/").arg(fileName);
}
MainWindow::MainWindow(QWidget *parent) : QWidget(parent)
{
qDebug() << "MainWindow threadid=" << (unsigned int)QThread::currentThreadId();
udpThread = new UdpThread(this);
connect(udpThread, &UdpThread::finished, udpThread, &UdpThread::deleteLater);
udpThread->start();
QLabel *ipLabel = new QLabel(tr("目标IP"));
QLabel *portLabel = new QLabel(tr("目标Port"));
destIpEdit = new QLineEdit;
destPortEdit = new QLineEdit;
QPushButton *buttonKS = new QPushButton(tr("开始"));
QPushButton *buttonJZ = new QPushButton(tr("校准"));
QGridLayout *layout = new QGridLayout;
layout->addWidget(ipLabel, 0, 0, 1, 1);
layout->addWidget(destIpEdit, 0, 1, 1, 1);
layout->addWidget(portLabel, 1, 0, 1, 1);
layout->addWidget(destPortEdit, 1, 1, 1, 1);
layout->addWidget(buttonKS, 2, 0, 1, 1);
layout->addWidget(buttonJZ, 2, 1, 1, 1);
setLayout(layout);
connect(buttonKS, &QPushButton::clicked, [=](){emit sendKS();});
connect(buttonJZ, &QPushButton::clicked, [=](){emit sendJZ();});
// 初始化目标ip、port信息
QSettings settings("setconfig.ini", QSettings::IniFormat);
QFile file("./setconfig.ini");
if (!file.exists())
{
qDebug() << "setconfig.ini not exist, new one";
settings.setValue("UDP/DESTIP", "000.000.000.000");
settings.setValue("UDP/DESTPORT", "0");
}
settings.beginGroup("UDP");
QString ip = settings.value("DESTIP").toString();
QString port = settings.value("DESTPORT").toString();
destIpEdit->setText(ip);
destPortEdit->setText(port);
connect(destIpEdit, &QLineEdit::editingFinished, this, &MainWindow::onIpEditingFinished);
connect(destPortEdit, &QLineEdit::editingFinished, this, &MainWindow::onPortEditingFinished);
}
MainWindow::~MainWindow()
{
qDebug() << "~MainWindow";
udpThread->exit(0);
delete udpThread;
}
void MainWindow::onIpEditingFinished()
{
emit ipChanged(destIpEdit->text());
QSettings settings("setconfig.ini", QSettings::IniFormat);
settings.setValue("UDP/DESTIP", destIpEdit->text());
}
void MainWindow::onPortEditingFinished()
{
emit portChanged(destPortEdit->text());
QSettings settings("setconfig.ini", QSettings::IniFormat);
settings.setValue("UDP/DESTPORT", destPortEdit->text());
}
评论3
最新资源