165 lines
3.2 KiB
Markdown
165 lines
3.2 KiB
Markdown
1.1 Цель
|
||
|
||
Разработать web-интерфейс реального времени для отображения CAN-данных, собираемых edge-устройством и сохраняемых в InfluxDB.
|
||
|
||
Система должна:
|
||
|
||
отображать данные в реальном времени,
|
||
|
||
работать на одном хосте с InfluxDB,
|
||
|
||
использовать Python / Flask,
|
||
|
||
использовать WebSocket для push-обновлений,
|
||
|
||
быть расширяемой под future-аналитику.
|
||
|
||
1.2 Общая архитектура
|
||
Edge (Raspberry Pi)
|
||
→ InfluxDB (write)
|
||
→ Flask Backend (read + stream)
|
||
→ Web UI (WebSocket)
|
||
|
||
|
||
InfluxDB — единый источник истины для UI
|
||
(не читаем данные напрямую с Edge).
|
||
|
||
1.3 Компоненты системы
|
||
1.3.1 Backend (Flask)
|
||
|
||
Назначение
|
||
|
||
HTTP API
|
||
|
||
WebSocket сервер
|
||
|
||
агрегация данных из InfluxDB
|
||
|
||
доставка данных в UI
|
||
|
||
Технологии
|
||
|
||
Python 3.11+
|
||
|
||
Flask
|
||
|
||
Flask-SocketIO (или websockets + ASGI)
|
||
|
||
InfluxDB Python Client
|
||
|
||
1.3.2 InfluxDB
|
||
|
||
Роль
|
||
|
||
time-series storage
|
||
|
||
буфер между Edge и UI
|
||
|
||
исторические запросы
|
||
|
||
Типы данных
|
||
|
||
CAN frames (raw)
|
||
|
||
декодированные сигналы (future)
|
||
|
||
1.3.3 Frontend (Web UI)
|
||
|
||
Назначение
|
||
|
||
визуализация CAN-данных
|
||
|
||
real-time обновление
|
||
|
||
базовая аналитика
|
||
|
||
Минимальный стек
|
||
|
||
HTML + JS
|
||
|
||
WebSocket клиент
|
||
|
||
Chart.js / ECharts (на ваш выбор)
|
||
|
||
1.4 Функциональные требования (MVP)
|
||
1.4.1 Real-time отображение
|
||
|
||
Обновление ≤ 500 мс
|
||
|
||
Push-модель (WebSocket)
|
||
|
||
Без polling
|
||
|
||
Отображать:
|
||
|
||
timestamp
|
||
|
||
CAN interface (can0 / can1)
|
||
|
||
CAN ID
|
||
|
||
DLC
|
||
|
||
DATA (hex)
|
||
|
||
frequency (msg/sec)
|
||
|
||
1.4.2 Исторический просмотр
|
||
|
||
выбор временного окна:
|
||
|
||
last 1 min / 5 min / 1 h
|
||
|
||
график:
|
||
|
||
частота сообщений
|
||
|
||
значение байтов (raw)
|
||
|
||
1.4.3 Фильтрация (UI)
|
||
|
||
по CAN ID
|
||
|
||
по интерфейсу
|
||
|
||
включение / выключение ID
|
||
|
||
Фильтрация не влияет на ingestion, только на отображение.
|
||
|
||
1.5 Нефункциональные требования
|
||
Производительность
|
||
|
||
≥ 5–10k msg/sec без деградации UI
|
||
|
||
batch-чтение из InfluxDB
|
||
|
||
Надёжность
|
||
|
||
UI не зависит от Edge availability
|
||
|
||
UI не ломается при временном отсутствии новых данных
|
||
|
||
Безопасность (минимум)
|
||
|
||
UI доступен только из доверенной сети
|
||
|
||
без write-доступа к InfluxDB
|
||
|
||
1.6 Поток данных (важно)
|
||
Write path
|
||
Edge → InfluxDB
|
||
|
||
Read / Stream path
|
||
InfluxDB → Flask → WebSocket → Browser
|
||
|
||
|
||
❗ Flask не принимает CAN напрямую
|
||
❗ WebSocket не ходит в InfluxDB
|
||
|
||
1.7 Ограничения (осознанные)
|
||
|
||
Flask — single logical service
|
||
|
||
Без auth (на MVP)
|
||
|
||
Без декодирования DBC (пока raw) |