更新与前板的使用串口连接

This commit is contained in:
2025-02-14 11:06:28 +08:00
parent d2bccd9c49
commit aa3e8c8223
301 changed files with 5373 additions and 512 deletions

View File

@@ -106,14 +106,14 @@ QString ClientHandler::getCurrentFuncItemData() const
{
QString data = currentFuncItem.value("val").toString();
qDebug() << "Getting current funcItem val:" << data;
return data; // 返回当前项的 "data" 字段
return data; // 返回当前项的 "val" 字段
}
QString ClientHandler::getCurrentItemLable() const
{
QString lable = currentItem.value("lable").toString();
qDebug() << "Getting current item lable:" << lable;
return lable; // 返回当前项的 "data" 字段
return lable; // 返回当前项的 "lable" 字段
}
QString ClientHandler::getCurrentFuncItemLable() const
@@ -475,8 +475,6 @@ void ClientHandler::sendDevInfoJsonItem(const QJsonObject& jsonItem, int itemInd
else {
emit sendDataToSomeClient(controlClientId, itemData.toUtf8());
}
if (jsonItem.contains("timeout")) {
int timeout = jsonItem.value("timeout").toInt();
if (timeout > 0) {
@@ -553,7 +551,7 @@ void ClientHandler::sendNextItem(QJsonArray& currentOneClickedItem)
}
}
else if (isManualSend) {
emit allItemsProcessed(getClientAddress(), itemsProcessedCount);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), itemsProcessedCount);
// 处理完毕后重置标记
isManualSend = false;
isClickedSend = false;
@@ -582,7 +580,6 @@ void ClientHandler::RNDISClient3Data(QByteArray& data) {
}
void ClientHandler::RNDISClient4Data(QByteArray& data) {
//qDebug() << " RNDISClient4Data size:" << data.size();
//qDebug() << " RNDISClient4Data size:" << data.size();
isRecvVideoData = false;
isStartVideo = false;
@@ -679,10 +676,10 @@ void ClientHandler::onPicRecvFinished()
void ClientHandler::onDataReceived()
{
//qDebug() << "isRecvVideoData:" << isRecvVideoData;
//qDebug() << "isPowerOnSend:" << isPowerOnSend;
//qDebug() << "isClickedSend:" << isClickedSend;
//qDebug() << "isSingleSend:" << isSingleSend;
//qDebug() << "isRecvImgData:" << isRecvImgData;
//qDebug() << "isPowerOnSend: " << isPowerOnSend;
//qDebug() << "isClickedSend: " << isClickedSend;
//qDebug() << "isSingleSend: " << isSingleSend;
//qDebug() << "isRecvImgData: " << isRecvImgData;
if (!isRecvVideoData &&
(isRecvImgData || isPowerOnSend || isClickedSend || (isSingleSend && (currentItemIndex < currentJson.size())))) {
QByteArray allData;
@@ -726,7 +723,7 @@ void ClientHandler::onDataReceived()
}
else {
qDebug() << "All items processed in onDataReceived.";
emit allItemsProcessed(getClientAddress(), currentBackBoardIndex);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), currentBackBoardIndex);
isPowerOnSend = false;
}
}
@@ -736,7 +733,7 @@ void ClientHandler::onDataReceived()
}
else {
qDebug() << "All items processed in onDataReceived.";
emit allItemsProcessed(getClientAddress(), currentFrontBoardIndex);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), currentFrontBoardIndex);
isPowerOnSend = false;
}
}
@@ -748,7 +745,7 @@ void ClientHandler::onDataReceived()
}
}
else if(isClickedSend) {
emit allItemsProcessed(getClientAddress(), itemsProcessedCount);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), itemsProcessedCount);
isClickedSend = false;
//resetCurrentItemIndex();
}
@@ -850,7 +847,7 @@ void ClientHandler::onTimeout()
{
{
QMutexLocker locker(&mutex);
emit statusUpdated(getClientAddress(), false, currentJson, currentJsonItem);
emit statusUpdated(isBackBoardOrAllBoard, getClientAddress(), false, currentJson, currentJsonItem);
//qDebug() << "isSingleSend:" << isSingleSend << "isPowerOnSend:" << isPowerOnSend;
if (!isSingleSend && !isPowerOnSend) {
currentItemIndex ++;
@@ -866,7 +863,7 @@ void ClientHandler::onTimeout()
sendNextItem(currentJson);
}
else if (currentItemIndex >= backBoardOneClickTest.size()) {
emit allItemsProcessed(getClientAddress(), itemsProcessedCount);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), itemsProcessedCount);
}
}
else {
@@ -874,7 +871,7 @@ void ClientHandler::onTimeout()
sendNextItem(currentJson);
}
else if (currentItemIndex >= frontBoardOneClickTest.size()) {
emit allItemsProcessed(getClientAddress(), itemsProcessedCount);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), itemsProcessedCount);
}
}
}
@@ -884,7 +881,7 @@ void ClientHandler::onTimeout()
sendDevInfoItem();
}
else {
emit allItemsProcessed(getClientAddress(), currentBackBoardIndex);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), currentBackBoardIndex);
currentFrontBoardIndex = 0;
currentBackBoardIndex = 0;
isPowerOnSend = false;
@@ -895,7 +892,7 @@ void ClientHandler::onTimeout()
sendDevInfoItem();
}
else {
emit allItemsProcessed(getClientAddress(), currentFrontBoardIndex);
emit allItemsProcessed(isBackBoardOrAllBoard, getClientAddress(), currentFrontBoardIndex);
currentFrontBoardIndex = 0;
currentBackBoardIndex = 0;
isPowerOnSend = false;

View File

@@ -112,12 +112,12 @@ signals:
// 数据发送信号
void sendData(const QByteArray& data, int isBoardType);
// 状态更新信号
void statusUpdated(const QString& client, bool success, const QJsonArray& jsonArray, int itemJsonIndex);
void statusUpdated(int boardTpye, const QString& client, bool success, const QJsonArray& jsonArray, int itemJsonIndex);
void HandleInvalidOperate(const QString& text);
// 客户端断开连接信号
void clientDisconnected(ClientHandler* handler);
// json文件配置项发送完毕
void allItemsProcessed(const QString& client, int itemsProcessedCount);
void allItemsProcessed(int boardTpye, const QString& client, int itemsProcessedCount);
// 通知主线程启动定时器
void startTimeout(int timeout);
void selectClientDisconnected(int client_Id);

View File

@@ -23,7 +23,7 @@ public:
QPushButton* deleteButton = new QPushButton("删除用户", this);
layout->addWidget(deleteButton);
qDebug() << "------------- DelUserWindow";
connect(deleteButton, &QPushButton::clicked, this, &DelUserWindow::onDeleteButtonClicked);
}

