Add project structure
This commit is contained in:
1
.cursorignore
Normal file
1
.cursorignore
Normal file
@@ -0,0 +1 @@
|
||||
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
|
||||
55
chart.md
Normal file
55
chart.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
id: 421a4a02-025a-4ab5-8ae3-fd52e2c738f0
|
||||
---
|
||||
flowchart LR
|
||||
subgraph Vehicle["Автомобиль"]
|
||||
OBD["OBD-II"]
|
||||
CANBUS["HS-CAN\n500 kbps"]
|
||||
OBD --> CANBUS
|
||||
end
|
||||
|
||||
subgraph CANBoard["CAN-плата"]
|
||||
PHY0["CAN PHY"]
|
||||
PHY1["CAN PHY"]
|
||||
MCP0["MCP2515\ncan0"]
|
||||
MCP1["MCP2515\ncan1"]
|
||||
ISO["Isolation"]
|
||||
|
||||
CANBUS --> PHY0
|
||||
CANBUS --> PHY1
|
||||
PHY0 --> MCP0
|
||||
PHY1 --> MCP1
|
||||
MCP0 --> ISO
|
||||
MCP1 --> ISO
|
||||
end
|
||||
|
||||
subgraph Edge["Raspberry Pi 5 (Edge)"]
|
||||
SPI["SPI"]
|
||||
SocketCAN["SocketCAN\nlisten-only"]
|
||||
EdgeApp["Edge CAN Logger"]
|
||||
LocalStore["SQLite WAL\nOffline Buffer"]
|
||||
Forwarder["Store-and-Forward"]
|
||||
|
||||
ISO --> SPI
|
||||
SPI --> SocketCAN
|
||||
SocketCAN --> EdgeApp
|
||||
EdgeApp --> LocalStore
|
||||
LocalStore --> Forwarder
|
||||
end
|
||||
|
||||
subgraph BackendHost["Backend Host"]
|
||||
Influx["InfluxDB"]
|
||||
Flask["Flask Backend"]
|
||||
WS["WebSocket Server"]
|
||||
end
|
||||
|
||||
subgraph UI["Web UI"]
|
||||
Browser["Browser"]
|
||||
Charts["Real-time Charts"]
|
||||
end
|
||||
|
||||
Forwarder --> Influx
|
||||
Influx --> Flask
|
||||
Flask --> WS
|
||||
WS --> Browser
|
||||
Browser --> Charts
|
||||
165
web/task_webui.md
Normal file
165
web/task_webui.md
Normal file
@@ -0,0 +1,165 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user