Files
elmer/doc/architecture.md
T

3.5 KiB

Архитектура Elmer (2026-05-25)

Принцип: тонкий клиент

Клиент ничего не знает о диагнозе. Только транспорт:

ELM327 ←Bluetooth SPP→ Android Client ←HTTP JSON→ Сервер ←API→ DeepSeek

Режимы работы клиента

Режим «опрос» (основной)

Клиент сам читает VIN + DTC + PID'ы, шлёт готовый JSON серверу. Быстро: один HTTP-запрос на сессию.

Режим «ретранслятор» (расширенный)

Сервер шлёт сырые AT-команды, клиент пересылает ответ. Медленно (каждый PID — HTTP round-trip), но клиент вообще ничего не знает об OBD2.

Универсальность

  • Пользователь вводит URL сервера (или наш по умолчанию)
  • Протокол HTTP/JSON документирован
  • Любой backend может работать с этим клиентом

Десктоп (Windows/Linux)

Браузер (Chrome) → локальный Flask → pyserial → ELM327
  • Отдельного «приложения» для Windows не нужно
  • web/app.py — и тестовый UI, и прототип сервера
  • Chrome на Android НЕ может: Web Bluetooth API только BLE, Web Serial API не поддерживается

Открытость и доверие

Что Где Зачем
Клиент (Android) GitHub (открытый) Доверие — любой может проверить код, собрать сам
Сервер (Python) Gitea (закрытый) API-ключи, логика, коммерческая часть
Публикация RuStore Бесплатно, модерация = дополнительное доверие

Git-стратегия

  • gitea.services.ngcloud.ru/Nail/elmer — разработка сервера (текущий репо)
  • github.com/Nail/elmer-android — клиент (будет создан), лицензия MIT
  • Серверный репо на GitHub НЕ публикуем

База данных

SQLite (MVP)

cars               — VIN, марка, модель, год, двигатель
diagnostic_tokens  — id (PK), car_id (FK), created_at
llm_messages       — token_id (FK), role, content, timestamp
ecu_parameters     — token_id (FK), pid_code, value, unit, timestamp
dtc_codes          — token_id (FK), code, description, status

PostgreSQL (production)

Та же схема, миграция при переходе к production-серверу.

API (прототип)

POST /api/diagnose

// Request (от клиента)
{
  "vin": "WVWZZZ1KZAW123456",
  "dtc_codes": [{"code": "P0301", "status": "stored"}],
  "parameters": [{"pid_code": "0105", "name": "coolant_temp", "value": 85.0, "unit": "°C"}]
}

// Response (от сервера)
{
  "diagnosis": "## Краткий диагноз\n...",
  "token_id": 42
}

Безопасность

  • Permissions Android: только BLUETOOTH + INTERNET
  • Никаких SMS/контактов/файлов/звонков
  • Пользователь видит permissions ДО установки (RuStore и sideload)
  • Модерация RuStore — базовая проверка на вредоносный код