优化scoket

This commit is contained in:
zhangsheng 2025-03-13 15:10:35 +08:00
parent 5525e96c9b
commit 5b93c1e055
4 changed files with 107 additions and 72 deletions

View File

@ -9,6 +9,7 @@ CONFIG += c++11
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \ SOURCES += \
MyTcpClient.cpp \
acceleration.cpp \ acceleration.cpp \
common.cpp \ common.cpp \
keyphase.cpp \ keyphase.cpp \
@ -23,6 +24,7 @@ SOURCES += \
velocity.cpp velocity.cpp
HEADERS += \ HEADERS += \
MyTcpClient.h \
acceleration.h \ acceleration.h \
common.h \ common.h \
data_config.h \ data_config.h \

View File

@ -26,7 +26,8 @@ enum CMTCommand {
kUpgradeCard = 3, kUpgradeCard = 3,
kGetVersionInfo = 4, kGetVersionInfo = 4,
kRelaySetting = 5, kRelaySetting = 5,
kRelayStatus = 6 kRelayStatus = 6,
kUpgradeProgress = 7
}; };
enum SlotType{ enum SlotType{
POWER = 10, POWER = 10,

View File

@ -5,7 +5,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonObject> #include <QJsonObject>
#include <QTcpSocket>
#include "keyphase.h" #include "keyphase.h"
#include "singlerelay.h" #include "singlerelay.h"
#include "tachometer.h" #include "tachometer.h"
@ -18,7 +18,7 @@
#include <qsettings.h> #include <qsettings.h>
#include <QNetworkProxy> #include <QNetworkProxy>
#include "relaysetting.h" #include "relaysetting.h"
#include "common.h"
QString g_strServerIp; QString g_strServerIp;
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
@ -35,10 +35,22 @@ MainWindow::MainWindow(QWidget *parent)
ui->widget_body->installEventFilter(this); ui->widget_body->installEventFilter(this);
ui->widget_body->setProperty("flag", "body"); ui->widget_body->setProperty("flag", "body");
ui->statusBar->setProperty("flag","status"); ui->statusBar->setProperty("flag","status");
// 创建进度条
progressBar = new QProgressBar(this);
// 设置进度条的范围0到100
progressBar->setRange(0, 100);
// 将进度条添加到状态栏
statusBar()->addWidget(progressBar);
progressBar->setVisible(false); // 初始隐藏
progressBar->setFixedWidth(300);
//this->initStyle(); //this->initStyle();
//添加信号槽 //添加信号槽
QObject::connect(ui->action_realy, &QAction::triggered, this, &MainWindow::onMenuAction_relay); QObject::connect(ui->action_realy, &QAction::triggered, this, &MainWindow::onMenuAction_relay);
slot = -1; slot_no = -1;
btnGroup_slot = new QButtonGroup(this); btnGroup_slot = new QButtonGroup(this);
btnGroup_slot->addButton(ui->pushButton_slot0); btnGroup_slot->addButton(ui->pushButton_slot0);
btnGroup_slot->addButton(ui->pushButton_slot1); btnGroup_slot->addButton(ui->pushButton_slot1);
@ -84,7 +96,7 @@ MainWindow::MainWindow(QWidget *parent)
QSettings settingsread(QCoreApplication::applicationDirPath() + "\\config\\config.ini",QSettings::IniFormat); QSettings settingsread(QCoreApplication::applicationDirPath() + "\\config\\config.ini",QSettings::IniFormat);
g_strServerIp = settingsread.value("Server/IP").toString(); g_strServerIp = settingsread.value("Server/IP").toString();
connectServer();
// 设置自定义日志处理函数 // 设置自定义日志处理函数
#ifndef QT_DEBUG #ifndef QT_DEBUG
qInstallMessageHandler(messageHandler); qInstallMessageHandler(messageHandler);
@ -96,6 +108,34 @@ MainWindow::~MainWindow()
{ {
delete ui; delete ui;
} }
void MainWindow::connectServer()
{
// 连接服务器
client.connectToServer(g_strServerIp, 10000);
//client.sendData("send_buf", 1);
// // 监听信号
// QObject::connect(&client, &MyTcpClient::connected, []() {
// qDebug() << "Client connected!";
// });
// // QObject::connect(&client, &MyTcpClient::dataReceived, [](const QByteArray &data) {
// // qDebug() << "Received from server:" << data;
// // });
connect(&client, SIGNAL(dataReceived(const QByteArray&)), this, SLOT(readData(const QByteArray&)));
connect(&client, SIGNAL(disconnected()), this, SLOT(onDisConnected()));
// // QObject::connect(&client, &MyTcpClient::errorOccurred, [](const QString &error) {
// // qDebug() << "Error:" << error;
// // });
// socket = new QTcpSocket(this);
// connect(socket, &QTcpSocket::connected, this, &MainWindow::onConnected);
// connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readData);
// socket->connectToHost(g_strServerIp, 10000);
}
void MainWindow::initStyle() void MainWindow::initStyle()
{ {
//加载样式表 //加载样式表
@ -542,22 +582,10 @@ void MainWindow::sendUpgradePackage(int slot)
qWarning() << "Failed to open update file."; qWarning() << "Failed to open update file.";
return; return;
} }
QTcpSocket socket;
// 连接到服务器
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::NoProxy); // 不使用代理
socket.connectToHost(g_strServerIp, 10000);
socket.setProxy(proxy);
if (!socket.waitForConnected()) {
qDebug() << "Connection failed!";
return;
}
// 读取文件内容 // 读取文件内容
QByteArray fileData = file.readAll(); QByteArray fileData = file.readAll();
int fileSize = fileData.size(); int fileSize = fileData.size();
//fileSize = myHtonl(fileSize);
qDebug() << "fileSize" << fileSize <<endl; qDebug() << "fileSize" << fileSize <<endl;
// 创建 PackageHead 结构体 // 创建 PackageHead 结构体
@ -574,20 +602,7 @@ void MainWindow::sendUpgradePackage(int slot)
header.crc = calculate_crc(upgrade_car_req.card_id,fileData); header.crc = calculate_crc(upgrade_car_req.card_id,fileData);
header.len = fileSize; header.len = fileSize;
qDebug() << "filheader.crc" << header.crc << "card_id" << upgrade_car_req.card_id << endl; qDebug() << "filheader.crc" << header.crc << "card_id" << upgrade_car_req.card_id << endl;
// 发送头部数据
//QByteArray packet(reinterpret_cast<char*>(&header), sizeof(PackageHead));
// 发送文件内容
// socket.write(packet); // 发送头部
// socket.waitForBytesWritten();
// QByteArray packet2(reinterpret_cast<char*>(&upgrade_car_req), sizeof(UpgradeCardReq));
// socket.write(packet2); // 发送头部
// socket.waitForBytesWritten();
// socket.write(fileData); // 发送文件数据
// socket.waitForBytesWritten();
//QByteArray send_buf;
char *send_buf = NULL; char *send_buf = NULL;
send_buf = (char *)malloc(sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1); send_buf = (char *)malloc(sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1);
memset(send_buf,0,sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1); memset(send_buf,0,sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1);
@ -609,45 +624,27 @@ void MainWindow::sendUpgradePackage(int slot)
}else{ }else{
chunkSize = totalBytes - bytesSent; chunkSize = totalBytes - bytesSent;
} }
qint64 bytesWritten = socket.write(send_buf + bytesSent, chunkSize); qint64 bytesWritten = client.sendData(send_buf + bytesSent, chunkSize);
socket.waitForBytesWritten();
qDebug() << "bytesWritten" << bytesWritten << "bytesSent" << bytesSent << endl; qDebug() << "bytesWritten" << bytesWritten << "bytesSent" << bytesSent << endl;
if (bytesWritten == -1) { if (bytesWritten == -1) {
// Handle error
break; break;
} }
bytesSent += bytesWritten; bytesSent += bytesWritten;
} }
if (socket.waitForReadyRead()) { qDebug() << "bytesSent" << bytesSent << endl;
QByteArray response = socket.readAll(); client.waitForRead();
UpgradeRsp resp; progressBar->reset();
QByteArray byteArray = response.mid(sizeof(PackageHead)); progressBar->setVisible(true);
QDataStream stream(&byteArray, QIODevice::ReadOnly); QString upgrade_text = QStringLiteral("正在上传板卡 [ %1 ] …… %p%").arg(slot);
stream >> resp.code ; progressBar->setTextVisible(true);
if(resp.code == 1){ progressBar->setFormat(upgrade_text);
QMessageBox::information(this, QStringLiteral("提示"), "上传成功!");
}
qDebug() << "Server response: " << resp.code;
}
// 关闭文件和连接
file.close(); file.close();
socket.disconnectFromHost();
if(send_buf != NULL) if(send_buf != NULL)
free(send_buf); free(send_buf);
} }
void MainWindow::getVersion(int slot) void MainWindow::getVersion(int slot)
{ {
// 连接到服务器 slot_no = slot;
QTcpSocket socket;
// 连接到服务器
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::NoProxy); // 不使用代理
socket.connectToHost(g_strServerIp, 10000);
socket.setProxy(proxy);
if (!socket.waitForConnected()) {
qDebug() << "Connection failed!";
return;
}
PackageHead header = { {0xAA, 0x55, 0xAA}, kGetVersionInfo, 1,0,{} }; PackageHead header = { {0xAA, 0x55, 0xAA}, kGetVersionInfo, 1,0,{} };
qDebug() << "slot" << slot <<endl; qDebug() << "slot" << slot <<endl;
GetVersionReq get_version_req; GetVersionReq get_version_req;
@ -659,19 +656,43 @@ void MainWindow::getVersion(int slot)
memcpy(send_buf, (char*)&header, sizeof(PackageHead)); memcpy(send_buf, (char*)&header, sizeof(PackageHead));
memcpy(send_buf + sizeof(PackageHead), (char*)&get_version_req, sizeof(GetVersionReq)); memcpy(send_buf + sizeof(PackageHead), (char*)&get_version_req, sizeof(GetVersionReq));
int length = sizeof(PackageHead) + sizeof(GetVersionReq); int length = sizeof(PackageHead) + sizeof(GetVersionReq);
qint64 bytesWritten = socket.write(send_buf, length); qint64 bytesWritten = client.sendData(send_buf, length);
qDebug() << "Server response: " << bytesWritten; client.waitForRead();
if (socket.waitForReadyRead()) { qDebug() << "bytesWritten: " << bytesWritten;
QByteArray response = socket.readAll(); }
VersionRsp version_rsp; void MainWindow::onDisConnected()
PackageHead header; {
memcpy(&header,response.data(),sizeof(PackageHead)); statusBar()->showMessage("连接失败!", 10000); // 显示3秒
qDebug() << "header len" << header.len << endl;
if(header.cmd == kGetVersionInfo){
memcpy(&version_rsp,response.data() + sizeof(PackageHead),sizeof(VersionRsp));
QString strVerion = QString("第 %1 板卡\nFPGA 版本:%2\n软件版本:%3\nFPGA版本日期%4").arg(slot).arg(version_rsp.fpga).arg(version_rsp.sw).arg(version_rsp.fpga_data);
QMessageBox::information(this, QStringLiteral("提示"), strVerion);
}
}
} }
void MainWindow::readData(const QByteArray& data)
{
qDebug() << "Received from server:" << data;
PackageHead header;
memcpy(&header,data.data(),sizeof(PackageHead));
if(header.cmd == kGetVersionInfo){
VersionRsp version_rsp;
memcpy(&version_rsp,data.data() + sizeof(PackageHead),sizeof(VersionRsp));
QString strVerion = QString("第 %1 板卡\nFPGA 版本:%2\n软件版本:%3\nFPGA版本日期%4").arg(slot_no).arg(version_rsp.fpga).arg(version_rsp.sw).arg(version_rsp.fpga_data);
QMessageBox::information(this, QStringLiteral("提示"), strVerion);
}else if(header.cmd == kUpgradeCard){
UpgradeRsp resp;
QByteArray byteArray = data.mid(sizeof(PackageHead));
QDataStream stream(&byteArray, QIODevice::ReadOnly);
stream >> resp.code ;
// if(resp.code == 1){
// QMessageBox::information(this, QStringLiteral("提示"), "上传成功!");
// }
}else if(header.cmd == kUpgradeProgress){
QByteArray byteArray = data.mid(sizeof(PackageHead));
UpgradeRsp upgrade_resp;
QDataStream stream(&byteArray, QIODevice::ReadOnly);
stream >> upgrade_resp.code ;
progressBar->setValue(upgrade_resp.code);
if(upgrade_resp.code == 100){
progressBar->setVisible(false);
statusBar()->showMessage("升级完成!", 3000); // 显示3秒
}
//qDebug() << "Server response: " << upgrade_resp.code;
}
}

View File

@ -5,7 +5,10 @@
#include <QMap> #include <QMap>
#include <QButtonGroup> #include <QButtonGroup>
#include <QPushButton> #include <QPushButton>
#include <QTcpSocket>
#include "MyTcpClient.h"
#include "data_config.h" #include "data_config.h"
#include <QProgressBar>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
@ -37,7 +40,11 @@ private:
QButtonGroup * btnGroup_slot = nullptr; QButtonGroup * btnGroup_slot = nullptr;
int slot; int slot_no = 0;
QTcpSocket *socket;
MyTcpClient client;
QProgressBar *progressBar;
void createMenu(); void createMenu();
void createMenu(const QString& rootTitle, QPushButton* button = nullptr); void createMenu(const QString& rootTitle, QPushButton* button = nullptr);
@ -48,7 +55,11 @@ private:
void sendUpgradePackage(int slot); void sendUpgradePackage(int slot);
void getVersion(int slot); void getVersion(int slot);
void initStyle(); void initStyle();
void connectServer();
private slots: private slots:
void onDisConnected();
void readData(const QByteArray&);
void onMenuAction_relay(); void onMenuAction_relay();
void OnButtonGroup(QAbstractButton *); void OnButtonGroup(QAbstractButton *);