From 9b42aec1ad81b2f89d6a3b92299f6cd69b3785af Mon Sep 17 00:00:00 2001 From: "Mr.V" Date: Sat, 27 Jul 2024 16:01:00 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BD=AC=E5=8F=91=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=8F=AF=E9=85=8D?= =?UTF-8?q?=E5=90=88Linux=E7=89=88RFID=E8=AF=86=E5=88=AB=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=80=82=202=E3=80=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 +++++--- src/threads/RelayRfidThread.cpp | 135 ++++++++++++++++++++++++++++++++ src/threads/RelayRfidThread.h | 64 +++++++++++++++ 3 files changed, 221 insertions(+), 10 deletions(-) create mode 100644 src/threads/RelayRfidThread.cpp create mode 100644 src/threads/RelayRfidThread.h diff --git a/README.md b/README.md index 45e34e0..704d0a8 100644 --- a/README.md +++ b/README.md @@ -23,30 +23,31 @@ RFID硬件车号识别程序,支持识别结果上传web ### 配置文件 ```python [base] -# 串口名 -com_name=COM2 -# 波特率 -baud=19200 # 股道名 track_name=2 -# 是否有磁钢 -have_magnet_steel=true -# 需要识别的磁钢顺序 -magnet_steel_order=8421 # 是否上传识别结果(上传接口见interface配置) up_result=true # 是否使用socket接口获取来车状态 use_socket_server=false +run_model=0 + +[serial] +com_name=COM2 +baud=19200 +have_magnet_steel=true +magnet_steel_order=8421 [interface] # 接口IP -http_ip=192.168.2.108 +http_ip=192.168.2.212 # 接口端口 http_port=20004 # 获取token的接口地址 token_path=/api/token_path # 上传识别结果的接口地址 up_result_path=/api/train-carriage/identification/rfid-save +# 上传报警信息的接口地址 +up_warning_path=/api/blade-train/deviceInfo/save # 接口用户名 username=guest_01 # 接口密码 @@ -54,7 +55,18 @@ password=d55b0f642e817eea24725d2f2a31dd08 [socket_server] # socket 服务端IP -server_ip=172.18.160.1 +server_ip=127.0.0.1 # socket 端口 server_port=7000 +# 等待信号而延迟上传的车节数 +delayed_upload=4 + +[device_warn] +# 最少识别车节数(低于此值会报警) +min_train_size=10 + +[relay] +# 转发服务监听端口 +listener_port=7070 + ``` diff --git a/src/threads/RelayRfidThread.cpp b/src/threads/RelayRfidThread.cpp new file mode 100644 index 0000000..d23334b --- /dev/null +++ b/src/threads/RelayRfidThread.cpp @@ -0,0 +1,135 @@ +// +// Created by Mr.V on 2024/4/3. +// + +#include "RelayRfidThread.h" + + +RelayRfidThread::RelayRfidThread(MQueue *queueRFID, QObject *parent) : + QThread(parent) +{ + this->queueRFID_ = queueRFID; + + // 配置文件读取 + QString errorMessage = ""; + if (!ConfigUtil::readRelayConfig(g_config_path, errorMessage, this->relayConfig_)) + { + emit this->ErrorSignals(errorMessage); + } + + this->server_ = new QTcpServer(); + //关联客户端连接信号newConnection + connect(this->server_, &QTcpServer::newConnection, this, &RelayRfidThread::newConnection); //连接客户端 + + //启动服务器监听 + this->server_->listen(QHostAddress::Any, this->relayConfig_.listener_port); + this->server_->setMaxPendingConnections(2); +} + +void RelayRfidThread::newConnection() +{ + + QTcpSocket *socket = new QTcpSocket(); + socket = this->server_->nextPendingConnection(); + this->vec_sockets_.push_back(socket); + + emit this->ConnectInfoSignals("客户端" + socket->peerAddress().toString() + " 建立了链接"); + emit this->update_client_num(1); + + connect(socket, &QTcpSocket::readyRead, this, &RelayRfidThread::receive_info); + connect(socket, &QTcpSocket::disconnected, this, &RelayRfidThread::disconnection); +// connect(socket, +// SIGNAL(stateChanged(QAbstractSocket::SocketState)), +// this, +// SLOT(socketStateChange(QAbstractSocket::SocketState))); +} + +void RelayRfidThread::receive_info() { +// try { +// //可以实现同时读取多个客户端发送过来的消息 +// QTcpSocket *obj = (QTcpSocket*)sender(); +// if (!obj->waitForReadyRead(100)) +// { +// return; +// } +// QString msg = obj->readLine(512); //obj->readAll(); +// +// if (!msg.contains("matrixai")) +// emit this->InfoSignals(obj->peerAddress().toString() + "客户端: " + msg); +// } catch (const QException &e) { +// emit this->WarnSignals("Caught exception:" + QString::fromStdString(e.what())); +// } +} + +bool RelayRfidThread::send_Info(const QString &msg) +{ + for(auto & socket : vec_sockets_) + { + if (socket->state() == QTcpSocket::ConnectedState) + { + socket->write(msg.toUtf8().data()); + if (!socket->waitForBytesWritten(1000)) { // 等待1000毫秒 + emit this->WarnSignals("向" + socket->peerAddress().toString() + "转发失败:" + msg); + } + } + } + emit this->RfidInfoSignals(msg); + return true; +} + +void RelayRfidThread::disconnection() +{ + QTcpSocket *obj = (QTcpSocket*)sender();//掉线对象 + emit this->ConnectInfoSignals("客户端" + obj->peerAddress().toString() + " 断开链接"); + emit this->update_client_num(-1); +} + +void RelayRfidThread::socketStateChange(QAbstractSocket::SocketState state) +{ + QTcpSocket *obj = (QTcpSocket*)sender(); + switch (state) { + case QAbstractSocket::UnconnectedState: + emit this->ConnectInfoSignals(obj->peerAddress().toString() + ":UnconnectedState"); + break; + case QAbstractSocket::ConnectedState: + emit this->ConnectInfoSignals(obj->peerAddress().toString() + ":ConnectedState"); + break; + case QAbstractSocket::ConnectingState: + emit this->ConnectInfoSignals(obj->peerAddress().toString() + ":ConnectingState"); + break; + case QAbstractSocket::HostLookupState: + emit this->ConnectInfoSignals(obj->peerAddress().toString() + ":HostLookupState"); + break; + case QAbstractSocket::ClosingState: + emit this->ConnectInfoSignals(obj->peerAddress().toString() + ":ClosingState"); + break; + case QAbstractSocket::ListeningState: + emit this->ConnectInfoSignals(obj->peerAddress().toString() + ":ListeningState"); + break; + case QAbstractSocket::BoundState: + emit this->ConnectInfoSignals(obj->peerAddress().toString() + ":BoundState"); + break; + default: + break; + } +} + +[[noreturn]] void RelayRfidThread::run() +{ + while (true) + { +// emit this->InfoSignals("开启监听->" + QString::number(this->relayConfig_.listener_port)); + if (!queueRFID_->isEmpty()) + { + QString msg = queueRFID_->getTop(); + this->send_Info(msg); + queueRFID_->pop(); + QThread::msleep(1); + } + else + { + QThread::msleep(20); + } + } +} + diff --git a/src/threads/RelayRfidThread.h b/src/threads/RelayRfidThread.h new file mode 100644 index 0000000..42a2c16 --- /dev/null +++ b/src/threads/RelayRfidThread.h @@ -0,0 +1,64 @@ +// +// Created by Mr.V on 2024/4/3. +// + +#ifndef TRAIN_RFID_RELAYRFIDTHREAD_H +#define TRAIN_RFID_RELAYRFIDTHREAD_H + +#include +#include "common.h" +#include "MQueue.h" +#include "httplib.h" +#include "json.h" +#include "ConfigUtil.h" + +using namespace ai_matrix; + +class RelayRfidThread : public QThread { +Q_OBJECT +public: + ~RelayRfidThread() {}; + + RelayRfidThread(MQueue *queueRFID, QObject *parent = nullptr); + + [[noreturn]] void run() override; + +private: + MQueue *queueRFID_ = nullptr; + ai_matrix::RelayConfig relayConfig_{}; + + QTcpServer *server_; + QVector vec_sockets_; + + bool send_Info(const QString &msg); + + bool getToken(); + + +signals: + + void DebugSignals(const QString &info); + + void InfoSignals(const QString &info); + + void WarnSignals(const QString &info); + + void ErrorSignals(const QString &info); + + void ConnectInfoSignals(const QString &info); + + void update_client_num(int num); + + void RfidInfoSignals(const QString &info); + +private slots: + + void newConnection(); + + void receive_info(); + + void disconnection(); + + void socketStateChange(QAbstractSocket::SocketState state); +}; +#endif //TRAIN_RFID_RELAYRFIDTHREAD_H