View File

@@ -4,12 +4,13 @@
#include "mdns.h"
// 添加一个类来运行 mDNS 服务
// 运行 mDNS 服务
class MdnsServiceThread : public QThread {
Q_OBJECT
public:
MdnsServiceThread(const QString& hostname, const QString& serviceName, int servicePort, QObject* parent = nullptr)
MdnsServiceThread(const QString& hostname, const QString& serviceName, int servicePort, char* select_ip, QObject* parent = nullptr)
: QThread(parent),
m_select_ip(select_ip),
m_hostname(hostname),
m_serviceName(serviceName),
m_servicePort(servicePort) {}
@@ -26,8 +27,9 @@ protected:
extern volatile sig_atomic_t running; // 使用全局变量控制运行状态
running = 1;
// 调用阻塞的 service_mdns 方法
int result = service_mdns(m_hostname.toStdString().c_str(), m_serviceName.toStdString().c_str(), m_servicePort);
//int result = service_mdns(m_hostname.toStdString().c_str(), m_serviceName.toStdString().c_str(), m_servicePort, "192.168.1.170");
//int result = service_mdns(m_hostname.toStdString().c_str(), m_serviceName.toStdString().c_str(), m_servicePort, "172.17.128.1");
int result = service_mdns(m_hostname.toStdString().c_str(), m_serviceName.toStdString().c_str(), m_servicePort, m_select_ip);
if (result < 0) {
qDebug() << "Failed to start mDNS service";
}
@@ -37,6 +39,7 @@ protected:
}
private:
char* m_select_ip;
QString m_hostname;
QString m_serviceName;
int m_servicePort;

View File

