68 lines
2.7 KiB
C++
68 lines
2.7 KiB
C++
#pragma once
|
||
#include <QObject>
|
||
#include <QNetworkAccessManager>
|
||
#include <QSet>
|
||
#include <QMap>
|
||
#include <dao/DeviceDAO.h>
|
||
#include <db/DeviceInfo.h>
|
||
|
||
class DeviceScreener final : public QObject {
|
||
Q_OBJECT
|
||
|
||
public:
|
||
explicit DeviceScreener(QObject *parent = nullptr);
|
||
|
||
~DeviceScreener() override;
|
||
|
||
static constexpr qint64 kOfflineDebounceSecs = 30;
|
||
// Как часто проверять/слать кадр истории экрана на сервер логов (с дедупом).
|
||
static constexpr qint64 kMonitoringScreenIntervalSecs = 30;
|
||
|
||
public slots:
|
||
void start();
|
||
|
||
void stop();
|
||
|
||
signals:
|
||
void finished();
|
||
void firstPassDone();
|
||
void deviceWentOnline(const QString &deviceId);
|
||
void deviceWentOffline(const QString &deviceId);
|
||
|
||
private:
|
||
bool m_running = true;
|
||
bool m_firstScan = true;
|
||
QString m_urlAppUpdate;
|
||
QString m_token;
|
||
QString m_apiBase;
|
||
QNetworkAccessManager *m_manager = nullptr;
|
||
QMap<QString, qint64> m_lastApiUpdate; // deviceId → unix timestamp последнего PATCH
|
||
QSet<QString> m_onlineDevices; // дебаунс-онлайн (true online после dedup)
|
||
QMap<QString, qint64> m_offlineSince; // deviceId → когда пропал из ADB (для дебаунса)
|
||
QMap<QString, qint64> m_lastMonitoringScreen; // deviceId → unix ts последней проверки кадра для истории экрана
|
||
QMap<QString, QByteArray> m_lastSentScreenHash; // deviceId → sha256 последнего кадра, отправленного в историю экрана
|
||
|
||
static QList<QPair<QString, QString> > readAdbDevices();
|
||
|
||
static QByteArray takeScreenshot(const QString &deviceId);
|
||
|
||
static DeviceInfo readDeviceInfo(const QString &adbSerial);
|
||
|
||
void postDevicesData(const QList<DeviceInfo> &devices);
|
||
|
||
QJsonValue apiGet(const QString &path);
|
||
QJsonValue apiPost(const QString &path, const QJsonObject &body);
|
||
void apiPatch(const QString &path, const QJsonObject &body);
|
||
|
||
QString createDeviceOnApi(const DeviceInfo &device);
|
||
void updateDeviceOnApi(const DeviceInfo &device);
|
||
void postScreenshotToApi(const QString &apiId, const QByteArray &image);
|
||
|
||
// Fire-and-forget отправка кадра истории экрана на сервер логов (monitoringBase).
|
||
// Создаёт временный NetworkService в отдельном потоке (паттерн LogArchiveSender).
|
||
static void dispatchScreenshotToMonitoring(const QString &desktopId,
|
||
const QString &deviceId,
|
||
const QString &name,
|
||
const QByteArray &jpeg);
|
||
};
|