137 lines
3.4 KiB
Markdown
137 lines
3.4 KiB
Markdown
# OBD-II ECU Simulator für SocketCAN
|
||
|
||
Dieses Projekt simuliert ein OBD-II Steuergerät (ECU) über SocketCAN auf Linux.
|
||
Es eignet sich, um Embedded-Hardware (z. B. den Kettenöler) zu testen, ohne ein echtes Fahrzeug anschließen zu müssen.
|
||
|
||
## Features
|
||
|
||
- **OBD-II Responder (11-bit IDs, ISO 15765-4)**
|
||
- Unterstützt Mode 01 / PID `0x0D` (Geschwindigkeit)
|
||
- Unterstützt Mode 01 / PID `0x0C` (Motordrehzahl)
|
||
|
||
- **Tkinter-GUI**
|
||
- Gangwahl (N/0 – 6)
|
||
- Gasregler (0–100 %)
|
||
- Anzeige von Geschwindigkeit & Drehzahl (berechnet über einfaches Antriebsmodell)
|
||
- CAN-Interface Auswahl, Bitrate, Timeout, RESP-ID
|
||
- Link-Up/Down Steuerung direkt in der GUI
|
||
- Settings in `settings.json` speicherbar
|
||
- **Trace-Fenster**: ähnlich CANalyzer Light
|
||
- Stream-Modus (alle Frames)
|
||
- Aggregat-Modus (eine Zeile pro ID+Richtung)
|
||
|
||
- **Robust gegen Interface-Down/Up**
|
||
- Erkennt automatisch, wenn `can0` (oder anderes IF) Down geht
|
||
- Öffnet Bus neu, sobald wieder Up
|
||
|
||
## Voraussetzungen
|
||
|
||
- Linux mit SocketCAN Support
|
||
- Python ≥ 3.10
|
||
- Pakete:
|
||
```bash
|
||
pip install -r requirements.txt
|
||
````
|
||
|
||
(enthält `python-can`, `pyroute2`, `typing_extensions`, `wrapt`, `packaging`)
|
||
|
||
* Ein CAN-Interface (z. B. [CANable](https://canable.io/), `gs_usb`, Peak, vcan)
|
||
|
||
## Installation & Start
|
||
|
||
```bash
|
||
git clone <repo>
|
||
cd Kettenöler-Testsoftware
|
||
python -m venv .venv
|
||
source .venv/bin/activate
|
||
pip install -r requirements.txt
|
||
./start.sh
|
||
```
|
||
|
||
Das GUI startet und öffnet automatisch den Responder.
|
||
Über die Buttons „Link UP/DOWN“ kann das CAN-Interface hoch-/runtergefahren werden.
|
||
|
||
## Rechte / Berechtigungen
|
||
|
||
Um CAN-Links ohne `sudo` hoch/runter zu setzen, benötigt der Python-Interpreter die Capability `CAP_NET_ADMIN`:
|
||
|
||
```bash
|
||
sudo setcap cap_net_admin,cap_net_raw=eip "$(readlink -f .venv/bin/python)"
|
||
getcap "$(readlink -f .venv/bin/python)"
|
||
```
|
||
|
||
Alternativ: App mit `sudo ./start.sh` starten.
|
||
|
||
## Nutzung
|
||
|
||
1. **Interface vorbereiten**
|
||
Klassisches CAN-Interface:
|
||
|
||
```bash
|
||
sudo ip link set can0 down
|
||
sudo ip link set can0 type can bitrate 500000
|
||
sudo ip link set can0 up
|
||
```
|
||
|
||
Virtuelles Interface (nur Softwaretests):
|
||
|
||
```bash
|
||
sudo modprobe vcan
|
||
sudo ip link add dev vcan0 type vcan
|
||
sudo ip link set vcan0 up
|
||
```
|
||
|
||
2. **Simulator starten**
|
||
GUI öffnen (`./start.sh`).
|
||
|
||
3. **Test mit can-utils**
|
||
Terminal 1:
|
||
|
||
```bash
|
||
candump can0
|
||
```
|
||
|
||
Terminal 2: Anfrage nach Geschwindigkeit:
|
||
|
||
```bash
|
||
cansend can0 7DF#02010D0000000000
|
||
```
|
||
|
||
Erwartung:
|
||
|
||
* Request `7DF`
|
||
* Response `7E8` mit `03 41 0D <speed>`
|
||
|
||
Anfrage nach Drehzahl:
|
||
|
||
```bash
|
||
cansend can0 7DF#02010C0000000000
|
||
```
|
||
|
||
4. **Trace im GUI**
|
||
|
||
* „Stream“: zeigt alle Frames einzeln
|
||
* „Aggregate“: fasst pro CAN-ID zusammen (Count, Last Data)
|
||
|
||
## Projektstruktur
|
||
|
||
```
|
||
main.py – Startpunkt
|
||
app/
|
||
├─ gui.py – Tkinter GUI
|
||
├─ can.py – CAN-Responder + Link-Control (pyroute2)
|
||
├─ simulator.py – Physikmodell (Gang + Gas → Geschwindigkeit/RPM)
|
||
└─ config.py – Settings + Logging
|
||
settings.json – Konfigurationsdatei (wird beim Speichern erzeugt)
|
||
```
|
||
|
||
## Bekannte Einschränkungen
|
||
|
||
* Nur wenige PIDs implementiert (0x0C, 0x0D).
|
||
* Antwort immer mit fixer DLC=8.
|
||
* Einfaches Driveline-Modell (keine realistische Fahrzeugphysik).
|
||
* Trace-Fenster ist eine Light-Variante, kein vollwertiger CANalyzer.
|
||
|
||
## Lizenz
|
||
|
||
\[MIT] oder \[GPLv3] – bitte je nach Projektziel eintragen. |