#include "WifiAdbConnector.h" #include #include #include #include #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 records = WifiConnectionDAO::getAll(); if (records.isEmpty()) { return; } // Текущее состояние adb: endpoint → status. QHash 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; } } }