104 lines
5.5 KiB
Markdown
104 lines
5.5 KiB
Markdown
# Сессия 2026-05-27 — домен obdai.ru, стратегия деплоя, исследование ELM/BT
|
|
|
|
## Домен
|
|
|
|
- `obdai.ru` — куплен, DNS-зона в ngcloud (PowerDNS)
|
|
- NS: `ns5.rcloud.ru` / `ns4.rcloud.ru` (у регистратора сменили с reg.ru)
|
|
- A-записи: `@`, `www`, `ai`, `test` → `5.172.178.213`
|
|
- Ждём propagation (TTL старой зоны 86400)
|
|
|
|
## Решение: obdai.ru пока НЕ деплоим
|
|
|
|
### Причина
|
|
|
|
Главная задача сейчас — **стабильный обмен ELM327↔Android**. Пока это звено не отлажено на 100%, деплой на ВМ и домен не дают никакой ценности:
|
|
|
|
- В машине телефон на одном WiFi с ноутбуком — локальный IP быстрее и надёжнее
|
|
- Клиент уже принимает URL сервера как параметр — сменить на `obdai.ru` = одна строка
|
|
- DNS ещё не пророс
|
|
|
|
### Порядок приоритетов
|
|
|
|
1. **Стабильный обмен ELM↔Android** — критический путь, уже выявлено 4+ багов
|
|
2. **Fat-client протокол** (скрипт + батч) — обкатать на реальном ELM
|
|
3. **Gunicorn + nginx на ВМ** — только после пунктов 1-2
|
|
4. **Переключение клиента на `obdai.ru`** — последний шаг, одна строка
|
|
|
|
### Состояние звена ELM↔Android
|
|
|
|
| Баг | Статус |
|
|
|-----|--------|
|
|
| Сервер шлёт команды без пауз → ELM не успевает | ⚠️ не решён |
|
|
| `\r` vs `\r\n` → мусор в буфере | ✅ исправлено |
|
|
| Deadlock при старте (ELM не шлёт приветствие) | ✅ исправлено (fwd READY) |
|
|
| Android блокирует HTTP (cleartext) | ✅ исправлено (usesCleartextTraffic) |
|
|
|
|
### Архитектура деплоя (в будущем)
|
|
|
|
```
|
|
obdai.ru (95.172.178.213)
|
|
├── nginx (reverse proxy + SSL)
|
|
│ ├── / → лендинг (статический HTML)
|
|
│ ├── /static/app.apk → APK для скачивания
|
|
│ └── /api/v1/* → gunicorn (Flask)
|
|
│ ├── /script → выдача скрипта диагностики
|
|
│ └── /session/upload → приём батча + LLM
|
|
└── gunicorn (web/app.py)
|
|
├── script_endpoint (fat-client)
|
|
└── возможно raw_endpoint (опционально)
|
|
```
|
|
|
|
### Что НЕ переносится на ВМ
|
|
|
|
- Десктоп-диагностика (`POST /api/diagnose`, `ELM327.elm.py`) — требует Bluetooth на ноутбуке в машине
|
|
- Локальный Flask для тестов — остаётся на ноутбуке разработчика
|
|
|
|
---
|
|
|
|
## 11:00-15:00 — Исследование ELM327/BT: 19 проектов
|
|
|
|
### Найдено и изучено
|
|
|
|
| Тип | Кол-во | Лучший |
|
|
|-----|--------|--------|
|
|
| ELM→LLM проекты | 5 | OBD-Droid (Wal33D) |
|
|
| Традиционные OBD2 Android | 14 | **AndrOBD** (1993⭐) |
|
|
|
|
### Ключевой результат: AndrOBD — золотой стандарт
|
|
|
|
Изучен **сырой исходный код**. Выписаны все паттерны в `doc/elm-reference.md` (1100+ строк).
|
|
|
|
**Критические находки, которых не было в нашем коде:**
|
|
1. `Thread.sleep(500)` после BT connect — без этого Android теряет данные
|
|
2. Fallback RFCOMM channel 1 через reflection (для китайских клонов)
|
|
3. Адаптивный таймаут: 200мс ± 4мс, диапазон 12-1000мс
|
|
4. ATST меняется на лету
|
|
5. Побайтовое чтение с паузой 1мс (не readLine!)
|
|
6. `>` — НЕ спецсигнал, а разделитель строк как CR/LF
|
|
7. Мульти-фрейм ISO-TP с префиксом длины
|
|
8. Полная обработка ошибок: SEARCHING, NO DATA, BUS ERROR, UNABLE, DATA ERROR
|
|
9. Инициализация: ATSP→ATAT→ATS0→ATL0→ATE0 (без ATZ при каждом подключении)
|
|
|
|
### Созданные документы
|
|
|
|
| Файл | Содержание |
|
|
|------|-----------|
|
|
| `doc/elm-reference.md` | 1100+ строк: паттерны 19 проектов + сырой код AndrOBD |
|
|
| `doc/competitors.md` | 7 конкурентов, русских 0 |
|
|
| `elmer/elm_proto.py` | ❌ Переусложнён (написан до изучения AndrOBD) |
|
|
| `tools/mock_elm327_v2.py` | ❌ Требует доработки под реальные паттерны |
|
|
|
|
### План: переписать ELM-слой по AndrOBD
|
|
|
|
**Шаг 1 — СЕЙЧАС:** Переписать `elmer/elm_proto.py` — эталонный Python-референс.
|
|
**Шаг 2 — ЗАВТРА:** Перенести в `ScriptRunnerService.kt` (Kotlin).
|
|
**Шаг 3:** Тест на Mock ELM327 v2.
|
|
**Шаг 4:** Выезд к Фаэтону.
|
|
|
|
### Что НЕ делаем сейчас (приоритеты)
|
|
|
|
| P0 | Стабильный ELM↔Android | 🔴 сейчас |
|
|
| P1 | ScriptRunner v2 + Mock v2 | 🟡 завтра |
|
|
| P2 | Трёхфазный флоу, жалобы водителя | 🟢 потом |
|
|
| P3 | LLM-промпты, cross-val, DTC-база | 🔵 потом |
|