From 97aaabeb657b7f81b6f4dee6c145c7b09eeff084 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 20 Aug 2026 01:41:43 +0300 Subject: [PATCH] =?UTF-8?q?fix(app-glasses):=20=D0=BD=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B5=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BD=D0=B0?= =?UTF-8?q?=20fallback=2010.0.2.2=20=E2=80=94=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D1=82=D0=B5=D0=BB=D0=B5=D1=84?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Если при старте очков телефон недоступен, discoverPhoneUrl возвращал fallback (эмуляторный 10.0.2.2), он запоминался как lastUrl — очки вечно реконнектили туда. Теперь на устройстве fallback не используется: не нашли — повторный поиск через 3с (connectLoop рекурсивно). На эмуляторе fallback остался. Железо: очки сами нашли телефон после его включения. --- .../binom/viewmate/glasses/HostConnection.kt | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/HostConnection.kt b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/HostConnection.kt index 9d798ac..99cd07a 100644 --- a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/HostConnection.kt +++ b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/HostConnection.kt @@ -94,13 +94,21 @@ class HostConnection( /** * Первое подключение: mDNS-дискавери телефона (до 15с на устройстве, 3с на - * эмуляторе), найденный адрес — в приоритете, иначе scan /24 (план Б), - * иначе fallback (эмуляторный 10.0.2.2). Внутри [GlassesWsClient.connect] - * живёт бесконечный реконнект с тем же адресом (переиспользование последнего - * найденного); при его отсутствии — повторный mDNS-цикл. + * эмуляторе), найденный адрес — в приоритете, иначе scan /24 (план Б). + * Fallback на эмуляторный 10.0.2.2 только на эмуляторе; на устройстве при + * пустом адресе — повторный поиск через 3с (lastUrl не запоминается). + * Внутри [GlassesWsClient.connect] живёт бесконечный реконнект с тем же + * адресом (переиспользование последнего найденного); при его отсутствии — + * повторный mDNS-цикл. */ private suspend fun connectLoop() { val url = lastUrl ?: discoverPhoneUrl() + if (url.isEmpty()) { + log("app", "телефон не найден — повтор поиска через 3с") + delay(3_000) + connectLoop() + return + } lastUrl = url log("app", "подключаюсь к $url") @@ -130,9 +138,10 @@ class HostConnection( } /** - * Цепочка поиска адреса телефона: mDNS → scan /24 (план Б) → fallback. - * На эмуляторе scan пропускается (телефона в эмуляторной /24 нет, а fallback - * на 10.0.2.2 должен наступать быстро). + * Цепочка поиска адреса телефона: mDNS → scan /24 (план Б). + * На эмуляторе scan пропускается (телефона в эмуляторной /24 нет) и сразу + * наступает fallback на 10.0.2.2. На устройстве fallback запрещён — при + * неудачном поиске возвращается пустой адрес (повторный поиск в [connectLoop]). */ private suspend fun discoverPhoneUrl(): String { val found = discovery.findPhoneIp(timeoutMs = MdnsClient.mdnsTimeoutMs(isEmulator())) @@ -150,8 +159,12 @@ class HostConnection( log("app", "нет локального IPv4 — scan /24 пропущен") } } - log("app", "mDNS и scan не нашли телефон — fallback на $fallbackUrl") - return fallbackUrl + if (isEmulator()) { + log("app", "эмулятор — fallback на $fallbackUrl") + return fallbackUrl + } + log("app", "mDNS и scan не нашли телефон — повтор поиска через 3с") + return "" } /** Отправка сообщения на телефон (используется менеджером скачивания). */