@@ -530,7 +530,7 @@ open_client_sockets(int* sockets, int max_sockets, int port) {
char buffer[128];
mdns_string_t addr = ipv4_address_to_string(buffer, sizeof(buffer), saddr,
sizeof(struct sockaddr_in));
printf("Local IPv4 address: %.*s\n", MDNS_STRING_FORMAT(addr));
printf("---Local IPv4 address: %.*s\n", MDNS_STRING_FORMAT(addr));
}
}
} else if (unicast->Address.lpSockaddr->sa_family == AF_INET6) {
@@ -665,6 +665,7 @@ open_client_sockets(int* sockets, int max_sockets, int port) {
return num_sockets;
}
/*
// Open sockets to listen to incoming mDNS queries on port 5353
static int
open_service_sockets(int* sockets, int max_sockets) {
@@ -720,6 +721,101 @@ open_service_sockets(int* sockets, int max_sockets) {
return num_sockets;
}
*/
static int open_service_sockets(int* sockets, int max_sockets, const char* local_ip) {
int num_sockets = 0;
if (local_ip) {
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD> local_ip<69><70><EFBFBD><EFBFBD><EFBFBD>󶨵<EFBFBD><F3B6A8B5>õ<EFBFBD>ַ
struct sockaddr_in sock_addr_ipv4;
struct sockaddr_in6 sock_addr_ipv6;
memset(&sock_addr_ipv4, 0, sizeof(sock_addr_ipv4));
memset(&sock_addr_ipv6, 0, sizeof(sock_addr_ipv6));
if (inet_pton(AF_INET, local_ip, &sock_addr_ipv4.sin_addr)) {
sock_addr_ipv4.sin_family = AF_INET;
sock_addr_ipv4.sin_port = htons(MDNS_PORT);
#ifdef __APPLE__
sock_addr_ipv4.sin_len = sizeof(struct sockaddr_in);
#endif
int sock = mdns_socket_open_ipv4(&sock_addr_ipv4);
if (sock >= 0) {
sockets[num_sockets++] = sock;
printf("Bound to specific IPv4 address: %s\n", local_ip);
}
else {
printf("Failed to bind to IPv4 address: %s\n", local_ip);
}
}
else if (inet_pton(AF_INET6, local_ip, &sock_addr_ipv6.sin6_addr)) {
sock_addr_ipv6.sin6_family = AF_INET6;
sock_addr_ipv6.sin6_port = htons(MDNS_PORT);
#ifdef __APPLE__
sock_addr_ipv6.sin6_len = sizeof(struct sockaddr_in6);
#endif
int sock = mdns_socket_open_ipv6(&sock_addr_ipv6);
if (sock >= 0) {
sockets[num_sockets++] = sock;
printf("Bound to specific IPv6 address: %s\n", local_ip);
}
else {
printf("Failed to bind to IPv6 address: %s\n", local_ip);
}
}
else {
printf("Invalid local IP address: %s\n", local_ip);
}
}
if (num_sockets == 0) {
// <20><><EFBFBD><EFBFBD>δָ<CEB4><D6B8> local_ip<69><70><EFBFBD><EFBFBD><EFBFBD>󶨵<EFBFBD><F3B6A8B5><EFBFBD><EFBFBD>нӿ<D0BD>
if (num_sockets < max_sockets) {
struct sockaddr_in sock_addr;
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
#ifdef _WIN32
sock_addr.sin_addr = in4addr_any;
#else
sock_addr.sin_addr.s_addr = INADDR_ANY;
#endif
sock_addr.sin_port = htons(MDNS_PORT);
#ifdef __APPLE__
sock_addr.sin_len = sizeof(struct sockaddr_in);
#endif
int sock = mdns_socket_open_ipv4(&sock_addr);
if (sock >= 0) {
sockets[num_sockets++] = sock;
printf("IPv4 socket opened successfully on port %d\n", MDNS_PORT);
}
else {
printf("Failed to open IPv4 socket on port %d\n", MDNS_PORT);
}
}
if (num_sockets < max_sockets) {
struct sockaddr_in6 sock_addr;
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin6_family = AF_INET6;
sock_addr.sin6_addr = in6addr_any;
sock_addr.sin6_port = htons(MDNS_PORT);
#ifdef __APPLE__
sock_addr.sin6_len = sizeof(struct sockaddr_in6);
#endif
int sock = mdns_socket_open_ipv6(&sock_addr);
if (sock >= 0) {
sockets[num_sockets++] = sock;
printf("IPv6 socket opened successfully on port %d\n", MDNS_PORT);
}
else {
printf("Failed to open IPv6 socket on port %d\n", MDNS_PORT);
}
}
}
return num_sockets;
}
// Send a DNS-SD query
static int
@@ -862,10 +958,12 @@ send_mdns_query(mdns_query_t* query, size_t count, void* user_data) {
}
// Provide a mDNS service, answering incoming DNS-SD and mDNS queries
/*
int
service_mdns(const char* hostname, const char* service_name, int service_port) {
service_mdns(const char* hostname, const char* service_name, int service_port, const char* local_ip) {
int sockets[32];
int num_sockets = open_service_sockets(sockets, sizeof(sockets) / sizeof(sockets[0]));
//int num_sockets = open_service_sockets(sockets, sizeof(sockets) / sizeof(sockets[0]));
int num_sockets = open_service_sockets(sockets, sizeof(sockets) / sizeof(sockets[0]), local_ip);
if (num_sockets <= 0) {
printf("Failed to open any client sockets\n");
return -1;
@@ -1037,6 +1135,183 @@ service_mdns(const char* hostname, const char* service_name, int service_port) {
mdns_socket_close(sockets[isock]);
printf("Closed socket%s\n", num_sockets ? "s" : "");
return 0;
}*/
int service_mdns(const char* hostname, const char* service_name, int service_port, const char* local_ip) {
int sockets[32];
int num_sockets = open_service_sockets(sockets, sizeof(sockets) / sizeof(sockets[0]), local_ip);
if (num_sockets <= 0) {
printf("Failed to open any client sockets\n");
return -1;
}
printf("Opened %d socket%s for mDNS service\n", num_sockets, num_sockets ? "s" : "");
size_t service_name_length = strlen(service_name);
if (!service_name_length) {
printf("Invalid service name\n");
return -1;
}
char* service_name_buffer = malloc(service_name_length + 2);
memcpy(service_name_buffer, service_name, service_name_length);
if (service_name_buffer[service_name_length - 1] != '.')
service_name_buffer[service_name_length++] = '.';
service_name_buffer[service_name_length] = 0;
service_name = service_name_buffer;
printf("Service mDNS: %s:%d\n", service_name, service_port);
printf("Hostname: %s\n", hostname);
size_t capacity = 2048;
void* buffer = malloc(capacity);
mdns_string_t service_string = (mdns_string_t){service_name, strlen(service_name)};
mdns_string_t hostname_string = (mdns_string_t){hostname, strlen(hostname)};
char service_instance_buffer[256] = {0};
snprintf(service_instance_buffer, sizeof(service_instance_buffer) - 1, "%.*s.%.*s",
MDNS_STRING_FORMAT(hostname_string), MDNS_STRING_FORMAT(service_string));
mdns_string_t service_instance_string =
(mdns_string_t){service_instance_buffer, strlen(service_instance_buffer)};
char qualified_hostname_buffer[256] = {0};
snprintf(qualified_hostname_buffer, sizeof(qualified_hostname_buffer) - 1, "%.*s.local.",
MDNS_STRING_FORMAT(hostname_string));
mdns_string_t hostname_qualified_string =
(mdns_string_t){qualified_hostname_buffer, strlen(qualified_hostname_buffer)};
service_t service = {0};
service.service = service_string;
service.hostname = hostname_string;
service.service_instance = service_instance_string;
service.hostname_qualified = hostname_qualified_string;
service.port = service_port;
if (local_ip) {
struct sockaddr_in addr_ipv4;
memset(&addr_ipv4, 0, sizeof(addr_ipv4));
addr_ipv4.sin_family = AF_INET;
if (inet_pton(AF_INET, local_ip, &addr_ipv4.sin_addr) <= 0) {
printf("Invalid local IP address: %s\n", local_ip);
free(service_name_buffer);
free(buffer);
return -1;
}
service.address_ipv4 = addr_ipv4;
} else {
service.address_ipv4 = service_address_ipv4;
}
// Setup mDNS records
service.record_ptr = (mdns_record_t){
.name = service.service,
.type = MDNS_RECORDTYPE_PTR,
.data.ptr.name = service.service_instance,
.rclass = 0,
.ttl = 120
};
service.record_srv = (mdns_record_t){
.name = service.service_instance,
.type = MDNS_RECORDTYPE_SRV,
.data.srv.name = service.hostname_qualified,
.data.srv.port = service.port,
.data.srv.priority = 0,
.data.srv.weight = 0,
.rclass = 0,
.ttl = 120
};
service.record_a = (mdns_record_t){
.name = service.hostname_qualified,
.type = MDNS_RECORDTYPE_A,
.data.a.addr = service.address_ipv4,
.rclass = 0,
.ttl = 120
};
service.record_aaaa = (mdns_record_t){
.name = service.hostname_qualified,
.type = MDNS_RECORDTYPE_AAAA,
.data.aaaa.addr = service.address_ipv6,
.rclass = 0,
.ttl = 120
};
service.txt_record[0] = (mdns_record_t){
.name = service.service_instance,
.type = MDNS_RECORDTYPE_TXT,
.data.txt.key = {MDNS_STRING_CONST("test")},
.data.txt.value = {MDNS_STRING_CONST("1")},
.rclass = 0,
.ttl = 120
};
service.txt_record[1] = (mdns_record_t){
.name = service.service_instance,
.type = MDNS_RECORDTYPE_TXT,
.data.txt.key = {MDNS_STRING_CONST("other")},
.data.txt.value = {MDNS_STRING_CONST("value")},
.rclass = 0,
.ttl = 120
};
printf("Sending announce\n");
mdns_record_t additional[5] = {0};
size_t additional_count = 0;
additional[additional_count++] = service.record_srv;
additional[additional_count++] = service.record_a;
additional[additional_count++] = service.txt_record[0];
additional[additional_count++] = service.txt_record[1];
for (int isock = 0; isock < num_sockets; ++isock)
mdns_announce_multicast(sockets[isock], buffer, capacity, service.record_ptr, 0, 0, additional, additional_count);
// Service loop
while (running) {
int nfds = 0;
fd_set readfs;
FD_ZERO(&readfs);
for (int isock = 0; isock < num_sockets; ++isock) {
if (sockets[isock] >= nfds)
nfds = sockets[isock] + 1;
FD_SET(sockets[isock], &readfs);
}
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100000;
if (select(nfds, &readfs, 0, 0, &timeout) >= 0) {
for (int isock = 0; isock < num_sockets; ++isock) {
if (FD_ISSET(sockets[isock], &readfs)) {
mdns_socket_listen(sockets[isock], buffer, capacity, service_callback, &service);
}
FD_SET(sockets[isock], &readfs);
}
} else {
break;
}
}
printf("Sending goodbye\n");
additional_count = 0;
additional[additional_count++] = service.record_srv;
additional[additional_count++] = service.record_a;
additional[additional_count++] = service.txt_record[0];
additional[additional_count++] = service.txt_record[1];
for (int isock = 0; isock < num_sockets; ++isock)
mdns_goodbye_multicast(sockets[isock], buffer, capacity, service.record_ptr, 0, 0, additional, additional_count);
free(buffer);
free(service_name_buffer);
for (int isock = 0; isock < num_sockets; ++isock)
mdns_socket_close(sockets[isock]);
printf("Closed socket%s\n", num_sockets > 1 ? "s" : "");
return 0;
}
@@ -1045,7 +1320,7 @@ service_mdns(const char* hostname, const char* service_name, int service_port) {
static int
dump_mdns(void) {
int sockets[32];
int num_sockets = open_service_sockets(sockets, sizeof(sockets) / sizeof(sockets[0]));
int num_sockets = open_service_sockets(sockets, sizeof(sockets) / sizeof(sockets[0]), "192.168.1.170");
if (num_sockets <= 0) {
printf("Failed to open any client sockets\n");
return -1;

View File

@@ -177,7 +177,7 @@ struct mdns_query_t {
};
int
service_mdns(const char* hostname, const char* service_name, int service_port);
service_mdns(const char* hostname, const char* service_name, int service_port, const char* local_ip);
// mDNS/DNS-SD public API