/** * 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 #include #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!"); }