Compare commits

...

1 Commits
V3.0 ... main

Author SHA1 Message Date
Mr.V 9b42aec1ad 1、新增数据转发功能,可配合Linux版RFID识别程序使用。
2、优化部分逻辑。
2024-07-27 16:01:00 +08:00
3 changed files with 221 additions and 10 deletions

View File

@ -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
```

View File

@ -0,0 +1,135 @@
//
// Created by Mr.V on 2024/4/3.
//
#include "RelayRfidThread.h"
RelayRfidThread::RelayRfidThread(MQueue<QString> *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);
}
}
}

View File

@ -0,0 +1,64 @@
//
// Created by Mr.V on 2024/4/3.
//
#ifndef TRAIN_RFID_RELAYRFIDTHREAD_H
#define TRAIN_RFID_RELAYRFIDTHREAD_H
#include <QThread>
#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<QString> *queueRFID, QObject *parent = nullptr);
[[noreturn]] void run() override;
private:
MQueue<QString> *queueRFID_ = nullptr;
ai_matrix::RelayConfig relayConfig_{};
QTcpServer *server_;
QVector<QTcpSocket *> 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