|
@@ -0,0 +1,134 @@
|
|
|
|
|
+#include "websocketclient.h"
|
|
|
|
|
+
|
|
|
|
|
+#include "appevent.h"
|
|
|
|
|
+#include "qjsonobject.h"
|
|
|
|
|
+
|
|
|
|
|
+#include <QTimer>
|
|
|
|
|
+
|
|
|
|
|
+#include <QGuiApplication>
|
|
|
|
|
+#include <QJsonDocument>
|
|
|
|
|
+#include <QProcess>
|
|
|
|
|
+#include <QRect>
|
|
|
|
|
+#include <QScreen>
|
|
|
|
|
+#include <QTemporaryFile>
|
|
|
|
|
+#include <QWebSocket>
|
|
|
|
|
+
|
|
|
|
|
+#include <api/processapi.h>
|
|
|
|
|
+
|
|
|
|
|
+WebSocketClient::WebSocketClient(const QUrl &url, QObject *parent)
|
|
|
|
|
+ : QObject(parent)
|
|
|
|
|
+ , retryTimer(new QTimer(this))
|
|
|
|
|
+ , socket(new QWebSocket())
|
|
|
|
|
+ , m_url(url)
|
|
|
|
|
+{
|
|
|
|
|
+ connect(socket, &QWebSocket::connected, this, &WebSocketClient::onConnected);
|
|
|
|
|
+ connect(socket, &QWebSocket::disconnected, this, &WebSocketClient::onDisconnected);
|
|
|
|
|
+ connect(socket,
|
|
|
|
|
+ QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
|
|
|
|
|
+ this,
|
|
|
|
|
+ &WebSocketClient::onError);
|
|
|
|
|
+ connect(socket, &QWebSocket::textMessageReceived, this, &WebSocketClient::onTextMessageReceived);
|
|
|
|
|
+
|
|
|
|
|
+ connect(retryTimer, &QTimer::timeout, this, &WebSocketClient::retryConnect);
|
|
|
|
|
+
|
|
|
|
|
+ retryTimer->setInterval(1000); // 重试间隔,单位毫秒
|
|
|
|
|
+
|
|
|
|
|
+ // retryTimer->start();
|
|
|
|
|
+ connectToServer();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+WebSocketClient *WebSocketClient::getInstance()
|
|
|
|
|
+{
|
|
|
|
|
+ // d->jsonConfig.insert("serverIP", "127.0.0.1");
|
|
|
|
|
+ // d->jsonConfig.insert("serverPort", "8080");
|
|
|
|
|
+ // d->jsonConfig.insert("webSocketIP", "127.0.0.1");
|
|
|
|
|
+ // d->jsonConfig.insert("webSocketPort", "8081");
|
|
|
|
|
+
|
|
|
|
|
+ AppEvent *appEvent = AppEvent::instance();
|
|
|
|
|
+
|
|
|
|
|
+ const QString ip = "ver.stem993.cn";
|
|
|
|
|
+ const int port = 80;
|
|
|
|
|
+ qDebug() << appEvent->machineCode();
|
|
|
|
|
+ // 使用静态局部变量确保单例实例的延迟初始化
|
|
|
|
|
+ static WebSocketClient instance(
|
|
|
|
|
+ QUrl(QString("ws://%1:%2/ws/%3").arg(ip).arg(port).arg(appEvent->machineCode())));
|
|
|
|
|
+ return &instance;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void WebSocketClient::sendTextMessage(const QString &message)
|
|
|
|
|
+{
|
|
|
|
|
+ if (socket) {
|
|
|
|
|
+ socket->sendTextMessage(message);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void WebSocketClient::onConnected()
|
|
|
|
|
+{
|
|
|
|
|
+ AppEvent::instance()->serverLink(true);
|
|
|
|
|
+ retryTimer->stop();
|
|
|
|
|
+ qDebug() << "WebSocket connected";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void WebSocketClient::onDisconnected()
|
|
|
|
|
+{
|
|
|
|
|
+ AppEvent::instance()->serverLink(false);
|
|
|
|
|
+ qDebug() << "WebSocket disconnected";
|
|
|
|
|
+ retryTimer->start();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void WebSocketClient::onError(QAbstractSocket::SocketError error)
|
|
|
|
|
+{
|
|
|
|
|
+ qDebug() << error;
|
|
|
|
|
+ retryTimer->start();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void WebSocketClient::onTextMessageReceived(const QString &message)
|
|
|
|
|
+{
|
|
|
|
|
+ qDebug() << "Message received:" << message;
|
|
|
|
|
+
|
|
|
|
|
+ QJsonParseError jsonError;
|
|
|
|
|
+ QJsonDocument jsonDoc = QJsonDocument::fromJson(message.toUtf8(), &jsonError);
|
|
|
|
|
+ if (jsonError.error != QJsonParseError::NoError) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ QJsonObject object = jsonDoc.object();
|
|
|
|
|
+ QJsonObject data = object["data"].toObject();
|
|
|
|
|
+ const QString request = data["OperateCode"].toString();
|
|
|
|
|
+ const QString OperateData = data["OperateData"].toString(); // 操作方式
|
|
|
|
|
+
|
|
|
|
|
+ QJsonObject OperateObject;
|
|
|
|
|
+ QJsonDocument OperateDataDoc = QJsonDocument::fromJson(OperateData.toUtf8(), &jsonError);
|
|
|
|
|
+ if (jsonError.error == QJsonParseError::NoError) {
|
|
|
|
|
+ OperateObject = OperateDataDoc.object();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (request == "screenshot") { // 截图
|
|
|
|
|
+ if (!OperateObject.isEmpty()) {
|
|
|
|
|
+ // 可以考虑添加范围
|
|
|
|
|
+ }
|
|
|
|
|
+ QTemporaryFile tempFile("tempfile_XXXXXX.png");
|
|
|
|
|
+ tempFile.setAutoRemove(true);
|
|
|
|
|
+ tempFile.open();
|
|
|
|
|
+ AppEvent::captureDesktop(&tempFile, "PNG");
|
|
|
|
|
+
|
|
|
|
|
+ //qDebug() << "发送截图" << tempFile.fileName();
|
|
|
|
|
+
|
|
|
|
|
+ TC::ProcessImageApi processImageApi;
|
|
|
|
|
+ qDebug() << "发送截图" << processImageApi.post({tempFile.fileName()});
|
|
|
|
|
+ tempFile.close();
|
|
|
|
|
+ qDebug() << "发送截图" << tempFile.remove() << tempFile.errorString();
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void WebSocketClient::retryConnect()
|
|
|
|
|
+{
|
|
|
|
|
+ // 重试连接
|
|
|
|
|
+ connectToServer();
|
|
|
|
|
+ // qDebug() << "retryConnect" << "------------";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void WebSocketClient::connectToServer()
|
|
|
|
|
+{
|
|
|
|
|
+ socket->open(m_url);
|
|
|
|
|
+ // qDebug() << "--------" << m_url;
|
|
|
|
|
+}
|