1.调通所有与服务器HTTP连接的接口 2.更新图语License从服务器查询和U盘获取后上报,前板可直接使用产测工具写入License 3.优化接收到前板的H264解码后出现视频卡的问题 4.更新从前板取图后旋转 5.增加ffmpeg解码的视频分辨率获取
This commit is contained in:
parent
07ab6b9608
commit
e0c1e37191
|
@ -2,19 +2,19 @@
|
||||||
{
|
{
|
||||||
"cmd": "GET_BACK_MAC",
|
"cmd": "GET_BACK_MAC",
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"lable": "获取后板MAC地址",
|
"lable": "get_MAC_addr",
|
||||||
"timeout": 0
|
"timeout": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cmd": "GET_BACK_UUID",
|
"cmd": "GET_BACK_UUID_SN",
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"lable": "获取UUID",
|
"lable": "get_UUID_SN",
|
||||||
"timeout": 0
|
"timeout": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cmd": "GET_BACK_SN",
|
"cmd": "WRITE_BACK_UUID_SN",
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"lable": "获取SN",
|
"lable": "write_UUID_SN",
|
||||||
"timeout": 0
|
"timeout": 0
|
||||||
}
|
}
|
||||||
]
|
]
|
|
@ -16,23 +16,5 @@
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"lable": "后板硬件版本:",
|
"lable": "后板硬件版本:",
|
||||||
"timeout": 2000
|
"timeout": 2000
|
||||||
},
|
|
||||||
{
|
|
||||||
"cmd": "GET_BACK_MAC",
|
|
||||||
"val": 0,
|
|
||||||
"lable": "后板MAC地址:",
|
|
||||||
"timeout": 2000
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cmd": "GET_BACK_SN",
|
|
||||||
"val": 0,
|
|
||||||
"lable": "SN号:",
|
|
||||||
"timeout": 2000
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cmd": "GET_BACK_UUID",
|
|
||||||
"val": 0,
|
|
||||||
"lable": "UUID:",
|
|
||||||
"timeout": 2000
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -124,5 +124,11 @@
|
||||||
"val": 1,
|
"val": 1,
|
||||||
"lable": "设置log等级",
|
"lable": "设置log等级",
|
||||||
"timeout": 2000
|
"timeout": 2000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": "SET_ALL_DATA_RESET",
|
||||||
|
"val": "0",
|
||||||
|
"lable": "前板恢复出厂",
|
||||||
|
"timeout": 2000
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"cmd": "get_YUV",
|
"cmd": "GET_IMG",
|
||||||
"val": 1,
|
"val": "0",
|
||||||
"lable": "雷达测试",
|
"lable": "取图",
|
||||||
"timeout": 2000
|
"timeout": 0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"cmd": "START_VIDEO",
|
"cmd": "START_VIDEO",
|
||||||
"val": 1,
|
"val": "1",
|
||||||
"lable": "启动视频",
|
"lable": "启动视频",
|
||||||
"timeout": 0
|
"timeout": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cmd": "STOP_VIDEO",
|
"cmd": "STOP_VIDEO",
|
||||||
"val": 1,
|
"val": "0",
|
||||||
"lable": "停止视频",
|
"lable": "停止视频",
|
||||||
"timeout": 0
|
"timeout": 0
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,51 +72,47 @@ QImage convertYUV420ToQImage(const QByteArray& yuv420Data, int width, int height
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 显示图片的函数
|
|
||||||
void showPic(QLabel* leftLens_m_imageLabel, QLabel* rightLens_m_imageLabel, const QString& client, const QByteArray& valData)
|
void showPic(QLabel* leftLens_m_imageLabel, QLabel* rightLens_m_imageLabel, const QString& client, const QByteArray& valData)
|
||||||
{
|
{
|
||||||
int lens_n = static_cast<unsigned char>(valData[3]);
|
int lens_n = static_cast<unsigned char>(valData[0]);
|
||||||
int width = (static_cast<unsigned char>(valData[5]) << 8) | static_cast<unsigned char>(valData[4]);
|
int width = (static_cast<unsigned char>(valData[2]) << 8) | static_cast<unsigned char>(valData[1]);
|
||||||
int height = (static_cast<unsigned char>(valData[7]) << 8) | static_cast<unsigned char>(valData[6]);
|
int height = (static_cast<unsigned char>(valData[4]) << 8) | static_cast<unsigned char>(valData[3]);
|
||||||
int format = static_cast<unsigned char>(valData[8]);
|
int format = static_cast<unsigned char>(valData[5]);
|
||||||
qDebug() << "lens_n = " << lens_n;
|
qDebug() << "lens_n = " << lens_n;
|
||||||
qDebug() << "format = " << format;
|
qDebug() << "format = " << format;
|
||||||
qDebug() << "width = " << width;
|
qDebug() << "width = " << width;
|
||||||
qDebug() << "height = " << height;
|
qDebug() << "height = " << height;
|
||||||
|
|
||||||
QByteArray yuvData = valData.mid(9);
|
QByteArray yuvData = valData.mid(6);
|
||||||
|
|
||||||
qDebug() << "yuvData size = " << yuvData.size();
|
qDebug() << "yuvData size = " << yuvData.size();
|
||||||
|
|
||||||
|
QImage image;
|
||||||
if (format == YUV422) {
|
if (format == YUV422) {
|
||||||
QImage image = convertYUV422ToQImage(yuvData, width, height);
|
image = convertYUV422ToQImage(yuvData, width, height);
|
||||||
QImage scaledImage = image.scaled(leftLens_m_imageLabel->size(), Qt::KeepAspectRatio);
|
|
||||||
if (lens_n == 0) {
|
|
||||||
leftLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
|
||||||
rightLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
|
||||||
}
|
|
||||||
else if (lens_n == 1) {
|
|
||||||
rightLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarning() << "Unsupported image lens!";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (format == YUV420) {
|
else if (format == YUV420) {
|
||||||
QImage image = convertYUV420ToQImage(yuvData, width, height);
|
image = convertYUV420ToQImage(yuvData, width, height);
|
||||||
QImage scaledImage = image.scaled(leftLens_m_imageLabel->size(), Qt::KeepAspectRatio);
|
|
||||||
if (lens_n == 0) {
|
|
||||||
leftLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
|
||||||
}
|
|
||||||
else if (lens_n == 1) {
|
|
||||||
rightLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qWarning() << "Unsupported image lens!";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qWarning() << "Unsupported image format!";
|
qWarning() << "Unsupported image format!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 旋转图像90度
|
||||||
|
QTransform transform;
|
||||||
|
transform.rotate(90); // 可以调整旋转角度
|
||||||
|
QImage rotatedImage = image.transformed(transform);
|
||||||
|
|
||||||
|
QImage scaledImage = rotatedImage.scaled(leftLens_m_imageLabel->size(), Qt::KeepAspectRatio);
|
||||||
|
if (lens_n == 0) {
|
||||||
|
leftLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
||||||
|
//rightLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
||||||
|
}
|
||||||
|
else if (lens_n == 1) {
|
||||||
|
rightLens_m_imageLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qWarning() << "Unsupported image lens!";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,11 +37,11 @@ void FFmpegDecoder::initialize()
|
||||||
avformat_network_init();
|
avformat_network_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FFmpegDecoder::decodeFile(const QString& filePath, QLabel* videoLabel)
|
void FFmpegDecoder::decodeFile(const QString& filePath, QLabel* videoDisplayLabel)
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
this->filePath = filePath;
|
this->filePath = filePath;
|
||||||
this->videoLabel = videoLabel;
|
this->videoLabel = videoDisplayLabel;
|
||||||
if (!isRunning()) {
|
if (!isRunning()) {
|
||||||
qDebug() << "Starting decoder thread";
|
qDebug() << "Starting decoder thread";
|
||||||
start(NormalPriority);
|
start(NormalPriority);
|
||||||
|
@ -69,6 +69,13 @@ void FFmpegDecoder::run()
|
||||||
QLabel* currentVideoLabel = videoLabel;
|
QLabel* currentVideoLabel = videoLabel;
|
||||||
QSize labelSize = currentVideoLabel->size();
|
QSize labelSize = currentVideoLabel->size();
|
||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
|
|
||||||
|
if (labelSize.width() <= 0 || labelSize.height() <= 0) {
|
||||||
|
// 自动调整 QLabel 大小
|
||||||
|
labelSize = QSize(800, 600); // 例如设置为默认大小
|
||||||
|
currentVideoLabel->setFixedSize(labelSize);
|
||||||
|
qDebug() << "Adjusting video label size to: Width =" << labelSize.width() << ", Height =" << labelSize.height();
|
||||||
|
}
|
||||||
qDebug() << "Video label size: Width =" << labelSize.width() << ", Height =" << labelSize.height();
|
qDebug() << "Video label size: Width =" << labelSize.width() << ", Height =" << labelSize.height();
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
|
@ -107,6 +114,8 @@ void FFmpegDecoder::run()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug() << "H264 video resolution: Width =" << frame->width << ", Height =" << frame->height;
|
||||||
|
|
||||||
QImage img = avFrameToQImage(frame);
|
QImage img = avFrameToQImage(frame);
|
||||||
QImage scaledImage = img.scaled(labelSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
QImage scaledImage = img.scaled(labelSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
currentVideoLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
currentVideoLabel->setPixmap(QPixmap::fromImage(scaledImage));
|
||||||
|
@ -184,7 +193,7 @@ bool FFmpegDecoder::initializeFFmpeg(const QString& filePath)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame = av_frame_alloc();
|
frame = av_frame_alloc();
|
||||||
packet = av_packet_alloc();
|
packet = av_packet_alloc();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QWaitCondition>
|
#include <QWaitCondition>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "RingBuffer.h"
|
#include "RingBuffer.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -8,7 +8,7 @@ ClientHandler::ClientHandler(QTcpSocket* socket,
|
||||||
QJsonArray frontBoardOneClickTest, QJsonArray frontBoardTest, QJsonArray frontBoardFuncConfig,
|
QJsonArray frontBoardOneClickTest, QJsonArray frontBoardTest, QJsonArray frontBoardFuncConfig,
|
||||||
QJsonArray frontBoardDevInfoJson, QJsonArray frontBoardLicenseJson,
|
QJsonArray frontBoardDevInfoJson, QJsonArray frontBoardLicenseJson,
|
||||||
QJsonArray backBoardOneClickTest, QJsonArray backBoardTest, QJsonArray backBoardFuncConfig,
|
QJsonArray backBoardOneClickTest, QJsonArray backBoardTest, QJsonArray backBoardFuncConfig,
|
||||||
QJsonArray backBoardDevInfoJson,
|
QJsonArray backBoardDevInfoJson, QJsonArray backBoardUuidJson,
|
||||||
QJsonArray getPicJson, QJsonArray getVideoJson, int clientId, QObject* parent)
|
QJsonArray getPicJson, QJsonArray getVideoJson, int clientId, QObject* parent)
|
||||||
: QObject(parent), socket(socket),
|
: QObject(parent), socket(socket),
|
||||||
frontBoardOneClickTest(frontBoardOneClickTest), frontBoardTest(frontBoardTest),
|
frontBoardOneClickTest(frontBoardOneClickTest), frontBoardTest(frontBoardTest),
|
||||||
|
@ -16,7 +16,7 @@ ClientHandler::ClientHandler(QTcpSocket* socket,
|
||||||
frontBoardLicenseJson(frontBoardLicenseJson),
|
frontBoardLicenseJson(frontBoardLicenseJson),
|
||||||
backBoardOneClickTest(backBoardOneClickTest), backBoardTest(backBoardTest),
|
backBoardOneClickTest(backBoardOneClickTest), backBoardTest(backBoardTest),
|
||||||
backBoardFuncConfig(backBoardFuncConfig), backBoardDevInfoJson(backBoardDevInfoJson),
|
backBoardFuncConfig(backBoardFuncConfig), backBoardDevInfoJson(backBoardDevInfoJson),
|
||||||
getPicJson(getPicJson), getVideoJson(getVideoJson),
|
backBoardUuidJson(backBoardUuidJson), getPicJson(getPicJson), getVideoJson(getVideoJson),
|
||||||
currentItemIndex(0), clientId(clientId),
|
currentItemIndex(0), clientId(clientId),
|
||||||
isManualSend(false), isSingleSend(false), isClickedSend(false), size(0),
|
isManualSend(false), isSingleSend(false), isClickedSend(false), size(0),
|
||||||
isFirstDataReceived(true), processDataFunction(nullptr),
|
isFirstDataReceived(true), processDataFunction(nullptr),
|
||||||
|
@ -35,15 +35,17 @@ ClientHandler::~ClientHandler() {
|
||||||
qDebug() << "ClientHandler destroyed for clientId:" << clientId;
|
qDebug() << "ClientHandler destroyed for clientId:" << clientId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientHandler::startReadVideoDataTimer()
|
void ClientHandler::startReadVideoDataTimer(int client_Id)
|
||||||
{
|
{
|
||||||
emit startReadTimer(clientId);
|
//emit startReadTimer(clientId);
|
||||||
|
emit startReadTimer(client_Id);
|
||||||
//qDebug() << "------ startClientReadTimer clientId:" << clientId;
|
//qDebug() << "------ startClientReadTimer clientId:" << clientId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientHandler::stopReadVideoDataTimer()
|
void ClientHandler::stopReadVideoDataTimer(int client_Id)
|
||||||
{
|
{
|
||||||
emit stopReadTimer(clientId);
|
//emit stopReadTimer(clientId);
|
||||||
|
emit stopReadTimer(client_Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 getFreeMemory() {
|
qint64 getFreeMemory() {
|
||||||
|
@ -121,18 +123,30 @@ void ClientHandler::sendDataToClient(const QByteArray& data)
|
||||||
|
|
||||||
void ClientHandler::sendJsonItem(const QJsonArray& jsonArray, int itemIndex, const QString text, const QString& itemType)
|
void ClientHandler::sendJsonItem(const QJsonArray& jsonArray, int itemIndex, const QString text, const QString& itemType)
|
||||||
{
|
{
|
||||||
|
currentJson = jsonArray;
|
||||||
|
currentJsonItem = itemIndex;
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
if (itemType == "License") {
|
if (itemType == "License") {
|
||||||
|
|
||||||
}
|
}
|
||||||
isSingleSend = true;
|
isSingleSend = true;
|
||||||
isClickedSend = true;
|
isClickedSend = true;
|
||||||
|
isRecvImgData = false;
|
||||||
if (itemType == "handleVideo") {
|
if (itemType == "handleVideo") {
|
||||||
if(itemIndex == 0)
|
if (itemIndex == 0) {
|
||||||
isRecvVideoData = 1;
|
qDebug() << "0 itemIndex: " << itemIndex;
|
||||||
else
|
isSingleSend = false;
|
||||||
isRecvVideoData = 0;
|
isClickedSend = false;
|
||||||
startReadVideoDataTimer();
|
}
|
||||||
|
else {
|
||||||
|
qDebug() << "!0 itemIndex: " << itemIndex;
|
||||||
|
stopReadVideoDataTimer(preVideoClientId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (itemType == "getPic") {
|
||||||
|
isSingleSend = false;
|
||||||
|
isClickedSend = false;
|
||||||
|
isRecvImgData = true;
|
||||||
}
|
}
|
||||||
qDebug() << "itemIndex:" << itemIndex;
|
qDebug() << "itemIndex:" << itemIndex;
|
||||||
qDebug() << "jsonArray.size():" << jsonArray.size();
|
qDebug() << "jsonArray.size():" << jsonArray.size();
|
||||||
|
@ -197,17 +211,7 @@ void ClientHandler::sendLicenseItem(int itemIndex, const QString text)
|
||||||
qDebug() << "Invalid itemIndex";
|
qDebug() << "Invalid itemIndex";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QJsonObject item = frontBoardLicenseJson[itemIndex].toObject();
|
sendJsonItem(frontBoardLicenseJson, itemIndex, text, "License");
|
||||||
QString label = item["lable"].toString();
|
|
||||||
if (label == "write_license") {
|
|
||||||
LicenseConfirmWindow dialog("你确定要发送此授权项吗?");
|
|
||||||
if (dialog.exec() == QDialog::Accepted) {
|
|
||||||
sendJsonItem(frontBoardLicenseJson, itemIndex, text, "License");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sendJsonItem(frontBoardLicenseJson, itemIndex, text, "License");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientHandler::sendUuidItem(int itemIndex, const QString text)
|
void ClientHandler::sendUuidItem(int itemIndex, const QString text)
|
||||||
|
@ -333,14 +337,6 @@ void ClientHandler::sendDevInfoJsonItem(const QJsonObject& jsonItem, int itemInd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//void ClientHandler::sendLicenseItem()
|
|
||||||
//{
|
|
||||||
// if (currentLicenseIndex < frontBoardLicenseJson.size()) {
|
|
||||||
//
|
|
||||||
// currentLicenseIndex ++;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
void ClientHandler::sendDevInfoItem()
|
void ClientHandler::sendDevInfoItem()
|
||||||
{
|
{
|
||||||
// 前板
|
// 前板
|
||||||
|
@ -371,6 +367,9 @@ void ClientHandler::sendNextItem()
|
||||||
isClickedSend = true;
|
isClickedSend = true;
|
||||||
qDebug() << "------> locker(&mutex) :" << itemsProcessedCount;
|
qDebug() << "------> locker(&mutex) :" << itemsProcessedCount;
|
||||||
if (currentItemIndex < frontBoardOneClickTest.size()) {
|
if (currentItemIndex < frontBoardOneClickTest.size()) {
|
||||||
|
currentJson = frontBoardOneClickTest;
|
||||||
|
currentJsonItem = currentItemIndex;
|
||||||
|
|
||||||
currentItem = frontBoardOneClickTest[currentItemIndex].toObject();
|
currentItem = frontBoardOneClickTest[currentItemIndex].toObject();
|
||||||
QString itemData = QJsonDocument(currentItem).toJson();
|
QString itemData = QJsonDocument(currentItem).toJson();
|
||||||
//qDebug() << "Sending item index:" << currentItemIndex << "data:" << itemData;
|
//qDebug() << "Sending item index:" << currentItemIndex << "data:" << itemData;
|
||||||
|
@ -411,19 +410,29 @@ void ClientHandler::sendNextItem()
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientHandler::RNDISClient1Data(QByteArray& data) {
|
void ClientHandler::RNDISClient1Data(QByteArray& data) {
|
||||||
qDebug() << " RNDISClient1Data size:" << data.size();
|
//qDebug() << " RNDISClient1Data size:" << data.size();
|
||||||
|
isRecvVideoData = false;
|
||||||
|
isStartVideo = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientHandler::RNDISClient2Data(QByteArray& data) {
|
void ClientHandler::RNDISClient2Data(QByteArray& data) {
|
||||||
qDebug() << " RNDISClient2Data size:" << data.size();
|
//qDebug() << " RNDISClient2Data size:" << data.size();
|
||||||
|
isRecvVideoData = true;
|
||||||
|
isStartVideo = true;
|
||||||
|
//qDebug() << " isRecvVideoData:" << isRecvVideoData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientHandler::RNDISClient3Data(QByteArray& data) {
|
void ClientHandler::RNDISClient3Data(QByteArray& data) {
|
||||||
qDebug() << " RNDISClient3Data size:" << data.size();
|
//qDebug() << " RNDISClient3Data size:" << data.size();
|
||||||
|
isRecvVideoData = false;
|
||||||
|
isStartVideo = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientHandler::RNDISClient4Data(QByteArray& data) {
|
void ClientHandler::RNDISClient4Data(QByteArray& data) {
|
||||||
//qDebug() << " RNDISClient4Data size:" << data.size();
|
//qDebug() << " RNDISClient4Data size:" << data.size();
|
||||||
|
//qDebug() << " RNDISClient4Data size:" << data.size();
|
||||||
|
isRecvVideoData = false;
|
||||||
|
isStartVideo = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientHandler::RNDISFirstData(QByteArray& data) {
|
bool ClientHandler::RNDISFirstData(QByteArray& data) {
|
||||||
|
@ -431,9 +440,9 @@ bool ClientHandler::RNDISFirstData(QByteArray& data) {
|
||||||
//int clientType = data.at(0); // 根据实际数据格式提取标识
|
//int clientType = data.at(0); // 根据实际数据格式提取标识
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
unsigned char clientType = static_cast<unsigned char>(data[10]);
|
unsigned char clientType = static_cast<unsigned char>(data[10]);
|
||||||
qDebug() << " clientType :" << clientType;
|
//qDebug() << " clientType :" << clientType;
|
||||||
QByteArray tmpdata = data.left(11);
|
QByteArray tmpdata = data.left(11);
|
||||||
qDebug() << " tmpdata :" << tmpdata.toHex().data();
|
//qDebug() << " clientType :" << clientType << " tmpdata :" << tmpdata.toHex().data();
|
||||||
switch (clientType) {
|
switch (clientType) {
|
||||||
case 0x01:
|
case 0x01:
|
||||||
processDataFunction = &ClientHandler::RNDISClient1Data;
|
processDataFunction = &ClientHandler::RNDISClient1Data;
|
||||||
|
@ -441,12 +450,15 @@ bool ClientHandler::RNDISFirstData(QByteArray& data) {
|
||||||
socket->setReadBufferSize(20 * 1024);
|
socket->setReadBufferSize(20 * 1024);
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
|
qDebug() << " clientId :" << clientId;
|
||||||
processDataFunction = &ClientHandler::RNDISClient2Data;
|
processDataFunction = &ClientHandler::RNDISClient2Data;
|
||||||
socket->setReadBufferSize(100 * 1024);
|
socket->setReadBufferSize(100 * 1024);
|
||||||
data = data.mid(11);
|
data = data.mid(11);
|
||||||
(this->*processDataFunction)(data);
|
(this->*processDataFunction)(data);
|
||||||
setThreadPriority(QThread::HighPriority);
|
setThreadPriority(QThread::HighPriority);
|
||||||
preVideoClientId = clientId;
|
preVideoClientId = clientId;
|
||||||
|
//qDebug() << " clientType :" << clientType << " preVideoClientId :" << preVideoClientId << " tmpdata :" << tmpdata.toHex().data();
|
||||||
|
startReadVideoDataTimer(preVideoClientId);
|
||||||
break;
|
break;
|
||||||
case 0x03:
|
case 0x03:
|
||||||
processDataFunction = &ClientHandler::RNDISClient3Data;
|
processDataFunction = &ClientHandler::RNDISClient3Data;
|
||||||
|
@ -503,12 +515,13 @@ void ClientHandler::setThreadPriority(QThread::Priority priority) {
|
||||||
void ClientHandler::onDataReceived()
|
void ClientHandler::onDataReceived()
|
||||||
{
|
{
|
||||||
// 接收其他数据 添加区分 视频与其他数据 的标志位
|
// 接收其他数据 添加区分 视频与其他数据 的标志位
|
||||||
qDebug() << "isRecvVideoData:" << isRecvVideoData;
|
//qDebug() << "isRecvVideoData:" << isRecvVideoData;
|
||||||
qDebug() << "isPowerOnSend:" << isPowerOnSend;
|
//qDebug() << "isPowerOnSend:" << isPowerOnSend;
|
||||||
qDebug() << "isClickedSend:" << isClickedSend;
|
//qDebug() << "isClickedSend:" << isClickedSend;
|
||||||
qDebug() << "isSingleSend:" << isSingleSend;
|
//qDebug() << "isSingleSend:" << isSingleSend;
|
||||||
|
//qDebug() << "isRecvImgData:" << isRecvImgData;
|
||||||
if (!isRecvVideoData &&
|
if (!isRecvVideoData &&
|
||||||
(isPowerOnSend || isClickedSend || (isSingleSend && (currentItemIndex < frontBoardTest.size())))) {
|
(isRecvImgData || isPowerOnSend || isClickedSend || (isSingleSend && (currentItemIndex < frontBoardTest.size())))) {
|
||||||
QByteArray allData;
|
QByteArray allData;
|
||||||
while (socket->bytesAvailable() > 0) {
|
while (socket->bytesAvailable() > 0) {
|
||||||
qint64 bytesAvailableBefore = socket->bytesAvailable();
|
qint64 bytesAvailableBefore = socket->bytesAvailable();
|
||||||
|
@ -527,7 +540,7 @@ void ClientHandler::onDataReceived()
|
||||||
}
|
}
|
||||||
if (!allData.isEmpty()) {
|
if (!allData.isEmpty()) {
|
||||||
//emit dataReceived(getClientAddress(), allData, 0xFF, currentItemIndex, currentFuncItemIndex, "", "");
|
//emit dataReceived(getClientAddress(), allData, 0xFF, currentItemIndex, currentFuncItemIndex, "", "");
|
||||||
emit dataReceived(getClientAddress(), allData, 0xFF, currentItemIndex, currentFuncItemIndex, getCurrentItemLable(), "");
|
emit dataReceived(getClientAddress(), allData, 0xFF, currentItemIndex, currentFuncItemIndex, getCurrentItemLable(), "", currentJson, currentJsonItem);
|
||||||
if (!isSingleSend && !isPowerOnSend) {
|
if (!isSingleSend && !isPowerOnSend) {
|
||||||
currentItemIndex ++;
|
currentItemIndex ++;
|
||||||
itemsProcessedCount ++;
|
itemsProcessedCount ++;
|
||||||
|
@ -566,11 +579,19 @@ void ClientHandler::onDataReceived()
|
||||||
// 接收视频流数据 isRecvVideoData 置 0
|
// 接收视频流数据 isRecvVideoData 置 0
|
||||||
else if (isRecvVideoData && (!dataProcessingActive)) {
|
else if (isRecvVideoData && (!dataProcessingActive)) {
|
||||||
dataProcessingActive = true;
|
dataProcessingActive = true;
|
||||||
isRecvVideoData = false;
|
if (!isStartVideo) {
|
||||||
|
isRecvVideoData = false;
|
||||||
|
}
|
||||||
QTimer::singleShot(0, this, &ClientHandler::processPendingData);
|
QTimer::singleShot(0, this, &ClientHandler::processPendingData);
|
||||||
}
|
}
|
||||||
else {
|
else if(!isRecvVideoData && !isRecvImgData){
|
||||||
|
if (preVideoClientId == clientId) {
|
||||||
|
qDebug() << "-----------------" << preVideoClientId << "isRecvVideoData:" << isRecvVideoData;
|
||||||
|
}
|
||||||
|
|
||||||
socket->readAll();
|
socket->readAll();
|
||||||
|
//QByteArray data = socket->readAll();
|
||||||
|
//qDebug() << "Received data:" << data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -591,6 +612,7 @@ void ClientHandler::processPendingData()
|
||||||
|
|
||||||
if (bytesRead > 0) {
|
if (bytesRead > 0) {
|
||||||
buffer.resize(bytesRead);
|
buffer.resize(bytesRead);
|
||||||
|
//qDebug() << "buffer.data():" << buffer.data();
|
||||||
allData.append(buffer);
|
allData.append(buffer);
|
||||||
qint64 bytesAvailableAfter = socket->bytesAvailable();
|
qint64 bytesAvailableAfter = socket->bytesAvailable();
|
||||||
/*qDebug() << "--1--Received data size:" << buffer.size() << "clientId:" << clientId
|
/*qDebug() << "--1--Received data size:" << buffer.size() << "clientId:" << clientId
|
||||||
|
@ -626,7 +648,7 @@ void ClientHandler::processPendingData()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!allData.isEmpty()) {
|
if (!allData.isEmpty()) {
|
||||||
emit dataReceived(getClientAddress(), allData, 0xFF, currentItemIndex, currentFuncItemIndex, "", "");
|
emit dataReceived(getClientAddress(), allData, 0xFF, currentItemIndex, currentFuncItemIndex, "", "", currentJson, currentJsonItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果还有数据需要处理,继续调度处理任务
|
// 如果还有数据需要处理,继续调度处理任务
|
||||||
|
@ -668,7 +690,7 @@ void ClientHandler::onTimeout()
|
||||||
//QString itemData = currentItem.value("data").toString();
|
//QString itemData = currentItem.value("data").toString();
|
||||||
//emit statusUpdated(socket->peerAddress().toString(), currentItemIndex, false, itemData);
|
//emit statusUpdated(socket->peerAddress().toString(), currentItemIndex, false, itemData);
|
||||||
emit statusUpdated(getClientAddress(), currentItemIndex + 1, currentFuncItemIndex + 1,
|
emit statusUpdated(getClientAddress(), currentItemIndex + 1, currentFuncItemIndex + 1,
|
||||||
false, getCurrentItemLable(), getCurrentFuncItemLable());
|
false, getCurrentItemLable(), getCurrentFuncItemLable(), currentJson, currentJsonItem);
|
||||||
if (!isSingleSend && !isPowerOnSend) {
|
if (!isSingleSend && !isPowerOnSend) {
|
||||||
currentItemIndex ++;
|
currentItemIndex ++;
|
||||||
itemsProcessedCount ++;
|
itemsProcessedCount ++;
|
||||||
|
|
|
@ -32,13 +32,14 @@ public:
|
||||||
explicit ClientHandler(QTcpSocket* socket, QJsonArray frontBoardOneClickTest, QJsonArray frontBoardTest,
|
explicit ClientHandler(QTcpSocket* socket, QJsonArray frontBoardOneClickTest, QJsonArray frontBoardTest,
|
||||||
QJsonArray frontBoardFuncConfig, QJsonArray frontBoardDevInfoJson, QJsonArray frontBoardLicenseJson,
|
QJsonArray frontBoardFuncConfig, QJsonArray frontBoardDevInfoJson, QJsonArray frontBoardLicenseJson,
|
||||||
QJsonArray backBoardOneClickTest, QJsonArray backBoardTest, QJsonArray backBoardFuncConfig, QJsonArray backBoardDevInfoJson,
|
QJsonArray backBoardOneClickTest, QJsonArray backBoardTest, QJsonArray backBoardFuncConfig, QJsonArray backBoardDevInfoJson,
|
||||||
QJsonArray getPicJson, QJsonArray getVideoJson,
|
QJsonArray backBoardUuidJson, QJsonArray getPicJson, QJsonArray getVideoJson,
|
||||||
int clientId, QObject* parent = nullptr);
|
int clientId, QObject* parent = nullptr);
|
||||||
|
|
||||||
~ClientHandler();
|
~ClientHandler();
|
||||||
|
int preVideoClientId = 0;
|
||||||
|
int controlClientId = 0;
|
||||||
void sendDevInfoItem();
|
void sendDevInfoItem();
|
||||||
|
//int preVideoClientId = 0;
|
||||||
bool isData_Stuck() const;
|
bool isData_Stuck() const;
|
||||||
//static int pre_H264_clientId; // 预览H264的客户端ID
|
//static int pre_H264_clientId; // 预览H264的客户端ID
|
||||||
QTcpSocket* getSocket() const { return socket; }
|
QTcpSocket* getSocket() const { return socket; }
|
||||||
|
@ -87,13 +88,15 @@ public:
|
||||||
signals:
|
signals:
|
||||||
// 数据接收信号
|
// 数据接收信号
|
||||||
void dataReceived(const QString& client, const QByteArray& data, unsigned char msg_id, int currentRecvItemIndex,
|
void dataReceived(const QString& client, const QByteArray& data, unsigned char msg_id, int currentRecvItemIndex,
|
||||||
int currentRecvFuncItemIndex, const QString& itemData, const QString& funcItemData);
|
int currentRecvFuncItemIndex, const QString& itemData, const QString& funcItemData,
|
||||||
|
const QJsonArray& jsonArray, int itemJsonIndex);
|
||||||
void handleData(QByteArray& data);
|
void handleData(QByteArray& data);
|
||||||
// 数据发送信号
|
// 数据发送信号
|
||||||
void sendData(const QByteArray& data);
|
void sendData(const QByteArray& data);
|
||||||
// 状态更新信号
|
// 状态更新信号
|
||||||
void statusUpdated(const QString& client, int itemIndex, int funcItemIndex,
|
void statusUpdated(const QString& client, int itemIndex, int funcItemIndex,
|
||||||
bool success, const QString& itemData, const QString& funcItemData);
|
bool success, const QString& itemData, const QString& funcItemData,
|
||||||
|
const QJsonArray& jsonArray, int itemJsonIndex);
|
||||||
// 客户端断开连接信号
|
// 客户端断开连接信号
|
||||||
void clientDisconnected(ClientHandler* handler);
|
void clientDisconnected(ClientHandler* handler);
|
||||||
// json文件配置项发送完毕
|
// json文件配置项发送完毕
|
||||||
|
@ -116,8 +119,8 @@ public slots:
|
||||||
void onTimeoutRead();
|
void onTimeoutRead();
|
||||||
void checkConnectionStatus(); // 定期检查连接状态
|
void checkConnectionStatus(); // 定期检查连接状态
|
||||||
void processPendingData();
|
void processPendingData();
|
||||||
void startReadVideoDataTimer();
|
void startReadVideoDataTimer(int client_Id);
|
||||||
void stopReadVideoDataTimer();
|
void stopReadVideoDataTimer(int client_Id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTcpSocket* socket; // 客户端 socket
|
QTcpSocket* socket; // 客户端 socket
|
||||||
|
@ -130,16 +133,19 @@ private:
|
||||||
QJsonArray backBoardTest; // 后板单项测试 JSON
|
QJsonArray backBoardTest; // 后板单项测试 JSON
|
||||||
QJsonArray backBoardFuncConfig; // 后板功能配置参数 JSON
|
QJsonArray backBoardFuncConfig; // 后板功能配置参数 JSON
|
||||||
QJsonArray backBoardDevInfoJson; // 后板设备信息参数 JSON
|
QJsonArray backBoardDevInfoJson; // 后板设备信息参数 JSON
|
||||||
|
QJsonArray backBoardUuidJson; // 后板UUID和SN参数 JSON
|
||||||
QJsonArray jsonConfig; // 测试区 JSON 配置
|
QJsonArray jsonConfig; // 测试区 JSON 配置
|
||||||
QJsonArray funcJsonConfig; // 功能区 JSON 配置
|
QJsonArray funcJsonConfig; // 功能区 JSON 配置
|
||||||
QJsonArray getDevInfoJson; // 获取设备信息 JSON 配置
|
QJsonArray getDevInfoJson; // 获取设备信息 JSON 配置
|
||||||
QJsonArray getPicJson; // 发送取图指令 JSON 配置
|
QJsonArray getPicJson; // 发送取图指令 JSON 配置
|
||||||
QJsonArray getVideoJson; // 发送拉视频指令 JSON 配置
|
QJsonArray getVideoJson; // 发送拉视频指令 JSON 配置
|
||||||
|
QJsonArray currentJson; // 当前处理的json
|
||||||
|
int currentJsonItem = -1;
|
||||||
int currentItemIndex; // 当前处理的测试 JSON 项目索引
|
int currentItemIndex; // 当前处理的测试 JSON 项目索引
|
||||||
int currentFuncItemIndex; // 当前处理的功能 JSON 项目索引
|
int currentFuncItemIndex; // 当前处理的功能 JSON 项目索引
|
||||||
int clientId; // 新增的客户端编号
|
int clientId; // 新增的客户端编号
|
||||||
int preVideoClientId = 0;
|
|
||||||
int controlClientId = 1;
|
|
||||||
int itemsProcessedCount; // 跟踪处理项目的数量
|
int itemsProcessedCount; // 跟踪处理项目的数量
|
||||||
QJsonObject currentItem; // 测试 json文件中当前发送的项
|
QJsonObject currentItem; // 测试 json文件中当前发送的项
|
||||||
QJsonObject currentFuncItem; // 功能 json文件中当前发送的项
|
QJsonObject currentFuncItem; // 功能 json文件中当前发送的项
|
||||||
|
@ -148,6 +154,8 @@ private:
|
||||||
bool isSingleSend; // 单独点击按键发送的标志
|
bool isSingleSend; // 单独点击按键发送的标志
|
||||||
bool isClickedSend; // 点击按键发送的标志,没有点击不接收数据
|
bool isClickedSend; // 点击按键发送的标志,没有点击不接收数据
|
||||||
bool isRecvVideoData;
|
bool isRecvVideoData;
|
||||||
|
bool isRecvImgData = false;
|
||||||
|
bool isStartVideo = false;
|
||||||
bool isPowerOnSend = false; // 上电发送设备信息
|
bool isPowerOnSend = false; // 上电发送设备信息
|
||||||
//QTimer* timeoutTimer; // 超时定时器
|
//QTimer* timeoutTimer; // 超时定时器
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ HttpClient::HttpClient(QObject* parent)
|
||||||
|
|
||||||
void HttpClient::sendPostRequest(const QNetworkRequest& request, const QByteArray& jsonData)
|
void HttpClient::sendPostRequest(const QNetworkRequest& request, const QByteArray& jsonData)
|
||||||
{
|
{
|
||||||
qDebug() << "jsonData" << jsonData.data();
|
qDebug() << "jsonData" << jsonData;
|
||||||
networkManager->post(request, jsonData);
|
networkManager->post(request, jsonData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,24 @@
|
||||||
#include "../Network/ClientHandler.h"
|
#include "../Network/ClientHandler.h"
|
||||||
|
|
||||||
DataHandler::DataHandler(QLabel* leftLens_imageLabel, QLabel* rightLens_imageLabel, QLabel* videoLabel,
|
DataHandler::DataHandler(QLabel* leftLens_imageLabel, QLabel* rightLens_imageLabel, QLabel* videoLabel,
|
||||||
QTextEdit* licenseHwInfoEdit, QMap<QString, QLineEdit*>* devInfoLineEdits, QObject* parent)
|
QTextEdit* licenseHwInfoEdit, QMap<QString, QLineEdit*>* devInfoLineEdits,
|
||||||
|
QJsonArray frontBoardOneClickTest, QJsonArray frontBoardTest, QJsonArray frontBoardFuncConfig,
|
||||||
|
QJsonArray frontBoardDevInfoJson, QJsonArray frontBoardLicenseJson,
|
||||||
|
QJsonArray backBoardOneClickTest, QJsonArray backBoardTest, QJsonArray backBoardFuncConfig,
|
||||||
|
QJsonArray backBoardDevInfoJson, QJsonArray backBoardUuidJson,
|
||||||
|
QJsonArray getPicJson, QJsonArray getVideoJson, QObject* parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
leftLens_m_imageLabel(leftLens_imageLabel),
|
leftLens_m_imageLabel(leftLens_imageLabel),
|
||||||
rightLens_m_imageLabel(rightLens_imageLabel),
|
rightLens_m_imageLabel(rightLens_imageLabel),
|
||||||
videoLabel(videoLabel),
|
videoLabel(videoLabel),
|
||||||
licenseHwInfoEdit(licenseHwInfoEdit),
|
licenseHwInfoEdit(licenseHwInfoEdit),
|
||||||
devInfoLineEdits(devInfoLineEdits),
|
devInfoLineEdits(devInfoLineEdits),
|
||||||
|
frontBoardOneClickTest(frontBoardOneClickTest), frontBoardTest(frontBoardTest),
|
||||||
|
frontBoardFuncConfig(frontBoardFuncConfig), frontBoardDevInfoJson(frontBoardDevInfoJson),
|
||||||
|
frontBoardLicenseJson(frontBoardLicenseJson),
|
||||||
|
backBoardOneClickTest(backBoardOneClickTest), backBoardTest(backBoardTest),
|
||||||
|
backBoardFuncConfig(backBoardFuncConfig), backBoardDevInfoJson(backBoardDevInfoJson),
|
||||||
|
backBoardUuidJson(backBoardUuidJson), getPicJson(getPicJson), getVideoJson(getVideoJson),
|
||||||
ffmpegDecoder(new FFmpegDecoder()), // 初始化FFmpeg解码器
|
ffmpegDecoder(new FFmpegDecoder()), // 初始化FFmpeg解码器
|
||||||
buffer(new QByteArray())
|
buffer(new QByteArray())
|
||||||
{
|
{
|
||||||
|
@ -90,12 +101,12 @@ void DataHandler::clearAllRecvData() {
|
||||||
// 处理接收到的数据
|
// 处理接收到的数据
|
||||||
void DataHandler::handleData(const QString& client, const QByteArray& recvData, int msg_id,
|
void DataHandler::handleData(const QString& client, const QByteArray& recvData, int msg_id,
|
||||||
int currentRecvItemIndex, int currentRecvFuncItemIndex,
|
int currentRecvItemIndex, int currentRecvFuncItemIndex,
|
||||||
const QString& itemData, const QString& funcItemData)
|
const QString& itemData, const QString& funcItemData, const QJsonArray& jsonArray, int itemJsonIndex)
|
||||||
{
|
{
|
||||||
//qDebug() << "Data received from" << client << ":" << recvData;
|
//qDebug() << "Data received from" << client << ":" << recvData;
|
||||||
#if 0
|
#if 0
|
||||||
从文件中读取YUV数据
|
从文件中读取YUV数据
|
||||||
QFile file("output_2.txt");
|
QFile file("output_2.txt");
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
qWarning() << "Failed to open file:";
|
qWarning() << "Failed to open file:";
|
||||||
file.close();
|
file.close();
|
||||||
|
@ -120,29 +131,43 @@ void DataHandler::handleData(const QString& client, const QByteArray& recvData,
|
||||||
(static_cast<unsigned char>(buffer->at(8)) << 16) |
|
(static_cast<unsigned char>(buffer->at(8)) << 16) |
|
||||||
(static_cast<unsigned char>(buffer->at(7)) << 8) |
|
(static_cast<unsigned char>(buffer->at(7)) << 8) |
|
||||||
(static_cast<unsigned char>(buffer->at(6)));
|
(static_cast<unsigned char>(buffer->at(6)));
|
||||||
|
//qDebug() << "---Received dataSize:" << dataSize;
|
||||||
|
//qDebug() << "---msg_id:" << QString::number(msg_id, 16).toUpper();
|
||||||
|
//qDebug() << "---(static_cast<unsigned char>(buffer->at(10)):" << static_cast<unsigned char>(buffer->at(10));
|
||||||
|
//qDebug() << "---(static_cast<unsigned char>(buffer->at(11)):" << static_cast<unsigned char>(buffer->at(11));
|
||||||
|
//qDebug() << "---(static_cast<unsigned char>(buffer->at(12)):" << static_cast<unsigned char>(buffer->at(12));
|
||||||
|
//qDebug() << "---(static_cast<unsigned char>(buffer->at(13)):" << static_cast<unsigned char>(buffer->at(13));
|
||||||
|
//qDebug() << "---(static_cast<unsigned char>(buffer->at(14)):" << static_cast<unsigned char>(buffer->at(14));
|
||||||
|
//qDebug() << "---(static_cast<unsigned char>(buffer->at(15)):" << static_cast<unsigned char>(buffer->at(15));
|
||||||
// 第11字节为返回 OK/NG
|
// 第11字节为返回 OK/NG
|
||||||
bool success = (static_cast<unsigned char>(buffer->at(10)) == 0x00);
|
bool success = (static_cast<unsigned char>(buffer->at(10)) == 0x00);
|
||||||
//int totalSize = 10 + dataSize + 1; // 数据头大小(10字节) + success + 实际数据
|
int totalSize = 10 + dataSize; // 数据头大小(10字节) + 实际数据大小
|
||||||
int totalSize = 10 + dataSize; // 数据头大小(10字节) + 实际数据大小
|
|
||||||
|
|
||||||
if (buffer->size() >= totalSize) {
|
if (buffer->size() >= totalSize) {
|
||||||
// 去掉前面 11 字节
|
// 去掉前面 11 字节
|
||||||
QByteArray data = buffer->mid(11, dataSize);
|
QByteArray data = buffer->mid(11, dataSize);
|
||||||
//QByteArray data = buffer->mid(10, dataSize);
|
//QByteArray data = buffer->mid(10, dataSize);
|
||||||
QString hexString = QString::fromUtf8(data.toHex().data());
|
QString hexString = QString::fromUtf8(data.toHex().data());
|
||||||
QByteArray actual_data = hexStringToByteArray(hexString);
|
QByteArray actual_data = hexStringToByteArray(hexString);
|
||||||
//qDebug() << "---Received hexString:" << hexString;
|
//qDebug() << "---Received hexString:" << hexString;
|
||||||
buffer->remove(0, totalSize); // 移除已处理的数据
|
buffer->remove(0, totalSize); // 移除已处理的数据
|
||||||
// 暂时设置 NG
|
if(msg_id != 0x0040 && msg_id != START_VIDEO) {
|
||||||
// 同一个client仅当 msg_id 不连续为 0x11/0x21 或第一次处理时才执行 emit statusUpdated
|
//if (msg_id != 0x0040) {
|
||||||
if ((msg_id != 0x0011 || clientLastMsgId.value(client, 0) != 0x0011) &&
|
qDebug() << "--- msg_id:" << msg_id;
|
||||||
(msg_id != 0x0021 || clientLastMsgId.value(client, 0) != 0x0021)){
|
qDebug() << "--- clientLastMsgId.value(client, 0):" << clientLastMsgId.value(client, 0);
|
||||||
qDebug() << "Emitting statusUpdated for client:" << client << "with msg_id:" << QString::number(msg_id, 16).toUpper();
|
// 同一个client仅当 msg_id 不连续为 0x11/0x21 或第一次处理时才执行 emit statusUpdated
|
||||||
emit statusUpdated(client, currentRecvItemIndex + 1, currentRecvFuncItemIndex + 1,
|
if ((msg_id != 0x0011 || clientLastMsgId.value(client, 0) != 0x0011) &&
|
||||||
true, itemData, funcItemData);
|
(msg_id != 0x0021 || clientLastMsgId.value(client, 0) != 0x0021) &&
|
||||||
}
|
(msg_id != START_VIDEO || clientLastMsgId.value(client, 0) != START_VIDEO)) {
|
||||||
clientLastMsgId[client] = msg_id;
|
//qDebug() << "Emitting statusUpdated for client:" << client << "with msg_id:" << QString::number(msg_id, 16).toUpper();
|
||||||
handleCmd(msg_id, client, actual_data);
|
emit statusUpdated(client, currentRecvItemIndex + 1, currentRecvFuncItemIndex + 1,
|
||||||
|
true, itemData, funcItemData, jsonArray, itemJsonIndex);
|
||||||
|
}
|
||||||
|
clientLastMsgId[client] = msg_id;
|
||||||
|
qDebug() << "--- client:" << client;
|
||||||
|
qDebug() << "--- clientLastMsgId[client]:" << clientLastMsgId[client];
|
||||||
|
}
|
||||||
|
handleCmd(msg_id, client, actual_data);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
break; // 数据还不完整,等待下一次接收
|
break; // 数据还不完整,等待下一次接收
|
||||||
|
@ -154,6 +179,7 @@ void DataHandler::handleData(const QString& client, const QByteArray& recvData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DataHandler::initializeMsgIdToCmdMap() {
|
void DataHandler::initializeMsgIdToCmdMap() {
|
||||||
msgIdToCmdMap[GET_FRONT_V851_VERSION] = "GET_FRONT_V851_VERSION";
|
msgIdToCmdMap[GET_FRONT_V851_VERSION] = "GET_FRONT_V851_VERSION";
|
||||||
msgIdToCmdMap[GET_FRONT_MCU_VERSION] = "GET_FRONT_MCU_VERSION";
|
msgIdToCmdMap[GET_FRONT_MCU_VERSION] = "GET_FRONT_MCU_VERSION";
|
||||||
|
@ -256,12 +282,12 @@ void DataHandler::handleFrontCmd(int msg_id, const QString& client, QByteArray a
|
||||||
break;
|
break;
|
||||||
case GET_IMG:
|
case GET_IMG:
|
||||||
{
|
{
|
||||||
|
showPic(leftLens_m_imageLabel, rightLens_m_imageLabel, client, actual_data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case START_VIDEO:
|
case START_VIDEO:
|
||||||
{
|
{
|
||||||
|
showVideo(client, actual_data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STOP_VIDEO:
|
case STOP_VIDEO:
|
||||||
|
|
|
@ -34,18 +34,38 @@ class DataHandler : public QObject
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DataHandler(QLabel* leftLens_imageLabel, QLabel* rightLens_imageLabel, QLabel* videoLabel,
|
explicit DataHandler(QLabel* leftLens_imageLabel, QLabel* rightLens_imageLabel, QLabel* videoLabel,
|
||||||
QTextEdit* licenseHwInfoEdit, QMap<QString, QLineEdit*>* devInfoLineEdits, QObject* parent = nullptr);
|
QTextEdit* licenseHwInfoEdit, QMap<QString, QLineEdit*>* devInfoLineEdits,
|
||||||
|
QJsonArray frontBoardOneClickTest, QJsonArray frontBoardTest, QJsonArray frontBoardFuncConfig,
|
||||||
|
QJsonArray frontBoardDevInfoJson, QJsonArray frontBoardLicenseJson,
|
||||||
|
QJsonArray backBoardOneClickTest, QJsonArray backBoardTest, QJsonArray backBoardFuncConfig,
|
||||||
|
QJsonArray backBoardDevInfoJson, QJsonArray backBoardUuidJson,
|
||||||
|
QJsonArray getPicJson, QJsonArray getVideoJson, QObject* parent = nullptr);
|
||||||
~DataHandler();
|
~DataHandler();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void handleData(const QString& client, const QByteArray& data, int msg_id, int currentRecvItemIndex,
|
void handleData(const QString& client, const QByteArray& data, int msg_id, int currentRecvItemIndex,
|
||||||
int currentRecvFuncItemIndex, const QString& itemData, const QString& funcItemData);
|
int currentRecvFuncItemIndex, const QString& itemData, const QString& funcItemData,
|
||||||
|
const QJsonArray& jsonArray, int itemJsonIndex);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void statusUpdated(const QString& clientAddress, int currentItemIndex, int currentFuncItemIndex,
|
void statusUpdated(const QString& clientAddress, int currentItemIndex, int currentFuncItemIndex,
|
||||||
bool success, const QString& currentItemLabel, const QString& currentFuncItemLabel);
|
bool success, const QString& currentItemLabel, const QString& currentFuncItemLabel,
|
||||||
|
const QJsonArray& jsonArray, int itemJsonIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QJsonArray frontBoardOneClickTest; // 前板一键功能测试 JSON
|
||||||
|
QJsonArray frontBoardTest; // 前板单项测试 JSON
|
||||||
|
QJsonArray frontBoardFuncConfig; // 前板功能配置参数 JSON
|
||||||
|
QJsonArray frontBoardDevInfoJson; // 前板设备信息参数 JSON
|
||||||
|
QJsonArray frontBoardLicenseJson; // 前板license信息 JSON
|
||||||
|
QJsonArray backBoardOneClickTest; // 后板一键功能测试 JSON
|
||||||
|
QJsonArray backBoardTest; // 后板单项测试 JSON
|
||||||
|
QJsonArray backBoardFuncConfig; // 后板功能配置参数 JSON
|
||||||
|
QJsonArray backBoardDevInfoJson; // 后板设备信息参数 JSON
|
||||||
|
QJsonArray backBoardUuidJson; // 后板UUID和SN参数 JSON
|
||||||
|
QJsonArray getDevInfoJson; // 获取设备信息 JSON 配置
|
||||||
|
QJsonArray getPicJson; // 发送取图指令 JSON 配置
|
||||||
|
QJsonArray getVideoJson; // 发送拉视频指令 JSON 配置
|
||||||
QLabel* leftLens_m_imageLabel;
|
QLabel* leftLens_m_imageLabel;
|
||||||
QLabel* rightLens_m_imageLabel;
|
QLabel* rightLens_m_imageLabel;
|
||||||
QLabel* videoLabel;
|
QLabel* videoLabel;
|
||||||
|
|
|
@ -80,7 +80,7 @@ MainWidget::MainWidget(QWidget* parent) :
|
||||||
ClientHandler* handler = new ClientHandler(socket, frontBoardOneClickTest, frontBoardTest, frontBoardFuncConfig,
|
ClientHandler* handler = new ClientHandler(socket, frontBoardOneClickTest, frontBoardTest, frontBoardFuncConfig,
|
||||||
frontBoardDevInfoJson, frontBoardLicenseJson,
|
frontBoardDevInfoJson, frontBoardLicenseJson,
|
||||||
backBoardOneClickTest, backBoardTest, backBoardFuncConfig, backBoardDevInfoJson,
|
backBoardOneClickTest, backBoardTest, backBoardFuncConfig, backBoardDevInfoJson,
|
||||||
getPicJson, getVideoJson, clientId, nullptr);
|
backBoardUuidJson, getPicJson, getVideoJson, clientId, nullptr);
|
||||||
|
|
||||||
// 将 ClientHandler 移动到线程池中的线程
|
// 将 ClientHandler 移动到线程池中的线程
|
||||||
handler->moveToThread(thread);
|
handler->moveToThread(thread);
|
||||||
|
@ -119,18 +119,22 @@ MainWidget::MainWidget(QWidget* parent) :
|
||||||
clients.append(handler);
|
clients.append(handler);
|
||||||
clients_1[clientId] = handler;
|
clients_1[clientId] = handler;
|
||||||
clientThreads[clientId] = thread;
|
clientThreads[clientId] = thread;
|
||||||
connect(handler, &ClientHandler::statusUpdated, this, &MainWidget::onStatusUpdated);
|
connect(handler, &ClientHandler::statusUpdated, this, &MainWidget::onStatusUpdated);
|
||||||
connect(handler, &ClientHandler::clientDisconnected, this, &MainWidget::onClientDisconnected);
|
connect(handler, &ClientHandler::clientDisconnected, this, &MainWidget::onClientDisconnected);
|
||||||
connect(handler, &ClientHandler::allItemsProcessed, this, &MainWidget::onAllItemsProcessed);
|
connect(handler, &ClientHandler::allItemsProcessed, this, &MainWidget::onAllItemsProcessed);
|
||||||
connect(handler, &ClientHandler::selectClientDisconnected, this, &MainWidget::onDisconnectClient);
|
connect(handler, &ClientHandler::selectClientDisconnected, this, &MainWidget::onDisconnectClient);
|
||||||
|
|
||||||
// 创建 DataHandler 对象并连接信号
|
// 创建 DataHandler 对象并连接信号
|
||||||
DataHandler* dataHandler = new DataHandler(leftLens_imageLabel, rightLens_imageLabel, videoLabel, licenseHwInfoEdit, &devInfoLineEdits, this);
|
DataHandler* dataHandler = new DataHandler(leftLens_imageLabel, rightLens_imageLabel, videoLabel, licenseHwInfoEdit, &devInfoLineEdits,
|
||||||
connect(handler, &ClientHandler::dataReceived, dataHandler, &DataHandler::handleData);
|
frontBoardOneClickTest, frontBoardTest, frontBoardFuncConfig,
|
||||||
connect(dataHandler, &DataHandler::statusUpdated, this, &MainWidget::onStatusUpdated);
|
frontBoardDevInfoJson, frontBoardLicenseJson,
|
||||||
|
backBoardOneClickTest, backBoardTest, backBoardFuncConfig, backBoardDevInfoJson,
|
||||||
|
backBoardUuidJson, getPicJson, getVideoJson, this);
|
||||||
|
connect(handler, &ClientHandler::dataReceived, dataHandler, &DataHandler::handleData);
|
||||||
|
connect(dataHandler, &DataHandler::statusUpdated, this, &MainWidget::onStatusUpdated);
|
||||||
|
|
||||||
connect(handler, &ClientHandler::startReadTimer, this, &MainWidget::startClientReadTimer);
|
connect(handler, &ClientHandler::startReadTimer, this, &MainWidget::startClientReadTimer);
|
||||||
connect(handler, &ClientHandler::stopReadTimer, this, &MainWidget::stopClientReadTimer);
|
connect(handler, &ClientHandler::stopReadTimer, this, &MainWidget::stopClientReadTimer);
|
||||||
|
|
||||||
// 创建和管理定时器
|
// 创建和管理定时器
|
||||||
QTimer* readTimer = new QTimer(this);
|
QTimer* readTimer = new QTimer(this);
|
||||||
|
@ -244,9 +248,10 @@ void MainWidget::onHttpRequestError(const QString& errorString)
|
||||||
isRequestSuccessful = 2;
|
isRequestSuccessful = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString generateRandomRequestID() {
|
// 生成随机字符串
|
||||||
|
QString generateRandomRequestID(int minBitStr, int maxBitStr) {
|
||||||
const QString possibleCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~";
|
const QString possibleCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~";
|
||||||
int length = QRandomGenerator::global()->bounded(1, 33); // 生成长度在1到32之间
|
int length = QRandomGenerator::global()->bounded(minBitStr, maxBitStr); // 生成长度在minBitStr到maxBitStr之间
|
||||||
QString randomString;
|
QString randomString;
|
||||||
for (int i = 0; i < length; ++i) {
|
for (int i = 0; i < length; ++i) {
|
||||||
int index = QRandomGenerator::global()->bounded(possibleCharacters.size());
|
int index = QRandomGenerator::global()->bounded(possibleCharacters.size());
|
||||||
|
@ -256,6 +261,7 @@ QString generateRandomRequestID() {
|
||||||
return randomString;
|
return randomString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 哈希256 转 base64
|
||||||
QString HmacSha256ToBase64(const QString& data, const QString& secret) {
|
QString HmacSha256ToBase64(const QString& data, const QString& secret) {
|
||||||
QByteArray keyBytes = secret.toUtf8();
|
QByteArray keyBytes = secret.toUtf8();
|
||||||
QByteArray dataBytes = data.toUtf8();
|
QByteArray dataBytes = data.toUtf8();
|
||||||
|
@ -319,7 +325,7 @@ void prepareRequestHeaders(QNetworkRequest& request, const QString& sign, const
|
||||||
|
|
||||||
// GET 请求
|
// GET 请求
|
||||||
void sendGetRequest(HttpClient* httpClient, const QUrl& url, const QMap<QString, QString>& params, const QString& secret) {
|
void sendGetRequest(HttpClient* httpClient, const QUrl& url, const QMap<QString, QString>& params, const QString& secret) {
|
||||||
QString request_id = generateRandomRequestID();
|
QString request_id = generateRandomRequestID(1, 33);
|
||||||
qDebug() << "request_id:" << request_id;
|
qDebug() << "request_id:" << request_id;
|
||||||
QUrl modifiedUrl = url;
|
QUrl modifiedUrl = url;
|
||||||
QUrlQuery query;
|
QUrlQuery query;
|
||||||
|
@ -337,7 +343,7 @@ void sendGetRequest(HttpClient* httpClient, const QUrl& url, const QMap<QString,
|
||||||
|
|
||||||
// POST 请求
|
// POST 请求
|
||||||
void sendPostRequest(HttpClient* httpClient, const QUrl& url, const QMap<QString, QString>& params, const QJsonObject& jsonData, const QString& secret) {
|
void sendPostRequest(HttpClient* httpClient, const QUrl& url, const QMap<QString, QString>& params, const QJsonObject& jsonData, const QString& secret) {
|
||||||
QString request_id = generateRandomRequestID();
|
QString request_id = generateRandomRequestID(1, 33);
|
||||||
qDebug() << "request_id:" << request_id;
|
qDebug() << "request_id:" << request_id;
|
||||||
QString sign = calculateSignature(params, "POST", secret, request_id, QString::number(QDateTime::currentSecsSinceEpoch()));
|
QString sign = calculateSignature(params, "POST", secret, request_id, QString::number(QDateTime::currentSecsSinceEpoch()));
|
||||||
qDebug() << "sendPostRequest URL:" << url.toString();
|
qDebug() << "sendPostRequest URL:" << url.toString();
|
||||||
|
@ -357,7 +363,6 @@ void MainWidget::FactoryToolSendGetUuidToHttpServer(const QString& mac_addr) {
|
||||||
{"batch", "1"},
|
{"batch", "1"},
|
||||||
{"mac", mac_addr}
|
{"mac", mac_addr}
|
||||||
};
|
};
|
||||||
|
|
||||||
QString secret = "rCeOzwisLFLasvlt";
|
QString secret = "rCeOzwisLFLasvlt";
|
||||||
sendGetRequest(httpClient, url, params, secret);
|
sendGetRequest(httpClient, url, params, secret);
|
||||||
}
|
}
|
||||||
|
@ -423,12 +428,14 @@ void MainWidget::FactoryToolSendPostTestToHttpServer() {
|
||||||
// POST 图语 License 上报
|
// POST 图语 License 上报
|
||||||
void MainWidget::FactoryToolSendPostLicenseToHttpServer(const QString& hardware_info, const QString& license_info) {
|
void MainWidget::FactoryToolSendPostLicenseToHttpServer(const QString& hardware_info, const QString& license_info) {
|
||||||
QUrl url("http://admin.hassecurity.cn/v1/algorithmKey");
|
QUrl url("http://admin.hassecurity.cn/v1/algorithmKey");
|
||||||
QString UTC_time = QString::number(QDateTime::currentSecsSinceEpoch());
|
|
||||||
|
|
||||||
|
qint64 UTC_time = QDateTime::currentSecsSinceEpoch();
|
||||||
|
|
||||||
QMap<QString, QString> params = {
|
QMap<QString, QString> params = {
|
||||||
{"id", hardware_info},
|
{"id", hardware_info},
|
||||||
{"key", license_info},
|
{"key", license_info},
|
||||||
{"time", UTC_time},
|
{"time", QString::number(UTC_time)}
|
||||||
{"type", "TUYU"}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
QJsonObject jsonData = {
|
QJsonObject jsonData = {
|
||||||
|
@ -565,6 +572,7 @@ void MainWidget::setupUI()
|
||||||
leftLayout->setStretch(1, 200);
|
leftLayout->setStretch(1, 200);
|
||||||
|
|
||||||
saveCheckBox = new QCheckBox("", this);
|
saveCheckBox = new QCheckBox("", this);
|
||||||
|
saveCheckBox->setChecked(true);
|
||||||
selectFileButton = new QPushButton("Save", this);
|
selectFileButton = new QPushButton("Save", this);
|
||||||
selectFileButton->setFixedSize(45, 28);
|
selectFileButton->setFixedSize(45, 28);
|
||||||
clearLogButton = new QPushButton("Clear", this);
|
clearLogButton = new QPushButton("Clear", this);
|
||||||
|
@ -585,10 +593,6 @@ void MainWidget::setupUI()
|
||||||
// 读取 JSON 配置文件
|
// 读取 JSON 配置文件
|
||||||
readJsonConfig();
|
readJsonConfig();
|
||||||
|
|
||||||
/*QGroupBox* groupBox = createLicenseGroupBox();
|
|
||||||
leftLayout->addWidget(groupBox);
|
|
||||||
leftLayout->setStretch(3, 1);*/
|
|
||||||
|
|
||||||
QWidget* leftContainer = new QWidget(this);
|
QWidget* leftContainer = new QWidget(this);
|
||||||
leftContainer->setLayout(leftLayout);
|
leftContainer->setLayout(leftLayout);
|
||||||
leftContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
leftContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
|
@ -657,7 +661,7 @@ void MainWidget::setupUI()
|
||||||
|
|
||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
setWindowTitle("SL100 工厂产测工具 - V0.0.1");
|
setWindowTitle("SL100 工厂产测工具 - V0.0.1");
|
||||||
resize(1340, 1000);
|
resize(1340, 900);
|
||||||
|
|
||||||
connect(startServerButton, &QPushButton::clicked, this, &MainWidget::onStartServerClicked);
|
connect(startServerButton, &QPushButton::clicked, this, &MainWidget::onStartServerClicked);
|
||||||
connect(sendAllButton, &QPushButton::clicked, this, &MainWidget::onSendAllClicked);
|
connect(sendAllButton, &QPushButton::clicked, this, &MainWidget::onSendAllClicked);
|
||||||
|
@ -682,19 +686,29 @@ void MainWidget::onclearLogButtonClicked()
|
||||||
|
|
||||||
void MainWidget::onSaveCheckBoxStateChanged(int state)
|
void MainWidget::onSaveCheckBoxStateChanged(int state)
|
||||||
{
|
{
|
||||||
if (state == Qt::Checked) {
|
if (state == Qt::Checked) checkBoxState = true;
|
||||||
saveStatusListToFile(filePathLineEdit->text());
|
else checkBoxState = false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWidget::saveStatusListToFile(const QString& filePath)
|
void MainWidget::saveStatusListToFile(const QString& filePath)
|
||||||
{
|
{
|
||||||
if (filePath.isEmpty()) {
|
QString actualFilePath = filePath;
|
||||||
return;
|
if (actualFilePath.isEmpty()) {
|
||||||
|
QString defaultDirPath = QDir::currentPath() + "/TestLog";
|
||||||
|
QDir dir(defaultDirPath);
|
||||||
|
if (!dir.exists()) {
|
||||||
|
if (!dir.mkpath(defaultDirPath)) {
|
||||||
|
qWarning() << "Failed to create directory:" << defaultDirPath;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QString currentTime = QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss");
|
||||||
|
actualFilePath = defaultDirPath + "/" + currentTime + ".txt";
|
||||||
}
|
}
|
||||||
|
|
||||||
QFile file(filePath);
|
QFile file(actualFilePath);
|
||||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||||
|
qWarning() << "Failed to open file:" << actualFilePath;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -755,6 +769,24 @@ void MainWidget::onDisconnectClient(int clientId)
|
||||||
void MainWidget::onClientDisconnected(ClientHandler* handler)
|
void MainWidget::onClientDisconnected(ClientHandler* handler)
|
||||||
{
|
{
|
||||||
int clientId = handler->getClientId();
|
int clientId = handler->getClientId();
|
||||||
|
qDebug() << " preVideoClientId :" << handler->preVideoClientId;
|
||||||
|
qDebug() << " clientId :" << clientId;
|
||||||
|
if (handler->preVideoClientId == clientId) {
|
||||||
|
qDebug() << "Current path: " << QDir::currentPath();
|
||||||
|
QString filePath = QDir::currentPath() + "/add1.h264";
|
||||||
|
if (QFile::exists(filePath)) {
|
||||||
|
QFile file(filePath);
|
||||||
|
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { // 使用 Truncate 模式打开文件以清空内容
|
||||||
|
qDebug() << "File add1.h264 cleared successfully.";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug() << "Failed to clear file add1.h264:" << file.errorString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug() << "File add1.h264 does not exist.";
|
||||||
|
}
|
||||||
|
}
|
||||||
if (clientTimers.contains(clientId)) {
|
if (clientTimers.contains(clientId)) {
|
||||||
QTimer* timer = clientTimers[clientId];
|
QTimer* timer = clientTimers[clientId];
|
||||||
timer->stop();
|
timer->stop();
|
||||||
|
@ -771,8 +803,10 @@ void MainWidget::onClientDisconnected(ClientHandler* handler)
|
||||||
|
|
||||||
// 更新连接数并更新按键文本
|
// 更新连接数并更新按键文本
|
||||||
connectedClientsCount--;
|
connectedClientsCount--;
|
||||||
|
qDebug() << " connectedClientsCount :" << connectedClientsCount;
|
||||||
if (nextClientId <= 2) nextClientId--;
|
if (nextClientId <= 2) nextClientId--;
|
||||||
deviceConnected = true;
|
deviceConnected = true;
|
||||||
|
|
||||||
updateServerButtonText();
|
updateServerButtonText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -829,6 +863,7 @@ void MainWidget::onLicenseButtonClicked()
|
||||||
}
|
}
|
||||||
qDebug() << "isRequestSuccessful:" << isRequestSuccessful;
|
qDebug() << "isRequestSuccessful:" << isRequestSuccessful;
|
||||||
if (isRequestSuccessful == 2) {
|
if (isRequestSuccessful == 2) {
|
||||||
|
isRequestSuccessful = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if(isRequestSuccessful == 1) {
|
else if(isRequestSuccessful == 1) {
|
||||||
|
@ -839,6 +874,7 @@ void MainWidget::onLicenseButtonClicked()
|
||||||
licenseKey = formatLicenseKey(licenseKey);
|
licenseKey = formatLicenseKey(licenseKey);
|
||||||
licenseHwInfoEdit->setPlainText(licenseKey);
|
licenseHwInfoEdit->setPlainText(licenseKey);
|
||||||
qDebug() << "HTTP Server License is:" << licenseKey;
|
qDebug() << "HTTP Server License is:" << licenseKey;
|
||||||
|
isRequestSuccessful = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -856,13 +892,19 @@ void MainWidget::onLicenseButtonClicked()
|
||||||
QByteArray dataByteArray = QByteArray::fromHex(dataStr.toUtf8());
|
QByteArray dataByteArray = QByteArray::fromHex(dataStr.toUtf8());
|
||||||
memcpy(hardware_info, dataByteArray.data(), qMin(dataByteArray.size(), PIX_HARDWARE_INFO_BYTES));
|
memcpy(hardware_info, dataByteArray.data(), qMin(dataByteArray.size(), PIX_HARDWARE_INFO_BYTES));
|
||||||
//unsigned char hardware_info[PIX_HARDWARE_INFO_BYTES] = { 0x46,0x0b,0x5d,0x11,0x58,0x17,0x4d,0x5e,0x55,0x5c,0x51,0x4a,0x5a,0x07,0x59,0x4c,0x5f,0x45,0x5b,0x5f,0x5a,0x45,0x1c,0x5a,0x45,0x43,0x44,0x47,0x51,0x5e,0x44,0x30 };
|
//unsigned char hardware_info[PIX_HARDWARE_INFO_BYTES] = { 0x46,0x0b,0x5d,0x11,0x58,0x17,0x4d,0x5e,0x55,0x5c,0x51,0x4a,0x5a,0x07,0x59,0x4c,0x5f,0x45,0x5b,0x5f,0x5a,0x45,0x1c,0x5a,0x45,0x43,0x44,0x47,0x51,0x5e,0x44,0x30 };
|
||||||
LicenseConfirmWindow dialog("你确定要获取此授权吗?");
|
LicenseConfirmWindow dialog("你确定要获取此授权吗?\n请确认你的hw_info是否正确");
|
||||||
if (dialog.exec() == QDialog::Accepted) {
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
#if 0
|
#if !MANUAL_UPLOAD_LICENSE
|
||||||
licenseGenerate(hardware_info, license_info);
|
if (!(licenseGenerate(hardware_info, license_info))) {
|
||||||
|
qDebug() << "从U盘获取License失败" ;
|
||||||
|
isRequestSuccessful = 0;
|
||||||
|
licenseHwInfoEdit->setPlainText("从U盘获取License失败,请检查U盘是否插入电脑!!!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
QString licenseInfoHex = QByteArray(reinterpret_cast<char*>(license_info), PIX_LICENCE_BYTES).toHex().toUpper();
|
QString licenseInfoHex = QByteArray(reinterpret_cast<char*>(license_info), PIX_LICENCE_BYTES).toHex().toUpper();
|
||||||
#else
|
#else
|
||||||
unsigned char license_info_1[PIX_LICENCE_BYTES] = { 0x07, 0xe8, 0xf3, 0x80, 0xa8, 0x07, 0x72, 0xa1, 0x17, 0xfe, 0xda, 0x67, 0xbd, 0x4a, 0x5a, 0xb5, 0xbb, 0x8b, 0x2d, 0xb2, 0xbf, 0x89, 0x74, 0xe5, 0xb0, 0x99, 0x70, 0x74, 0x3c, 0x6f, 0xf8, 0x82, 0x79, 0xab, 0x31, 0x9c, 0xdf, 0xe8, 0x9e, 0x75, 0x8f, 0x42, 0xb3, 0xcf, 0x00, 0x60, 0xa0, 0x38, 0xa4, 0xb8, 0xbe, 0xa6, 0x5d, 0x9f, 0x8b, 0x41, 0xf3, 0x0a, 0x69, 0xf6, 0x50, 0x94, 0x3f, 0xd0, 0xa5, 0xee, 0x88, 0x20, 0x93, 0x9a, 0x1c, 0xe9, 0x64, 0xd3, 0xaf, 0x9f, 0xc7, 0x66, 0x00, 0x7d, 0x7d, 0x68, 0xf1, 0xa4, 0xe1, 0x58, 0x00, 0x1d, 0x03, 0x0d, 0x40, 0x08, 0xa4, 0xcc, 0x0b, 0xd8, 0x19, 0x70, 0x9a, 0x83, 0x81, 0xbf, 0x27, 0x35, 0xb8, 0xec, 0x59, 0xa8, 0xd0, 0x03, 0xdb, 0xf6, 0xcf, 0x83, 0xaa, 0x0e, 0xfc, 0x95, 0x29, 0x77, 0xec, 0x89, 0xc5, 0x79, 0x10, 0x40, 0xd8, 0xbb };
|
//unsigned char license_info_1[PIX_LICENCE_BYTES] = { 0x07, 0xe8, 0xf3, 0x80, 0xa8, 0x07, 0x72, 0xa1, 0x17, 0xfe, 0xda, 0x67, 0xbd, 0x4a, 0x5a, 0xb5, 0xbb, 0x8b, 0x2d, 0xb2, 0xbf, 0x89, 0x74, 0xe5, 0xb0, 0x99, 0x70, 0x74, 0x3c, 0x6f, 0xf8, 0x82, 0x79, 0xab, 0x31, 0x9c, 0xdf, 0xe8, 0x9e, 0x75, 0x8f, 0x42, 0xb3, 0xcf, 0x00, 0x60, 0xa0, 0x38, 0xa4, 0xb8, 0xbe, 0xa6, 0x5d, 0x9f, 0x8b, 0x41, 0xf3, 0x0a, 0x69, 0xf6, 0x50, 0x94, 0x3f, 0xd0, 0xa5, 0xee, 0x88, 0x20, 0x93, 0x9a, 0x1c, 0xe9, 0x64, 0xd3, 0xaf, 0x9f, 0xc7, 0x66, 0x00, 0x7d, 0x7d, 0x68, 0xf1, 0xa4, 0xe1, 0x58, 0x00, 0x1d, 0x03, 0x0d, 0x40, 0x08, 0xa4, 0xcc, 0x0b, 0xd8, 0x19, 0x70, 0x9a, 0x83, 0x81, 0xbf, 0x27, 0x35, 0xb8, 0xec, 0x59, 0xa8, 0xd0, 0x03, 0xdb, 0xf6, 0xcf, 0x83, 0xaa, 0x0e, 0xfc, 0x95, 0x29, 0x77, 0xec, 0x89, 0xc5, 0x79, 0x10, 0x40, 0xd8, 0xbb };
|
||||||
|
unsigned char license_info_1[PIX_LICENCE_BYTES] = { 0x6a, 0x70, 0xc0, 0x40, 0xc9, 0x20, 0xf5, 0xd2, 0x78, 0xac, 0x05, 0x80, 0xa6, 0xcf, 0x3f, 0xd5, 0x72, 0xf6, 0xc3, 0x82, 0x11, 0x0d, 0x56, 0x37, 0xb3, 0x87, 0x19, 0x13, 0x79, 0xa5, 0x9b, 0x37, 0xf2, 0xab, 0xcb, 0xa3, 0xea, 0xc4, 0x45, 0xc6, 0xae, 0xc4, 0xa4, 0x72, 0xe9, 0x36, 0x1e, 0xbe, 0x78, 0xd6, 0xcd, 0x85, 0xd, 0x63, 0x93, 0x7a, 0x84, 0x9a, 0x31, 0x99, 0xe1, 0x09, 0xc1, 0xfa, 0xbe, 0x32, 0x42, 0xc5, 0xc9, 0x89, 0x03, 0x7e, 0x81, 0xe5, 0x25, 0xf, 0x4d, 0x68, 0x9d, 0x53, 0xd1, 0x04, 0x29, 0x34, 0x53, 0x09, 0x22, 0x5, 0x29, 0xce, 0xb1, 0xc9, 0x01, 0xed, 0x2a, 0xd2, 0x16, 0xfb, 0x3c, 0x27, 0xba, 0x4a, 0x69, 0x10, 0x3a, 0x54, 0x5a, 0x8f, 0xca, 0x47, 0x8d, 0x34, 0x2b, 0x57, 0xad, 0x27, 0x9a, 0x15, 0x37, 0x86, 0x60, 0xd6, 0x34, 0xd8, 0x32, 0xee, 0x9c, 0x46 };
|
||||||
QString licenseInfoHex = QByteArray(reinterpret_cast<char*>(license_info_1), PIX_LICENCE_BYTES).toHex().toUpper();
|
QString licenseInfoHex = QByteArray(reinterpret_cast<char*>(license_info_1), PIX_LICENCE_BYTES).toHex().toUpper();
|
||||||
#endif
|
#endif
|
||||||
qDebug() << "上报服务器 licenseInfoHex:" << licenseInfoHex;
|
qDebug() << "上报服务器 licenseInfoHex:" << licenseInfoHex;
|
||||||
|
@ -871,13 +913,17 @@ void MainWidget::onLicenseButtonClicked()
|
||||||
QString licenseInfoStr;
|
QString licenseInfoStr;
|
||||||
printf("U盘 Get License is\n");
|
printf("U盘 Get License is\n");
|
||||||
for (int j = 0; j < PIX_LICENCE_BYTES; ++j) {
|
for (int j = 0; j < PIX_LICENCE_BYTES; ++j) {
|
||||||
//printf("0x%02x, ", license_info[j]);
|
#if !MANUAL_UPLOAD_LICENSE
|
||||||
//licenseInfoStr.append(QString::asprintf("0x%02x, ", license_info[j]));
|
printf("0x%02x, ", license_info[j]);
|
||||||
|
licenseInfoStr.append(QString::asprintf("0x%02x, ", license_info[j]));
|
||||||
|
#else
|
||||||
printf("0x%02x, ", license_info_1[j]);
|
printf("0x%02x, ", license_info_1[j]);
|
||||||
licenseInfoStr.append(QString::asprintf("0x%02x, ", license_info_1[j]));
|
licenseInfoStr.append(QString::asprintf("0x%02x, ", license_info_1[j]));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
licenseHwInfoEdit->setPlainText(licenseInfoStr);
|
licenseHwInfoEdit->setPlainText(licenseInfoStr);
|
||||||
|
isRequestSuccessful = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -908,15 +954,14 @@ void MainWidget::onLicenseButtonClicked()
|
||||||
dataStr = dataStr.replace("0x", "").replace(" ", ""); // 去掉0x和空格
|
dataStr = dataStr.replace("0x", "").replace(" ", ""); // 去掉0x和空格
|
||||||
QByteArray dataByteArray = QByteArray::fromHex(dataStr.toUtf8());
|
QByteArray dataByteArray = QByteArray::fromHex(dataStr.toUtf8());
|
||||||
memcpy(license_info, dataByteArray.data(), qMin(dataByteArray.size(), PIX_LICENCE_BYTES));
|
memcpy(license_info, dataByteArray.data(), qMin(dataByteArray.size(), PIX_LICENCE_BYTES));
|
||||||
//qDebug() << "hardware_info:" << QByteArray(reinterpret_cast<char*>(hardware_info), PIX_HARDWARE_INFO_BYTES).toHex();
|
|
||||||
//licenseGenerate(hardware_info, license_info);
|
|
||||||
QString licenseInfoStr;
|
QString licenseInfoStr;
|
||||||
for (int j = 0; j < PIX_LICENCE_BYTES; ++j) {
|
for (int j = 0; j < PIX_LICENCE_BYTES; ++j) {
|
||||||
licenseInfoStr.append(QString::asprintf("0x%02x, ", license_info[j]));
|
licenseInfoStr.append(QString::asprintf("0x%02x, ", license_info[j]));
|
||||||
}
|
}
|
||||||
//printf("\n");
|
|
||||||
dataStr = QByteArray(reinterpret_cast<char*>(license_info), PIX_LICENCE_BYTES).toHex();
|
dataStr = QByteArray(reinterpret_cast<char*>(license_info), PIX_LICENCE_BYTES).toHex();
|
||||||
qDebug() << "license_info:" << dataStr;
|
qDebug() << "license_info:" << dataStr;
|
||||||
|
dataStr = dataByteArray.toBase64();
|
||||||
|
qDebug() << "Base64 Encoded:" << dataStr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
|
@ -932,41 +977,6 @@ void MainWidget::onLicenseButtonClicked()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//void MainWidget::onLicenseButtonClicked()
|
|
||||||
//{
|
|
||||||
// if (connectedClientsCount) {
|
|
||||||
// QPushButton* button = qobject_cast<QPushButton*>(sender());
|
|
||||||
// if (button) {
|
|
||||||
// int index = button->property("licenseIndex").toInt();
|
|
||||||
// if (index >= 0 && index < frontBoardLicenseJson.size()) {
|
|
||||||
// QJsonObject jsonObject = frontBoardLicenseJson[index].toObject();
|
|
||||||
// //QString jsonString = QJsonDocument(jsonObject).toJson(QJsonDocument::Compact);
|
|
||||||
// //qDebug() << "license Button clicked, sending JSON:" << jsonString;
|
|
||||||
// unsigned char license_info[PIX_LICENCE_BYTES] = { 0 };
|
|
||||||
// if (jsonObject["lable"].toString() == "get_license") {
|
|
||||||
// LicenseConfirmWindow dialog("你确定要获取此授权吗?");
|
|
||||||
// if (dialog.exec() == QDialog::Accepted)
|
|
||||||
// licenseGenerate(license_info, license_info);
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
// if (jsonObject["lable"].toString() == "write_license") {
|
|
||||||
// LicenseConfirmWindow dialog("你确定要发送此授权吗?");
|
|
||||||
// if (dialog.exec() == QDialog::Accepted)
|
|
||||||
// licenseGenerate(license_info, license_info);
|
|
||||||
// }
|
|
||||||
// for (ClientHandler* handler : clients) {
|
|
||||||
// handler->sendLicenseItem(index);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
// QListWidgetItem* listItem = new QListWidgetItem(QString("No device is connected !!!"), statusListWidget);
|
|
||||||
// listItem->setBackground(Qt::red);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
void MainWidget::onUuidButtonClicked()
|
void MainWidget::onUuidButtonClicked()
|
||||||
{
|
{
|
||||||
if (connectedClientsCount) {
|
if (connectedClientsCount) {
|
||||||
|
@ -975,17 +985,27 @@ void MainWidget::onUuidButtonClicked()
|
||||||
int index = button->property("UuidIndex").toInt();
|
int index = button->property("UuidIndex").toInt();
|
||||||
if (index >= 0 && index < backBoardUuidJson.size()) {
|
if (index >= 0 && index < backBoardUuidJson.size()) {
|
||||||
QJsonObject jsonObject = backBoardUuidJson[index].toObject();
|
QJsonObject jsonObject = backBoardUuidJson[index].toObject();
|
||||||
//QString jsonString = QJsonDocument(jsonObject).toJson(QJsonDocument::Compact);
|
QString dataStr = "";
|
||||||
//qDebug() << "license Button clicked, sending JSON:" << jsonString;
|
if (jsonObject["lable"].toString() == "get_UUID_SN") {
|
||||||
unsigned char license_info[PIX_LICENCE_BYTES] = { 0 };
|
QString sendToHttpServerDataStr = UuidHwInfoEdit->toPlainText();
|
||||||
if (jsonObject["lable"].toString() == "get_license") {
|
qDebug() << "sendToHttpServerDataStr:" << sendToHttpServerDataStr;
|
||||||
|
// 测试随机生成8-12位字符串
|
||||||
|
sendToHttpServerDataStr = generateRandomRequestID(8, 13);
|
||||||
|
FactoryToolSendGetUuidToHttpServer(sendToHttpServerDataStr);
|
||||||
|
while (isRequestSuccessful == 0) {
|
||||||
|
QCoreApplication::processEvents(); // 防止阻塞UI线程
|
||||||
|
}
|
||||||
|
qDebug() << "isRequestSuccessful:" << isRequestSuccessful;
|
||||||
|
if (isRequestSuccessful == 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (isRequestSuccessful == 1) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (jsonObject["lable"].toString() == "write_license") {
|
if (jsonObject["lable"].toString() == "write_UUID_SN") {
|
||||||
LicenseConfirmWindow dialog("你确定要发送此授权吗?");
|
|
||||||
if (dialog.exec() == QDialog::Accepted)
|
|
||||||
licenseGenerate(license_info, license_info);
|
|
||||||
}
|
}
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
handler->sendUuidItem(index, "");
|
handler->sendUuidItem(index, "");
|
||||||
|
@ -1094,7 +1114,10 @@ void MainWidget::onSendGetDevInfoClicked()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
handler->sendGetDevInfoItem(itemIndex);
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
|
handler->sendGetDevInfoItem(itemIndex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1125,7 +1148,7 @@ void MainWidget::onSendGetPicClicked()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (itemIndex - 2 >= connectedClientsCount) {
|
if (itemIndex - 2 >= connectedClientsCount) {
|
||||||
QListWidgetItem* listItem = new QListWidgetItem(QString("No device %1 is connected !!!").arg(itemIndex - 1), statusListWidget);
|
QListWidgetItem* listItem = new QListWidgetItem(QString("This device is not connected !!!"), statusListWidget);
|
||||||
listItem->setBackground(Qt::red);
|
listItem->setBackground(Qt::red);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1136,7 +1159,10 @@ void MainWidget::onSendGetPicClicked()
|
||||||
lastClickedGetPicDevIndex = itemIndex;
|
lastClickedGetPicDevIndex = itemIndex;
|
||||||
//QMutexLocker locker(&mutex);
|
//QMutexLocker locker(&mutex);
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
handler->sendGetPicItem(itemIndex - 2, lastClickedGetPicCamIndex);
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
|
handler->sendGetPicItem(itemIndex - 2, lastClickedGetPicCamIndex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1169,18 +1195,24 @@ void MainWidget::onSendGetVideoClicked()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (itemIndex - 6 >= connectedClientsCount) {
|
if (itemIndex - 6 >= connectedClientsCount) {
|
||||||
QListWidgetItem* listItem = new QListWidgetItem(QString("No device %1 is connected !!!").arg(itemIndex - 4), statusListWidget);
|
QListWidgetItem* listItem = new QListWidgetItem(QString("This device is not connected !!!").arg(itemIndex - 4), statusListWidget);
|
||||||
listItem->setBackground(Qt::red);
|
listItem->setBackground(Qt::red);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
//qDebug() << "lastClickedGetVideoDevIndex:" << lastClickedGetVideoDevIndex;
|
||||||
|
//qDebug() << "itemIndex:" << itemIndex;
|
||||||
button->setStyleSheet("background-color: green;");
|
button->setStyleSheet("background-color: green;");
|
||||||
if (lastClickedGetVideoDevIndex != -1 && lastClickedGetVideoDevIndex != itemIndex) {
|
if (lastClickedGetVideoDevIndex != -1 && lastClickedGetVideoDevIndex != itemIndex) {
|
||||||
getVideoButtons[lastClickedGetVideoDevIndex]->setStyleSheet("");
|
//qDebug() << "itemIndex:" << itemIndex;
|
||||||
|
getVideoButtons[lastClickedGetVideoDevIndex - 2]->setStyleSheet("");
|
||||||
}
|
}
|
||||||
lastClickedGetVideoDevIndex = itemIndex;
|
lastClickedGetVideoDevIndex = itemIndex;
|
||||||
//QMutexLocker locker(&mutex);
|
//QMutexLocker locker(&mutex);
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
handler->sendGetVideoItem(itemIndex - 5, 1);
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
|
handler->sendGetVideoItem(itemIndex - 5, lastClickedGetVideoCamIndex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
getVideoButtons[2]->setEnabled(true);
|
getVideoButtons[2]->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
@ -1220,8 +1252,11 @@ void MainWidget::onSendAllClicked()
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
// 重置索引
|
// 重置索引
|
||||||
handler->resetCurrentItemIndex();
|
handler->resetCurrentItemIndex();
|
||||||
handler->sendNextItem();
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
//handler->sendDevInfoItem();
|
handler->sendNextItem();
|
||||||
|
//handler->sendDevInfoItem();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1246,9 +1281,12 @@ void MainWidget::onSendFrontFuncItemClicked()
|
||||||
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
||||||
int itemIndex = button->property("frontBoardFuncConfig").toInt();
|
int itemIndex = button->property("frontBoardFuncConfig").toInt();
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
QString text = frontFuncConfigLineEdit->text();
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
qDebug() << "Text in frontFuncConfigLineEdit:" << text;
|
QString text = frontFuncConfigLineEdit->text();
|
||||||
handler->sendFrontFuncItem(itemIndex, text);
|
qDebug() << "Text in frontFuncConfigLineEdit:" << text;
|
||||||
|
handler->sendFrontFuncItem(itemIndex, text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1263,9 +1301,12 @@ void MainWidget::onSendBackFuncItemClicked()
|
||||||
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
||||||
int itemIndex = button->property("backBoardFuncConfig").toInt();
|
int itemIndex = button->property("backBoardFuncConfig").toInt();
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
QString text = backFuncConfigLineEdit->text();
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
qDebug() << "Text in backFuncConfigLineEdit:" << text;
|
QString text = backFuncConfigLineEdit->text();
|
||||||
handler->sendBackFuncItem(itemIndex, text);
|
qDebug() << "Text in backFuncConfigLineEdit:" << text;
|
||||||
|
handler->sendBackFuncItem(itemIndex, text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1282,7 +1323,10 @@ void MainWidget::onSendFrontItemClicked()
|
||||||
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
||||||
int itemIndex = button->property("frontBoardTest").toInt();
|
int itemIndex = button->property("frontBoardTest").toInt();
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
handler->sendFrontItem(itemIndex);
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
|
handler->sendFrontItem(itemIndex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1298,7 +1342,10 @@ void MainWidget::onSendBackItemClicked()
|
||||||
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
QPushButton* button = qobject_cast<QPushButton*>(sender());
|
||||||
int itemIndex = button->property("backBoardTest").toInt();
|
int itemIndex = button->property("backBoardTest").toInt();
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
handler->sendBackItem(itemIndex);
|
if (handler->getClientId() == handler->controlClientId) {
|
||||||
|
handler->sendBackItem(itemIndex);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1309,9 +1356,11 @@ void MainWidget::onSendBackItemClicked()
|
||||||
|
|
||||||
// 处理状态更新信号
|
// 处理状态更新信号
|
||||||
void MainWidget::onStatusUpdated(const QString& client, int itemIndex, int FuncItemIndex,
|
void MainWidget::onStatusUpdated(const QString& client, int itemIndex, int FuncItemIndex,
|
||||||
bool success, const QString& itemData, const QString& funcItemData)
|
bool success, const QString& itemData, const QString& funcItemData,
|
||||||
|
const QJsonArray& jsonArray, int itemJsonIndex)
|
||||||
{
|
{
|
||||||
int clientId = -1;
|
int clientId = -1;
|
||||||
|
QString label;
|
||||||
// 遍历所有的 ClientHandler,找到匹配的 client
|
// 遍历所有的 ClientHandler,找到匹配的 client
|
||||||
for (ClientHandler* handler : clients) {
|
for (ClientHandler* handler : clients) {
|
||||||
if (handler->getClientAddress() == client) {
|
if (handler->getClientAddress() == client) {
|
||||||
|
@ -1327,26 +1376,44 @@ void MainWidget::onStatusUpdated(const QString& client, int itemIndex, int FuncI
|
||||||
}
|
}
|
||||||
//qDebug() << "itemIndex :" << itemIndex;
|
//qDebug() << "itemIndex :" << itemIndex;
|
||||||
//qDebug() << "FuncItemIndex:" << FuncItemIndex;
|
//qDebug() << "FuncItemIndex:" << FuncItemIndex;
|
||||||
if (itemIndex > 0) {
|
//if (itemIndex > 0) {
|
||||||
QListWidgetItem* listItem = new QListWidgetItem(QString("device ID: %1 - Item %2: %3 ---> %4")
|
// QListWidgetItem* listItem = new QListWidgetItem(QString("device ID: %1 - Item %2: %3 ---> %4")
|
||||||
.arg(clientId)
|
// .arg(clientId)
|
||||||
.arg(itemIndex)
|
// .arg(itemIndex)
|
||||||
.arg(itemData) // data 字段
|
// .arg(itemData) // data 字段
|
||||||
.arg(success ? "OK" : "NG"), statusListWidget);
|
// .arg(success ? "OK" : "NG"), statusListWidget);
|
||||||
|
|
||||||
listItem->setBackground(success ? Qt::green : Qt::red);
|
// listItem->setBackground(success ? Qt::green : Qt::red);
|
||||||
statusListWidget->addItem(listItem);
|
// statusListWidget->addItem(listItem);
|
||||||
}
|
//}
|
||||||
else if (FuncItemIndex > 0) {
|
//else if (FuncItemIndex > 0) {
|
||||||
QListWidgetItem* listItem = new QListWidgetItem(QString("device ID: %1 - funcItem %2: %3 ---> %4")
|
// QListWidgetItem* listItem = new QListWidgetItem(QString("device ID: %1 - funcItem %2: %3 ---> %4")
|
||||||
.arg(clientId)
|
// .arg(clientId)
|
||||||
.arg(FuncItemIndex)
|
// .arg(FuncItemIndex)
|
||||||
.arg(funcItemData) // data 字段
|
// .arg(funcItemData) // data 字段
|
||||||
.arg(success ? "OK" : "NG"), statusListWidget);
|
// .arg(success ? "OK" : "NG"), statusListWidget);
|
||||||
|
|
||||||
listItem->setBackground(success ? Qt::green : Qt::red);
|
// listItem->setBackground(success ? Qt::green : Qt::red);
|
||||||
statusListWidget->addItem(listItem);
|
// statusListWidget->addItem(listItem);
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
qDebug() << "itemJsonIndex :" << itemJsonIndex;
|
||||||
|
if (itemJsonIndex >= 0 && itemJsonIndex < jsonArray.size()) {
|
||||||
|
QJsonObject jsonObject = jsonArray.at(itemJsonIndex).toObject();
|
||||||
|
if (jsonObject.contains("lable")) {
|
||||||
|
label = jsonObject["lable"].toString();
|
||||||
|
qDebug() << "label :" << label;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
QListWidgetItem* listItem = new QListWidgetItem(QString("device ID: %1 - Item %2: %3 ---> %4")
|
||||||
|
.arg(clientId)
|
||||||
|
.arg(itemJsonIndex + 1)
|
||||||
|
.arg(label) // data 字段
|
||||||
|
.arg(success ? "OK" : "NG"), statusListWidget);
|
||||||
|
listItem->setBackground(success ? Qt::green : Qt::red);
|
||||||
|
statusListWidget->addItem(listItem);
|
||||||
|
|
||||||
statusListWidget->scrollToBottom();
|
statusListWidget->scrollToBottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1373,6 +1440,8 @@ void MainWidget::onAllItemsProcessed(const QString& client, int itemsProcessedCo
|
||||||
QListWidgetItem* listItem = new QListWidgetItem(QString("device ID:-%1 ---> All %2 items test completed !!!")
|
QListWidgetItem* listItem = new QListWidgetItem(QString("device ID:-%1 ---> All %2 items test completed !!!")
|
||||||
.arg(clientId)
|
.arg(clientId)
|
||||||
.arg(itemsProcessedCount), statusListWidget);
|
.arg(itemsProcessedCount), statusListWidget);
|
||||||
|
if(checkBoxState)
|
||||||
|
saveStatusListToFile(filePathLineEdit->text());
|
||||||
statusListWidget->addItem(listItem);
|
statusListWidget->addItem(listItem);
|
||||||
statusListWidget->scrollToBottom();
|
statusListWidget->scrollToBottom();
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,10 +53,11 @@
|
||||||
#include "../Network/httpClient.h"
|
#include "../Network/httpClient.h"
|
||||||
#include "FocusWindow.h"
|
#include "FocusWindow.h"
|
||||||
|
|
||||||
// 用于测试 UDP 组播实现 mdns 功能 非标准 mdns
|
|
||||||
#define TEST_UDP_BROADCAST 0
|
|
||||||
|
|
||||||
#define TCP_CONNECT_PORT 12412
|
#define TEST_UDP_BROADCAST 0 // 用于测试 UDP 组播实现 mdns 功能 非标准 mdns
|
||||||
|
#define MANUAL_UPLOAD_LICENSE 0 // 打开手动上传 License的功能
|
||||||
|
|
||||||
|
#define TCP_CONNECT_PORT 12412 // TCP监听的端口
|
||||||
|
|
||||||
class MainWidget : public QWidget
|
class MainWidget : public QWidget
|
||||||
{
|
{
|
||||||
|
@ -96,7 +97,8 @@ private slots:
|
||||||
//void onDataReceived(const QString& client, const QByteArray& data);
|
//void onDataReceived(const QString& client, const QByteArray& data);
|
||||||
// 处理状态更新信号
|
// 处理状态更新信号
|
||||||
void onStatusUpdated(const QString& client, int itemIndex, int funcItemIndex,
|
void onStatusUpdated(const QString& client, int itemIndex, int funcItemIndex,
|
||||||
bool success, const QString& itemData, const QString& funcItemData);
|
bool success, const QString& itemData, const QString& funcItemData,
|
||||||
|
const QJsonArray& jsonArray, int itemJsonIndex);
|
||||||
// 处理所有项目处理完毕信号
|
// 处理所有项目处理完毕信号
|
||||||
void onAllItemsProcessed(const QString& client, int itemsProcessedCount);
|
void onAllItemsProcessed(const QString& client, int itemsProcessedCount);
|
||||||
// 处理客户端断开连接
|
// 处理客户端断开连接
|
||||||
|
@ -179,6 +181,7 @@ private:
|
||||||
bool manualSend; // 判断是否是手动触发的发送
|
bool manualSend; // 判断是否是手动触发的发送
|
||||||
bool deviceConnected = false; // 判断是否有设备连接过
|
bool deviceConnected = false; // 判断是否有设备连接过
|
||||||
bool isSendingAll; // 一键功能测试 状态
|
bool isSendingAll; // 一键功能测试 状态
|
||||||
|
bool checkBoxState = true;
|
||||||
|
|
||||||
QJsonObject licenseDataArray; // 用于保存从服务器获取的 data 字段对象
|
QJsonObject licenseDataArray; // 用于保存从服务器获取的 data 字段对象
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ QGroupBox* MainWidget::createLicenseGroupBox()
|
||||||
|
|
||||||
//licenseHwInfoEdit->setReadOnly(true);
|
//licenseHwInfoEdit->setReadOnly(true);
|
||||||
licenseHwInfoEdit->setReadOnly(false);
|
licenseHwInfoEdit->setReadOnly(false);
|
||||||
licenseHwInfoEdit->setPlaceholderText("1. 点击“get_hw_info”可以获取hw info并显示在此处\n2. 可将hw info输入此处, 点击“get_license”获取License并显示在此处\n3. 点击“write_license”可将License直接写入前板");
|
licenseHwInfoEdit->setPlaceholderText("1. 点击“get_hw_info”可以获取hw info并显示在此处\n2. 可将hw info输入此处, 点击“get_license”获取License并显示在此处\n3. 点击“write_license”可将License写入前板");
|
||||||
licenseHwInfoEdit->setFixedHeight(80);
|
licenseHwInfoEdit->setFixedHeight(80);
|
||||||
|
|
||||||
QVBoxLayout* groupBoxLayout_license = new QVBoxLayout;
|
QVBoxLayout* groupBoxLayout_license = new QVBoxLayout;
|
||||||
|
@ -81,8 +81,9 @@ QGroupBox* MainWidget::createBackConnectServerGroupBox()
|
||||||
connect(button, &QPushButton::clicked, this, &MainWidget::onUuidButtonClicked);
|
connect(button, &QPushButton::clicked, this, &MainWidget::onUuidButtonClicked);
|
||||||
}
|
}
|
||||||
|
|
||||||
UuidHwInfoEdit->setReadOnly(true);
|
//UuidHwInfoEdit->setReadOnly(true);
|
||||||
UuidHwInfoEdit->setPlaceholderText("1. 点击“获取后板MAC地址”会将后板MAC地址显示在此处\n2. 可将后板MAC地址输入到此处,点击“获取UUID”显示在此处\n");
|
UuidHwInfoEdit->setReadOnly(false);
|
||||||
|
UuidHwInfoEdit->setPlaceholderText("1. 点击“get_MAC_addr”从后板获取MAC地址显示在此处\n2. 可将后板MAC地址输入到此处,点击“get_UUID_SN”获取UUID和SN并显示在此处\n3. 点击“write_UUID_SN”可将UUID和SN写入前板");
|
||||||
UuidHwInfoEdit->setFixedHeight(80);
|
UuidHwInfoEdit->setFixedHeight(80);
|
||||||
|
|
||||||
QVBoxLayout* groupBoxLayout_uuid = new QVBoxLayout;
|
QVBoxLayout* groupBoxLayout_uuid = new QVBoxLayout;
|
||||||
|
@ -243,14 +244,13 @@ QWidget* MainWidget::createVideoDisplayTab()
|
||||||
{
|
{
|
||||||
QWidget* videoDisplayTab = new QWidget(this);
|
QWidget* videoDisplayTab = new QWidget(this);
|
||||||
QVBoxLayout* videoDisplayLayout = new QVBoxLayout(videoDisplayTab);
|
QVBoxLayout* videoDisplayLayout = new QVBoxLayout(videoDisplayTab);
|
||||||
|
|
||||||
QVBoxLayout* videoButtonsColumnLayout = new QVBoxLayout;
|
QVBoxLayout* videoButtonsColumnLayout = new QVBoxLayout;
|
||||||
for (int i = 0; i < 6; ++i) {
|
for (int i = 0; i < 6; ++i) {
|
||||||
QHBoxLayout* videoButtonsRowLayout = new QHBoxLayout;
|
QHBoxLayout* videoButtonsRowLayout = new QHBoxLayout;
|
||||||
for (int j = 0; j < 2; ++j) {
|
for (int j = 0; j < 2; ++j) {
|
||||||
QPushButton* button;
|
QPushButton* button;
|
||||||
if (i == 0 && j == 0) {
|
if (i == 0 && j == 0) {
|
||||||
button = new QPushButton(QString("IR"), this);
|
button = new QPushButton(QString("左边镜头"), this);
|
||||||
button->setFixedSize(73, 50);
|
button->setFixedSize(73, 50);
|
||||||
videoButtonsRowLayout->addWidget(button);
|
videoButtonsRowLayout->addWidget(button);
|
||||||
button->setProperty("getVideoIndex", i * 2 + j);
|
button->setProperty("getVideoIndex", i * 2 + j);
|
||||||
|
@ -259,7 +259,7 @@ QWidget* MainWidget::createVideoDisplayTab()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (i == 0 && j == 1) {
|
else if (i == 0 && j == 1) {
|
||||||
button = new QPushButton(QString("RGB"), this);
|
button = new QPushButton(QString("右边镜头"), this);
|
||||||
button->setFixedSize(73, 50);
|
button->setFixedSize(73, 50);
|
||||||
videoButtonsRowLayout->addWidget(button);
|
videoButtonsRowLayout->addWidget(button);
|
||||||
button->setProperty("getVideoIndex", i * 2 + j);
|
button->setProperty("getVideoIndex", i * 2 + j);
|
||||||
|
@ -279,8 +279,15 @@ QWidget* MainWidget::createVideoDisplayTab()
|
||||||
getVideoButtons.append(button);
|
getVideoButtons.append(button);
|
||||||
break; // 跳出内层循环,只添加一个按键
|
break; // 跳出内层循环,只添加一个按键
|
||||||
}
|
}
|
||||||
|
if (i >= 2 && i <= 5) {
|
||||||
button = new QPushButton(QString("Device %1").arg(i * 2 + j - 3), this);
|
if(j == 0)
|
||||||
|
button = new QPushButton(QString("Device %1\n打开视频").arg(i - 1), this);
|
||||||
|
else if(j == 1)
|
||||||
|
button = new QPushButton(QString("Device %1\n关闭视频").arg(i - 1), this);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
button = new QPushButton(QString("Device %1").arg(i * 2 + (j * 1 - 1) - 3), this);
|
||||||
|
}
|
||||||
button->setFixedSize(73, 50);
|
button->setFixedSize(73, 50);
|
||||||
videoButtonsRowLayout->addWidget(button);
|
videoButtonsRowLayout->addWidget(button);
|
||||||
button->setProperty("getVideoIndex", i * 2 + j + 1);
|
button->setProperty("getVideoIndex", i * 2 + j + 1);
|
||||||
|
@ -292,6 +299,7 @@ QWidget* MainWidget::createVideoDisplayTab()
|
||||||
|
|
||||||
QHBoxLayout* videoAndButtonsLayout = new QHBoxLayout;
|
QHBoxLayout* videoAndButtonsLayout = new QHBoxLayout;
|
||||||
videoLabel = new QLabel(this);
|
videoLabel = new QLabel(this);
|
||||||
|
videoLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
videoAndButtonsLayout->addLayout(videoButtonsColumnLayout, 1);
|
videoAndButtonsLayout->addLayout(videoButtonsColumnLayout, 1);
|
||||||
videoAndButtonsLayout->addWidget(videoLabel, 6);
|
videoAndButtonsLayout->addWidget(videoLabel, 6);
|
||||||
videoDisplayLayout->addLayout(videoAndButtonsLayout);
|
videoDisplayLayout->addLayout(videoAndButtonsLayout);
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
device ID: 1 - Item 1: 人脸单角度注册 ---> NG
|
||||||
|
device ID: 1 - Item 2: 人脸多角度注册 ---> NG
|
||||||
|
device ID: 1 - Item 3: 掌静脉注册 ---> NG
|
||||||
|
device ID: 1 - Item 4: 人脸识别 ---> NG
|
||||||
|
device ID: 1 - Item 5: 掌静脉识别 ---> NG
|
||||||
|
device ID: 1 - Item 6: 删除用户 ---> NG
|
||||||
|
device ID: 1 - Item 7: 删除所有用户 ---> NG
|
||||||
|
device ID: 1 - Item 8: 获取用户 ---> NG
|
||||||
|
device ID: 1 - Item 9: 获取所有用户 ---> NG
|
||||||
|
device ID: 1 - Item 10: 密码注册 ---> NG
|
||||||
|
device ID: 1 - Item 11: 图片注册 ---> NG
|
||||||
|
device ID:-1 ---> All 25 items test completed !!!
|
|
@ -0,0 +1,24 @@
|
||||||
|
device ID: 1 - Item 1: 人脸单角度注册 ---> NG
|
||||||
|
device ID: 1 - Item 2: 人脸多角度注册 ---> NG
|
||||||
|
device ID: 1 - Item 3: 掌静脉注册 ---> NG
|
||||||
|
device ID: 1 - Item 4: 人脸识别 ---> NG
|
||||||
|
device ID: 1 - Item 5: 掌静脉识别 ---> NG
|
||||||
|
device ID: 1 - Item 6: 删除用户 ---> NG
|
||||||
|
device ID: 1 - Item 7: 删除所有用户 ---> NG
|
||||||
|
device ID: 1 - Item 8: 获取用户 ---> NG
|
||||||
|
device ID: 1 - Item 9: 获取所有用户 ---> NG
|
||||||
|
device ID: 1 - Item 10: 密码注册 ---> NG
|
||||||
|
device ID: 1 - Item 11: 图片注册 ---> NG
|
||||||
|
device ID:-1 ---> All 25 items test completed !!!
|
||||||
|
device ID: 1 - Item 1: 人脸单角度注册 ---> NG
|
||||||
|
device ID: 1 - Item 2: 人脸多角度注册 ---> NG
|
||||||
|
device ID: 1 - Item 3: 掌静脉注册 ---> NG
|
||||||
|
device ID: 1 - Item 4: 人脸识别 ---> NG
|
||||||
|
device ID: 1 - Item 5: 掌静脉识别 ---> NG
|
||||||
|
device ID: 1 - Item 6: 删除用户 ---> NG
|
||||||
|
device ID: 1 - Item 7: 删除所有用户 ---> NG
|
||||||
|
device ID: 1 - Item 8: 获取用户 ---> NG
|
||||||
|
device ID: 1 - Item 9: 获取所有用户 ---> NG
|
||||||
|
device ID: 1 - Item 10: 密码注册 ---> NG
|
||||||
|
device ID: 1 - Item 11: 图片注册 ---> NG
|
||||||
|
device ID:-1 ---> All 25 items test completed !!!
|
Binary file not shown.
|
@ -1,231 +0,0 @@
|
||||||
// MainWidget.h
|
|
||||||
#pragma once
|
|
||||||
#ifndef MAINWIDGET_H
|
|
||||||
#define MAINWIDGET_H
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QTcpServer>
|
|
||||||
#include <QJsonArray>
|
|
||||||
#include <QListWidget>
|
|
||||||
#include <QCheckBox>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <QThreadPool>
|
|
||||||
#include <QMutex>
|
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QLineEdit>
|
|
||||||
#include <QTextEdit>
|
|
||||||
#include <QTabWidget>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QGroupBox>
|
|
||||||
#include <QFormLayout>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QStackedLayout>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QHBoxLayout>
|
|
||||||
#include <QTcpSocket>
|
|
||||||
#include <QUdpSocket>
|
|
||||||
#include <QNetworkInterface>
|
|
||||||
#include <QTextStream>
|
|
||||||
#include <QScrollArea>
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QMap>
|
|
||||||
#include <QList>
|
|
||||||
#include <QPair>
|
|
||||||
#include <QTextCodec>
|
|
||||||
#include <QCryptographicHash>
|
|
||||||
#include <QRandomGenerator>
|
|
||||||
#include <QMessageAuthenticationCode>
|
|
||||||
#include <QCoreApplication>
|
|
||||||
|
|
||||||
#include "../Json/readJsonFile.h"
|
|
||||||
#include "../RecvDataHandler/RecvDataHandler.h"
|
|
||||||
#include "../LicenseGenerate/LicenseGenerate.h"
|
|
||||||
#include "../LicenseGenerate/LicenseConfirmWindow.h"
|
|
||||||
#include "../Network/mdns/servicemodel.h"
|
|
||||||
#include "../Network/ClientHandler.h"
|
|
||||||
#include "../Network/httpClient.h"
|
|
||||||
#include "FocusWindow.h"
|
|
||||||
|
|
||||||
// 用于测试 UDP 组播实现 mdns 功能 非标准 mdns
|
|
||||||
#define TEST_UDP_BROADCAST 0
|
|
||||||
|
|
||||||
#define TCP_CONNECT_PORT 12412
|
|
||||||
|
|
||||||
class MainWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
// 构造函数
|
|
||||||
explicit MainWidget(QWidget* parent = nullptr);
|
|
||||||
~MainWidget();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
// 发送HTTP请求
|
|
||||||
//void onSomeButtonClicked();
|
|
||||||
// 处理HTTP响应
|
|
||||||
void onHttpRequestFinished(const QJsonObject& response);
|
|
||||||
// 处理HTTP错误
|
|
||||||
void onHttpRequestError(const QString& errorString);
|
|
||||||
// 处理开始服务器按钮点击事件
|
|
||||||
void onStartServerClicked();
|
|
||||||
// 处理发送获取设备信息按键点击事件
|
|
||||||
void onSendGetDevInfoClicked();
|
|
||||||
// 处理发送取图按键点击事件
|
|
||||||
void onSendGetPicClicked();
|
|
||||||
// 处理发送拉视频流按键点击事件
|
|
||||||
void onSendGetVideoClicked();
|
|
||||||
void onLicenseButtonClicked();
|
|
||||||
void onUuidButtonClicked();
|
|
||||||
// 处理一键发送按钮点击事件
|
|
||||||
void onSendAllClicked();
|
|
||||||
// 处理单独发送项按钮点击事件
|
|
||||||
void onSendFrontItemClicked();
|
|
||||||
void onSendBackItemClicked();
|
|
||||||
// 处理单独发送功能配置项按钮点击事件
|
|
||||||
void onSendFrontFuncItemClicked();
|
|
||||||
void onSendBackFuncItemClicked();
|
|
||||||
// 处理数据接收信号
|
|
||||||
//void onDataReceived(const QString& client, const QByteArray& data);
|
|
||||||
// 处理状态更新信号
|
|
||||||
void onStatusUpdated(const QString& client, int itemIndex, int funcItemIndex,
|
|
||||||
bool success, const QString& itemData, const QString& funcItemData);
|
|
||||||
// 处理所有项目处理完毕信号
|
|
||||||
void onAllItemsProcessed(const QString& client, int itemsProcessedCount);
|
|
||||||
// 处理客户端断开连接
|
|
||||||
void onClientDisconnected(ClientHandler* handler);
|
|
||||||
// 启动超时定时器
|
|
||||||
void onStartTimeout(int clientId, int timeout);
|
|
||||||
// 为了使滚动条在最下面,不用手动鼠标下拉
|
|
||||||
void scrollToBottom();
|
|
||||||
// 处理点击 Save Log 按键
|
|
||||||
void onSelectFileButtonClicked();
|
|
||||||
// 处理点击 Clear Log 按键
|
|
||||||
void onclearLogButtonClicked();
|
|
||||||
// 处理复选框的状态
|
|
||||||
void onSaveCheckBoxStateChanged(int state);
|
|
||||||
// 处理打开调焦的大窗口
|
|
||||||
void onOpenFocusWindowClicked();
|
|
||||||
void printThreadPoolInfo();
|
|
||||||
void onCheckThreadStatus();
|
|
||||||
void onCheckConnectionStatus();
|
|
||||||
void startClientReadTimer(int clientId);
|
|
||||||
void stopClientReadTimer(int clientId);
|
|
||||||
#if TEST_UDP_BROADCAST
|
|
||||||
void sendMulticastMessage();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
private:
|
|
||||||
// 读取 test JSON 配置文件
|
|
||||||
void readJsonConfig();
|
|
||||||
// 设置 UI
|
|
||||||
void setupUI();
|
|
||||||
QGroupBox* createLicenseGroupBox();
|
|
||||||
QGroupBox* createFrontDeviceInfoGroupBox();
|
|
||||||
QGroupBox* createBackDeviceInfoGroupBox();
|
|
||||||
QWidget* createFunctionTestTab(const QJsonArray& BoardFuncTest, const QString& propertyName);
|
|
||||||
QWidget* createFunctionConfigTab(const QJsonArray& BoardFuncConfig, const QString& propertyName);
|
|
||||||
QWidget* createImageDisplayTab();
|
|
||||||
QWidget* createVideoDisplayTab();
|
|
||||||
QGroupBox* createBackConnectServerGroupBox();
|
|
||||||
// 保存日志到文件
|
|
||||||
void saveStatusListToFile(const QString& filePath);
|
|
||||||
// 用于更新按键文本的函数
|
|
||||||
void updateServerButtonText();
|
|
||||||
void onDisconnectClient(int clientId);
|
|
||||||
void setupTimerForThreadPoolInfo();
|
|
||||||
void sendDataToClient(int clientId, const QByteArray& data);
|
|
||||||
//void FactoryToolSendPostFactoryInfotoHttpServer();
|
|
||||||
void FactoryToolSendPostTestToHttpServer();
|
|
||||||
void FactoryToolSendPostLicenseToHttpServer(const QString& hardware_info, const QString& license_info);
|
|
||||||
void FactoryToolSendPostComfirmToHttpServer();
|
|
||||||
void FactoryToolSendGetUuidToHttpServer();
|
|
||||||
void FactoryToolSendGetLicenseToHttpServer(const QString& hw_info);
|
|
||||||
|
|
||||||
QTcpServer* server; // TCP 服务器
|
|
||||||
HttpClient* httpClient; // HTTP 服务器
|
|
||||||
QJsonArray frontBoardOneClickTest; // 前板一键功能测试 JSON
|
|
||||||
QJsonArray frontBoardTest; // 前板单项测试 JSON
|
|
||||||
QJsonArray frontBoardFuncConfig; // 前板功能配置参数 JSON
|
|
||||||
QJsonArray frontBoardDevInfoJson; // 前板设备信息参数 JSON
|
|
||||||
QJsonArray frontBoardLicenseJson; // 前板License JSON
|
|
||||||
QJsonArray backBoardOneClickTest; // 后板一键功能测试 JSON
|
|
||||||
QJsonArray backBoardTest; // 后板单项测试 JSON
|
|
||||||
QJsonArray backBoardFuncConfig; // 后板功能配置参数 JSON
|
|
||||||
QJsonArray backBoardDevInfoJson; // 后板设备信息参数 JSON
|
|
||||||
QJsonArray backBoardUuidJson; // 后板UUID JSON
|
|
||||||
QJsonArray testJsonConfig; // 功能测试区 JSON 配置
|
|
||||||
QJsonArray funcJsonConfig; // 功能配置区 JSON 配置
|
|
||||||
QJsonArray getDevInfoJson; // 获取设备信息 JSON 配置
|
|
||||||
QJsonArray getPicJson; // 发送取图指令 JSON 配置
|
|
||||||
QJsonArray getVideoJson; // 发送拉视频指令 JSON 配置
|
|
||||||
QVBoxLayout* mainLayout; // 主布局
|
|
||||||
QListWidget* statusListWidget; // 状态列表
|
|
||||||
QPushButton* startServerButton; // 开始服务器按键
|
|
||||||
QPushButton* focusWindowsButton; // 调焦窗口按键
|
|
||||||
QPushButton* sendAllButton; // 一键发送按键
|
|
||||||
QThreadPool threadPool; // 线程池
|
|
||||||
QMutex mutex; // 互斥锁
|
|
||||||
int nextClientId; // 新增的客户端编号
|
|
||||||
int connectedClientsCount = 0; // 连接客户端的数量
|
|
||||||
int isRequestSuccessful = 0; // GET请求是否成功
|
|
||||||
bool manualSend; // 判断是否是手动触发的发送
|
|
||||||
bool deviceConnected = false; // 判断是否有设备连接过
|
|
||||||
bool isSendingAll; // 一键功能测试 状态
|
|
||||||
|
|
||||||
QJsonObject licenseDataArray; // 用于保存从服务器获取的 data 字段对象
|
|
||||||
|
|
||||||
QVector<QPushButton*> itemButtons; // 项目按键集合
|
|
||||||
QVector<QPushButton*> funcItemButtons; // 功能配置项目按键集合
|
|
||||||
QVector<QPushButton*> getPicButtons; // 保存两个取图的摄像头的按键的指针
|
|
||||||
QVector<QPushButton*> getVideoButtons; // 保存拉视频设备的按键的指针
|
|
||||||
QList<ClientHandler*> clients; // 客户端处理器集合
|
|
||||||
QMap<int, QTimer*> clientTimers; // 每个客户端的定时器
|
|
||||||
QMap<QString, QLineEdit*> devInfoLineEdits;// msg_id 和对应的 QLineEdit 的映射关系
|
|
||||||
|
|
||||||
QCheckBox* saveCheckBox; // 保存文件复选框
|
|
||||||
QPushButton* selectFileButton; // Save Log 按键
|
|
||||||
QPushButton* clearLogButton; // clear Log 按键
|
|
||||||
QLineEdit* filePathLineEdit; // 文件路径显示
|
|
||||||
QLabel* leftLens_imageLabel; // 左边镜头图像显示
|
|
||||||
QLabel* rightLens_imageLabel; // 右边镜头图像显示
|
|
||||||
QLabel* videoLabel; // 视频显示
|
|
||||||
QLineEdit* frontFuncConfigLineEdit; // 前板功能配置编辑框
|
|
||||||
QLineEdit* backFuncConfigLineEdit; // 后板功能配置编辑框
|
|
||||||
QTextEdit* licenseHwInfoEdit; // 获取license的硬件信息
|
|
||||||
QTextEdit* UuidHwInfoEdit; // Uuid的硬件信息
|
|
||||||
MainWidget* mainWidget;
|
|
||||||
QTabWidget* tabWidget; // 标签页
|
|
||||||
QWidget* functionTestArea; // 功能测试区
|
|
||||||
QWidget* functionConfigArea; // 功能配置区
|
|
||||||
|
|
||||||
int lastClickedGetPicCamIndex; // 记录上一次点击取图的摄像头的按键索引
|
|
||||||
int lastClickedGetPicDevIndex; // 记录上一次点击取图的设备的按键索引
|
|
||||||
int lastClickedGetVideoCamIndex; // 记录上一次点击拉视频的摄像头的按键索引
|
|
||||||
int lastClickedGetVideoDevIndex; // 记录上一次点击拉视频的设备的按键索引
|
|
||||||
|
|
||||||
|
|
||||||
QTimer* threadStatusTimer; // 检查线程状态的定时器
|
|
||||||
QTimer* connectionStatusCheckTimer; // 检查连接状态的定时器
|
|
||||||
QMap<int, QThread*> clientThreads;
|
|
||||||
QMap<int, QTimer*> clientReadTimers;
|
|
||||||
QMap<int, ClientHandler*> clients_1;
|
|
||||||
|
|
||||||
ServiceProvider* mServiceProvider;
|
|
||||||
QTimer* mdnsTimer;
|
|
||||||
void startMdnsService();
|
|
||||||
void stopMdnsService();
|
|
||||||
#if TEST_UDP_BROADCAST
|
|
||||||
QUdpSocket* multicastSocket;
|
|
||||||
QTimer* multicastTimer;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // MAINWIDGET_H
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue