105 lines
3.3 KiB
C++
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
|