3.8 KiB
2026-06-06 — Полевой тест и финальная проверка ELM
Контекст
Выезд к машине. Приложение показывает "No ELM", хотя сторонние приложения (Torque, Car Scanner) подключаются нормально.
Найденные баги (и их исправления)
1. 🔴 КРИТИЧЕСКИЙ: checkDevice() не вызывал connectAndInit()
Файл: ElmChecker.kt:69
Симптом: Кнопка "🔌 ELM" показывала ❌ ELM не отвечает
Причина: В ходе рефакторинга checkDevice() был вынесен как отдельный метод, но вызов connectAndInit() был убран. AT-команды слались в никуда — BT-сокет не открывался.
Исправление: Вернул if (!connectAndInit()) return null в начало checkDevice().
Коммит: 6a33048
2. 🟡 connect() не идемпотентный
Файл: ElmChecker.kt:189
Проблема: Повторный вызов connect() пытался открыть новый сокет поверх уже открытого → IOException.
Исправление: Добавлена проверка if (socket?.isConnected == true) return в начале connect().
Коммит: 739afa9
3. 🟡 run() — двойной connect
Файл: ElmChecker.kt:133
Проблема: run() вызывал connectAndInit(), затем checkDevice() тоже вызывал connectAndInit() → двойное подключение.
Исправление: Убрал connectAndInit() из run(), так как checkDevice() сам подключается.
Статус: run() сейчас не используется в продакшене (UI вызывает методы по отдельности), но исправлен на будущее.
Коммит: 739afa9
Архитектура вызовов (финальная)
Три пути в UI:
Путь 1: 🔌 ELM → 🚗 ЭБУ
checkElm() → findElmDevice() → ElmChecker(dev, bt).checkDevice()
→ connectAndInit() → connect() → elm.init()
→ ATI, AT@1, AT@2, ATDP, ATRV, ATAT1
→ возвращает DeviceInfo
→ checker сохранён в elmChecker (сокет НЕ закрыт)
checkEcu() → elmChecker.checkEcu()
→ send("0100"), send("0902")
→ возвращает EcuData
→ сокет остаётся открытым (GC закроет)
Путь 2: ⚠️ DTC
scanDtc() → findElmDevice() → NEW ElmChecker(dev, bt).scanDtc()
→ connectAndInit() → connect() → elm.init()
→ send("03"), send("07") → parseDtcCodes()
→ disconnect() ← сокет ЗАКРЫВАЕТСЯ
→ возвращает List<String>
Путь 3: run() (не используется)
run() → checkDevice() → connectAndInit() → ... → checkEcu() → disconnect()
Текущее состояние
- Версия: v0.42.0-dev
- APK: https://obdai.ru/elmer.apk
- BT permissions: Android 12+ запрашиваются в onCreate()
- Сервер: работает, ping ОК
- Тесты: 133 шт (118 pass, 1 expected fail SQLite)
Не исправлено (потенциальные проблемы)
- После 🔌ELM → 🚗ЭБУ сокет не закрывается. Если потом нажать ⚠️DTC, создаётся второй сокет к тому же устройству. Некоторые ELM-клоны не держат два соединения.
- Нет таймаута на
checkElm()— если ELM завис, поток висит бесконечно.