874dd969b6
- NVS-Flash (4MB) durch SD-Karte via SDMMC ersetzt - GPIO: SD_CMD=2, SD_CLK=6, SD_D0=7, SD_CS=23 - CSV-Ausgabe mit Rohdaten-Hex: timestamp, msg_type, channel, RSSI, MAC, raw_hex - Channel-Hopping über alle 10 V2X-Kanäle (5845-5925 MHz) - CSV-Auto-Rotation bei >50MB - v2x_log.txt mit periodischen Statistiken - Frame Queue (64 Frames) zwischen Promisc-CB und Writer Task - Kanal-Hopper, Stats-Task, Frame-Writer als eigene Tasks - README mit SD-Vorbereitung und Analyse-Hinweisen
150 lines
3.5 KiB
Markdown
150 lines
3.5 KiB
Markdown
# V2X-Sniffer Firmware — SD-Karte Speicherung
|
|
|
|
## Übersicht
|
|
|
|
Die Firmware speichert V2X-Daten (BSM, CAM, DENM) **komplett autonom** auf einer SD-Karte im ESP32-C5.
|
|
Kein Host-PC ist erforderlich.
|
|
|
|
### Was wurde geändert?
|
|
|
|
| Alt | Neu |
|
|
|-----|-----|
|
|
| NVS-Flash (4 MB, begrenzt) | SD-Karte via SDMMC (FAT32, unbegrenzt) |
|
|
| Keine Rohdatenspeicherung | CSV mit Rohdaten (Hex) pro Frame |
|
|
| Manuell / interaktiv | Komplett autonom, channel-hopping |
|
|
| C++ Lambda in C-Code (Bug) | Korrekter C-Code mit Queue |
|
|
|
|
## Hardware
|
|
|
|
**T-Dongle-C5** mit SD-Karte (FAT32 formatiert)
|
|
|
|
### SD-Karte Pinbelegung (ESP32-C5 native SDMMC)
|
|
|
|
| Signal | GPIO |
|
|
|--------|------|
|
|
| SD_CMD | GPIO 2 |
|
|
| SD_CLK | GPIO 6 |
|
|
| SD_D0 | GPIO 7 |
|
|
| SD_CS | GPIO 23 |
|
|
|
|
### SD-Karte vorbereiten
|
|
|
|
```bash
|
|
# Auf dem Host: SD-Karte mit FAT32 formatieren
|
|
mkfs.fat -F 32 /dev/mmcblk0 # Linux
|
|
diskutil eraseDisk FAT32 V2X /dev/disk2 # macOS
|
|
format /dev/sdX /FS:FAT32 /Q # Windows
|
|
|
|
# Oder direkt auf dem ESP nach Boot:
|
|
# Die Firmware formatiert automatisch falls nötig
|
|
```
|
|
|
|
## Ausgabe
|
|
|
|
### v2x_frames.csv
|
|
|
|
Jeder gefangene Frame als eine Zeile CSV:
|
|
|
|
```csv
|
|
timestamp_us,msg_type,channel,frequency_mhz,rssi_dbm,noise_dbm,rate_index,frame_len,mac_addr,bssid,raw_hex
|
|
1715234567890,2,157,5845.0,-45,-92,8,314,AA:BB:CC:DD:EE:FF,11:22:33:44:55:66,AABBCCDD...
|
|
```
|
|
|
|
**Spalten:**
|
|
| Spalte | Beschreibung |
|
|
|--------|-------------|
|
|
| timestamp_us | Mikrosekunden seit Systemstart |
|
|
| msg_type | 1=BSM, 2=CAM, 3=DENM, 0=Unknown |
|
|
| channel | Kanal (157-164, 17, 18) |
|
|
| frequency_mhz | Frequenz in MHz (5845-5925 oder 4300) |
|
|
| rssi_dbm | Empfangsleistung |
|
|
| noise_dbm | Rauschleistung |
|
|
| rate_index | Datenraten-Index (802.11p) |
|
|
| frame_len | Paketlänge in Bytes |
|
|
| mac_addr | MAC-Adresse des Absenders |
|
|
| bssid | BSSID der Basisstation |
|
|
| raw_hex | Rohdaten als Hex-String |
|
|
|
|
### v2x_log.txt
|
|
|
|
System-Log mit:
|
|
- Start-Zeitstempel
|
|
- Periodischen Statistiken (alle 60 Sekunden)
|
|
- Fehlermeldungen
|
|
- CSV-Rotation-Ereignissen
|
|
|
|
### CSV-Rotation
|
|
|
|
Wenn die CSV-Datei > 50 MB erreicht, wird sie automatisch umbenannt:
|
|
```
|
|
v2x_frames_20260509_143022.csv
|
|
```
|
|
und eine neue leere CSV mit Header erstellt.
|
|
|
|
## Kanal-Hopping
|
|
|
|
Die Firmware wechselt alle 30 Sekunden durch alle V2X-Kanäle:
|
|
```
|
|
5845, 5855, 5865, 5875, 5885, 5895, 5905, 5915, 5925, 4300 MHz
|
|
```
|
|
|
|
## Datenanalyse
|
|
|
|
### Auf dem PC öffnen
|
|
|
|
```bash
|
|
# CSV auf SD-Karte kopieren
|
|
cp /media/user/V2X/v2x_frames.csv ./v2x_frames.csv
|
|
|
|
# Mit Python analysieren
|
|
python3 -c "
|
|
import csv, pandas as pd
|
|
df = pd.read_csv('v2x_frames.csv')
|
|
print(df.head())
|
|
print(df.describe())
|
|
print('Message Types:')
|
|
print(df['msg_type'].value_counts())
|
|
"
|
|
|
|
# Mit Excel/Numbers öffnen
|
|
# Direkt per Doppelklick in der SD-Karte
|
|
```
|
|
|
|
### Rohdaten dekodieren
|
|
|
|
Die `raw_hex` Spalte enthält die unveränderten V2X-PDUs (ASN.1 DER / BER-TLC).
|
|
Diese können mit einem C-ITS Decoder weiterverarbeitet werden.
|
|
|
|
## Bauen
|
|
|
|
```bash
|
|
cd v2x_fw
|
|
idf.py set-target esp32c5
|
|
idf.py build
|
|
idf.py flash monitor
|
|
```
|
|
|
|
## Betrieb
|
|
|
|
1. SD-Karte (FAT32) in Slot stecken
|
|
2. Firmware flashen
|
|
3. Gerät starten — Daten landen automatisch in `v2x_frames.csv` auf der SD-Karte
|
|
4. SD-Karte auslesen wenn benötigt
|
|
|
|
## Fehlerbehebung
|
|
|
|
**SD-Karte wird nicht erkannt:**
|
|
- FAT32 Format prüfen
|
|
- GPIO-Pins richtig verkabelt (ESP32-C5 SDMMC)
|
|
- SD-Karte ≤ 32GB (SDSC) oder ≤ 2TB (SDHC/SDXC)
|
|
|
|
**CSV-Schreibfehler:**
|
|
- SD-Karte schreibgeschützt?
|
|
- Genug freier Speicher?
|
|
- FAT32-Dateisystem korrupt?
|
|
|
|
**Keine Frames im CSV:**
|
|
- Kanal-Hopping funktioniert? (Log prüfen)
|
|
- Promiscuous Mode aktiv?
|
|
- Andere Geräte senden auf V2X-Kanälen?
|