ba8477f18f
- v2x_sniffer_main.c: Haupt-Firmware mit 802.11p PHY - v2x_db.h: V2X-Datenbank Header - Makefile: ESP-IDF Build-Konfiguration - phy_11p_set() und phy_change_channel(5900) aktiv
155 lines
4.2 KiB
C
155 lines
4.2 KiB
C
/**
|
|
* V2X-Sniffer Firmware für ESP32-C5 (Lilygo T-Dongle-C5)
|
|
*
|
|
* Konfiguration:
|
|
* - phy_11p_set(1, 0) - Aktiviert 802.11p PHY
|
|
* - phy_change_channel(5900, 1, 0, 0) - Kanal 5900 MHz
|
|
* - C-ITS BSM, CAM, DENM Decodierung
|
|
* - Separate V2X-Datenbank (v2x_sniffer.db)
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "freertos/event_groups.h"
|
|
#include "esp_system.h"
|
|
#include "esp_wifi.h"
|
|
#include "esp_event.h"
|
|
#include "esp_log.h"
|
|
#include "esp_netif.h"
|
|
#include "nvs_flash.h"
|
|
#include "driver/gpio.h"
|
|
#include "esp_codec_dev.h"
|
|
|
|
/* V2X-Datenbank */
|
|
#include "v2x_db.h"
|
|
|
|
static const char *TAG = "V2X-Sniffer";
|
|
|
|
/* 802.11p V2X-Band Konfiguration */
|
|
#define V2X_FREQUENCY_MHZ 5900
|
|
#define V2X_CHANNEL_NUMBER 59
|
|
#define V2X_BANDWIDTH_MHZ 10
|
|
#define V2X_PHY_MODE 802.11p
|
|
|
|
/* BSM (Basic Safety Message) IDs */
|
|
#define BSM_ID_SPAT 0x01
|
|
#define BSM_ID_MAP 0x02
|
|
#define BSM_ID_TLMM 0x03
|
|
|
|
/* CAM (Cooperative Awareness Message) Container */
|
|
#define CAM_CONTAINER_TYPE 0x04
|
|
#define CAM_PROTOCOL_VERSION 2
|
|
|
|
/* DENM (Decentralized Environmental Notification Message) */
|
|
#define DENM_EVENT_TYPE 0x05
|
|
|
|
typedef struct {
|
|
uint16_t message_id;
|
|
uint8_t channel;
|
|
float frequency_mhz;
|
|
int8_t rssi_dbm;
|
|
float power_dbm;
|
|
uint32_t data_rate_bps;
|
|
uint16_t frame_len;
|
|
|
|
/* BSM/CAM spezifisch */
|
|
uint8_t msg_type; // BSM, CAM, DENM
|
|
uint8_t protocol_version;
|
|
uint64_t station_id;
|
|
int32_t lat; // in 10^-7 Grad
|
|
int32_t lon; // in 10^-7 Grad
|
|
int16_t alt; // in dm
|
|
uint8_t speed; // in 0.01 m/s
|
|
uint16_t heading; // in 0.01 Grad
|
|
int8_t acceleration; // in 0.01 m/s^2
|
|
} v2x_frame_t;
|
|
|
|
/**
|
|
* Initialisiere ESP32-C5 für 802.11p V2X
|
|
*/
|
|
esp_err_t v2x_phy_init(void) {
|
|
ESP_LOGI(TAG, "Initialisiere ESP32-C5 V2X PHY...");
|
|
|
|
/* 802.11p PHY aktivieren */
|
|
phy_11p_set(1, 0);
|
|
ESP_LOGI(TAG, "✓ 802.11p PHY aktiviert");
|
|
|
|
/* Auf Kanal 5900 MHz schalten */
|
|
phy_change_channel(5900, 1, 0, 0);
|
|
ESP_LOGI(TAG, "✓ Kanal %d (5900 MHz) aktiv", V2X_CHANNEL_NUMBER);
|
|
|
|
return ESP_OK;
|
|
}
|
|
|
|
/**
|
|
* 802.11p Frames schnüffeln
|
|
*/
|
|
void v2x_sniffer_task(void *pvParameters) {
|
|
ESP_LOGI(TAG, "V2X-Sniffer gestartet!");
|
|
|
|
while (1) {
|
|
/* Warte auf 802.11p Frames */
|
|
wifi_promiscuous_pkt_t *pkt = NULL;
|
|
|
|
/* Frame empfangen und decodieren */
|
|
if (wifi_promiscuous_get_pkt(&pkt) == ESP_OK) {
|
|
v2x_frame_t frame;
|
|
|
|
/* BSM/CAM/DENM Header decodieren */
|
|
frame.msg_type = pkt->ctrl & 0x0F;
|
|
frame.channel = V2X_CHANNEL_NUMBER;
|
|
frame.frequency_mhz = V2X_FREQUENCY_MHZ;
|
|
frame.rssi_dbm = pkt->rssi;
|
|
frame.power_dbm = pkt->power;
|
|
frame.data_rate_bps = 12000000; // 12 Mbps
|
|
frame.frame_len = pkt->len;
|
|
|
|
/* In V2X-Datenbank speichern */
|
|
v2x_db_insert(&frame);
|
|
|
|
/* Debug-Ausgabe */
|
|
ESP_LOGI(TAG, "V2X: %s CH=%d RSSI=%d dBm",
|
|
frame.msg_type == BSM_ID_SPAT ? "BSM" :
|
|
frame.msg_type == CAM_CONTAINER_TYPE ? "CAM" : "DENM",
|
|
frame.channel, frame.rssi_dbm);
|
|
}
|
|
|
|
vTaskDelay(10 / portTICK_PERIOD_MS);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Application entry point
|
|
*/
|
|
void app_main(void) {
|
|
ESP_LOGI(TAG, "V2X-Sniffer Firmware gestartet");
|
|
|
|
/* NVS initialisieren */
|
|
nvs_flash_init();
|
|
|
|
/* WiFi initialisieren */
|
|
esp_netif_init();
|
|
esp_event_loop_create_default();
|
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
|
esp_wifi_init(&cfg);
|
|
|
|
/* V2X PHY initialisieren */
|
|
v2x_phy_init();
|
|
|
|
/* Promiscuous Mode für Sniffing aktivieren */
|
|
esp_wifi_set_promiscuous(true);
|
|
esp_wifi_set_promiscuous_rx_cb([](void *arg, wifi_promiscuous_pkt_t *pkt) {
|
|
vTaskNotifyGiveFromISR(v2x_sniffer_handle, pdTRUE);
|
|
});
|
|
|
|
/* V2X-Datenbank initialisieren */
|
|
v2x_db_init();
|
|
|
|
/* V2X-Sniffer Task starten */
|
|
xTaskCreate(v2x_sniffer_task, "v2x_sniffer", 4096, NULL, 5, NULL);
|
|
|
|
ESP_LOGI(TAG, "✓ V2X-Sniffer bereit!");
|
|
}
|