88 lines
3.5 KiB
C++
88 lines
3.5 KiB
C++
#include "WifiAdbConnector.h"
|
|
|
|
#include <QThread>
|
|
#include <QHash>
|
|
#include <QSettings>
|
|
#include <QDebug>
|
|
|
|
#include "adb/AdbUtils.h"
|
|
#include "dao/WifiConnectionDAO.h"
|
|
|
|
WifiAdbConnector::WifiAdbConnector(QObject *parent) : QObject(parent) {
|
|
const QSettings settings("config.ini", QSettings::IniFormat);
|
|
m_intervalSecs = settings.value("wifi_adb/reconnectIntervalSecs", 30).toInt();
|
|
if (m_intervalSecs < 5) m_intervalSecs = 5;
|
|
}
|
|
|
|
void WifiAdbConnector::start() {
|
|
qDebug() << "[WifiAdbConnector] started, interval" << m_intervalSecs << "s";
|
|
while (m_running) {
|
|
reconnectCycle();
|
|
// Спим интервал посекундно, чтобы stop() срабатывал быстро.
|
|
for (int i = 0; i < m_intervalSecs && m_running; ++i) {
|
|
QThread::msleep(1000);
|
|
}
|
|
}
|
|
emit finished();
|
|
}
|
|
|
|
void WifiAdbConnector::stop() {
|
|
m_running = false;
|
|
}
|
|
|
|
void WifiAdbConnector::reconnectCycle() {
|
|
const QList<WifiConnection> records = WifiConnectionDAO::getAll();
|
|
if (records.isEmpty()) {
|
|
return;
|
|
}
|
|
|
|
// Текущее состояние adb: endpoint → status.
|
|
QHash<QString, QString> status;
|
|
for (const auto &[serial, st] : AdbUtils::getListDevices()) {
|
|
status.insert(serial, st);
|
|
}
|
|
|
|
for (const WifiConnection &wc : records) {
|
|
if (!m_running) break;
|
|
if (wc.ip.isEmpty() || wc.port <= 0) continue;
|
|
|
|
const QString endpoint = wc.ip + ":" + QString::number(wc.port);
|
|
const QString st = status.value(endpoint);
|
|
if (st == "device") {
|
|
continue; // живо — не трогаем (не рвём связь работающего устройства)
|
|
}
|
|
if (st == "offline") {
|
|
// Частый случай при слабом Wi-Fi — пересоздаём соединение.
|
|
AdbUtils::adbDisconnect(endpoint);
|
|
}
|
|
|
|
// Пытаемся подключиться по сохранённому порту.
|
|
QString ep = AdbUtils::adbConnect(wc.ip, wc.port);
|
|
if (ep.isEmpty()) {
|
|
// Порт мог смениться (тоггл/ребут wireless debugging). Сначала mDNS…
|
|
if (const QString mep = AdbUtils::mdnsFindConnect(wc.ip); !mep.isEmpty()) {
|
|
const int c = mep.lastIndexOf(':');
|
|
ep = AdbUtils::adbConnect(mep.left(c), mep.mid(c + 1).toInt());
|
|
}
|
|
}
|
|
if (ep.isEmpty()) {
|
|
// …mDNS пуст (сеть режет мультикаст) — скан-fallback: ищем новый порт
|
|
// перебором (pairing сохранён, код не нужен). Тяжело, но только для
|
|
// реально отвалившихся устройств.
|
|
ep = AdbUtils::scanFindConnect(wc.ip);
|
|
}
|
|
if (ep.isEmpty()) {
|
|
continue; // не нашли — попробуем в следующем цикле
|
|
}
|
|
// Подключились. Если эндпоинт сменился — обновляем реестр (порт), сохраняя код.
|
|
const int c = ep.lastIndexOf(':');
|
|
const QString newIp = ep.left(c);
|
|
const int newPort = ep.mid(c + 1).toInt();
|
|
if (newIp != wc.ip || newPort != wc.port) {
|
|
WifiConnectionDAO::upsert(wc.androidId, newIp, newPort);
|
|
qDebug() << "[WifiAdbConnector] endpoint updated for" << wc.androidId
|
|
<< "→" << ep;
|
|
}
|
|
}
|
|
}
|