Files
eUi/rpcModule/rpc_finsTcp/rpc_finsTcp.h
T

105 lines
3.3 KiB
C++

#ifndef rpc_finsTcp_H
#define rpc_finsTcp_H
#include <QtCore/qglobal.h>
#include <QByteArray>
#include <iostream>
#include <QQueue>
#include <QDebug>
#include <subModuleBase.h>
#include <QMutex>
#include <QObject>
#include <QTcpSocket>
#include <QTimer>
#include <unordered_map>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QHostAddress>
#include <qmap.h>
#include <qthread.h>
enum connectionStatus {
None,
Disconnected,
Connected
};
class JsonRpcClient : public QObject {
Q_OBJECT
public:
connectionStatus _connectionStatus = None;
JsonRpcClient(const QString& host = "127.0.0.1", quint16 port = 9000);
void writeCall(const QString& method, const QJsonArray& params = {}, const QString& module = QString());
QVariant call(const QString& method, const QJsonArray& params = {}, const QString& module = QString());
QByteArray finsReadCall(const QString& method, const QString& params = "", const QString& module = QString());
bool reconnect(); // 主动重连,或 call() 失败时调用
private:
// 解析累计缓冲中的完整 JSON 帧(可能存在粘包/拆包)
QList<QByteArray> extractJsonFrames(QByteArray& buffer);
bool waitAndReadResponse(int expectId, QJsonObject& outResp, int timeoutMs = 8000);
QJsonObject sendRequestBuildAndAwait(const QJsonObject& req, int timeoutMs = 8000);
QMutex mutex_; // 确保线程安全
QTcpSocket socket_;
QString host_;
quint16 port_;
int idCounter_;
QByteArray recvBuffer_; // 累计接收缓冲
};
class JsonRpcClientWorker : public QObject {
Q_OBJECT
public:
connectionStatus connection;
QQueue<QByteArray> readDataQueue;
JsonRpcClientWorker() {
}
public slots:
void initClient() {
_JsonRpcClient = new JsonRpcClient();
connection = _JsonRpcClient->_connectionStatus;
}
void writeCallSlot(const QString& method, const QJsonArray& params, const QString& module = QString()) {
if (_JsonRpcClient) {
//qDebug() << params;
_JsonRpcClient->call(method, params, module);
}
}
private:
JsonRpcClient* _JsonRpcClient = nullptr;
};
class rpc_finsTcp :public rpcModuleBase
{
Q_OBJECT
public:
rpc_finsTcp();
virtual ~rpc_finsTcp();
//bool readData(std::vector<cv::Mat>& vec_mat, QByteArray& data, nlohmann::json&); // readData将PLC读取或者发送的返回值发回给主线程,通过全局变量的方式逐条发送
//bool writeData(std::vector<cv::Mat>& vec_mat, QByteArray& data, nlohmann::json&); // writeData调用PLC的收发,将需要的数据发给寄存器,返回OK/NG
bool readData(std::vector<cv::Mat>&, QByteArray&);
bool writeData(std::vector<cv::Mat>&, QByteArray&);
bool initParas(QByteArray&);
bool run();
signals:
void initRpcClient();
void writeCallSignal(const QString& method, const QJsonArray& params, const QString& module);
private:
QMutex mutex;
QMap<QString,JsonRpcClient*> read_JsonRpcClient; // 存储多个 JsonRpcClient 实例
QThread* subThread;
JsonRpcClientWorker* write_JsonRpcClient;
QString m_IP;
int m_port;
QQueue<QByteArray> readDataQueue;
};
#pragma once
extern "C"
{
Q_DECL_EXPORT rpc_finsTcp * create();
Q_DECL_EXPORT void destory(rpc_finsTcp * ptr);
}
#endif // rpc_finsTcp_H