laithalarmouti/CAN-Bus-IDS-STM32
GitHub: laithalarmouti/CAN-Bus-IDS-STM32
这是一个基于STM32F446RE微控制器的实时车载CAN总线入侵检测系统,通过部署量化神经网络在边缘端实现毫秒级攻击识别。
Stars: 0 | Forks: 0
# CAN-Bus-IDS-STM32
### 基于 STM32F446RE 的设备端 AI 实时汽车 CAN 总线入侵检测




一个完全运行在资源受限的 ARM Cortex-M4 微控制器上的实时汽车 **CAN 总线入侵检测系统 (IDS)**。该系统监控 CAN 总线流量,逐帧提取特征,并使用量化神经网络对攻击进行分类——无需云端,无外部计算,亚毫秒级推理。
## 演示
```
=== CAN IDS System Starting ===
[OK] CAN Driver Initialized
[OK] UART Frame Parser Ready
[OK] AI Network Initialized
=== System Ready - Monitoring CAN Bus ===
[INFO] Normal traffic - 1000 frames processed
[ALERT] *** DoS ATTACK *** | ID: 0x000 | Confidence: 99%
[ALERT] *** DoS ATTACK *** | ID: 0x000 | Confidence: 99%
[ALERT] *** FUZZY ATTACK *** | ID: 0x03AB | Confidence: 97%
[INFO] Normal traffic - 1000 frames processed
```
**无攻击 —— 正常 ECU 流量:**

**模拟攻击 —— 注入恶意帧:**


## 系统架构
```
┌─────────────────────┐ CAN ┌──────────────────────────────┐
│ ESP8266 Node │ ─────────────────────────────► │ STM32F446RE - IDS Node │
│ │ │ │
│ • Simulates ECU │ │ • Bare-metal bxCAN driver │
│ CAN traffic │ │ • Feature extraction (11) │
│ • Injects attacks │ │ • int8 MLP inference │
│ • Button-triggered │ │ • UART alert logging │
└─────────────────────┘ └──────────────────────────────┘
```
## 检测结果
| 攻击类型 | 测试准确率 | 实时演示 | 描述 |
|---------------|--------------|--------------|-----------------------------------|
| 正常流量 | 99.9% | ✅ 正常运行 | 合法 ECU 帧 |
| DoS 攻击 | 100% | ✅ 已检测 | ID 0x000 泛洪 |
| Fuzzy 攻击 | 99.7% | ✅ 已检测 | 随机 ID + payload 注入 |
| 档位欺骗 | 99.8% | 仅数据集 | ECU 冒充(档位位置) |
| 转速欺骗 | 99.8% | 仅数据集 | ECU 冒充(发动机 RPM) |
**总体准确率:99.92%**,基于 491,847 个未见过的测试帧(HCRL Car Hacking Dataset)
## ML 流水线
| 步骤 | 详情 |
|------|--------|
| 数据集 | HCRL Car Hacking Dataset —— 真实车辆(KIA Soul),OBD-II 采集 |
| 帧 | 总计 3.3M → 平衡至每类 491,847(5 类) |
| 特征 | CAN ID, DLC, 8 个 payload 字节,到达间隔时间 = 11 个特征 |
| 模型 | MLP: Input(11) → Dense(64, ReLU) → Dense(32, ReLU) → Dense(5, Softmax) |
| 参数 | 总计 3,013 —— 11.77 KB float32 |
| 量化 | 完整 int8 训练后量化 → 8.06 KB |
| 运行时 | STM32F446RE 上的 X-CUBE-AI 10.2 |
| 设备端 RAM | 总计 2.62 KB |
## 固件架构
```
Core/Src/
├── main.c ← Application entry, inference loop
├── can_driver.c ← Bare-metal bxCAN — direct register access
│ RCC, GPIO AF9, BTR timing, filter config
│ Interrupt-driven RX ring buffer (32 frames)
├── feature_extractor.c ← Hardcoded StandardScaler, 11-feature extraction
├── uart_frame_parser.c ← Interrupt-driven UART parser (ESP8266 frames)
└── uart_log.c ← UART logging with printf-style formatting
X-CUBE-AI/App/
├── network.c ← Generated inference API
└── network_data.c ← Quantized model weights in flash
```
### 关键设计决策
- **不使用 HAL 操作 CAN** —— bxCAN 完全通过直接寄存器操作配置。RCC 时钟使能、GPIO 复用功能 9、APB1 45 MHz 下 500 kbit/s 的 BTR 位时序、过滤器组配置、NVIC 优先级分配。
- **环形缓冲区 ISR** —— CAN RX 中断将帧存储在 32 槽循环缓冲区中。主循环独立排空该缓冲区。ISR 中无阻塞,推理期间无丢帧。
- **硬编码缩放器** —— StandardScaler 参数作为 const float 数组嵌入固件。无动态内存分配,无文件 I/O。
- **int8 量化** —— 相比 float32 内存减少 4 倍。Cortex-M4 上更快的整数运算。推理前逐帧应用量化参数。
## 硬件
| 组件 | 用途 |
|-----------|---------|
| STM32F446RE (Nucleo-64) | 主 IDS 节点 —— 180 MHz Cortex-M4, 512KB flash, 128KB RAM |
| ESP8266 (ESP-12S) | 传感器/攻击模拟节点 |
| UART 连接 | 板间帧协议 @ 115200 波特率 |
| ST-Link V2 (板载) | 烧录和 SWD 调试 |
## CAN 位时序
```
APB1 clock: 45 MHz
Prescaler: 9
BS1: 8 time quanta
BS2: 1 time quantum
Baud rate: 45,000,000 / (9 x (1 + 8 + 1)) = 500,000 bit/s
```
## 仓库结构
```
CAN-Bus-IDS-STM32/
├── Core/
│ ├── Inc/ ← Header files
│ └── Src/ ← Firmware source files
├── Drivers/ ← STM32 HAL drivers (CubeMX generated)
├── X-CUBE-AI/ ← ST AI runtime + generated network
├── Middlewares/ ← X-CUBE-AI library
├── ML_Pipeline/ ← Python notebooks and model files
│ ├── explore.ipynb
│ ├── can_ids_model.tflite
│ ├── can_ids_model.h
│ └── scaler_params.json
├── ESP8266/
│ └── can_simulator.ino ← Arduino sketch for frame simulation
└── README.md
```
## 快速开始
### 前置条件
- STM32CubeIDE 1.16+
- X-CUBE-AI 10.2 扩展包(通过 CubeMX Software Packs 安装)
- 带有 ESP8266 开发板包的 Arduino IDE
- Python 3.x 以及 TensorFlow, scikit-learn, pandas
### 烧录 STM32
1. 在 STM32CubeIDE 中打开项目
2. 构建项目 (Ctrl+B)
3. 通过 ST-Link 烧录 (F11)
4. 在 Nucleo COM 端口以 115200 波特率打开串口终端
### 烧录 ESP8266
1. 在 Arduino IDE 中打开 `ESP8266/can_simulator.ino`
2. 选择 Tools → Board → Generic ESP8266 Module
3. 按住 FLASH 按钮 → 按下 RESET → 松开 FLASH → 上传
4. 按下 RESET 运行 —— FLASH 按钮循环切换攻击模式
## 行业相关性
本项目解决了 **ISO 21434** 和 **UN R155** 下的真实汽车网络安全要求,这些标准强制要求联网车辆具备入侵检测能力。设备端推理方法适用于 ECU 部署的生产环境,因为延迟要求排除了云端处理,内存限制需要量化模型,而实时性保证需要确定性的裸机固件。
## 技术栈
**嵌入式:** C · STM32CubeIDE · X-CUBE-AI 10.2 · Bare-metal bxCAN · UART ISR
**ML:** Python · TensorFlow/Keras · scikit-learn · TFLite · int8 Quantization
**工具:** Jupyter Notebook · STM32CubeMX · Arduino IDE
## 作者
**Laith Alarmouti** —— 嵌入式 AI 与实时系统
嵌入式 AI 硕士 · 寻求德国的嵌入式/固件职位(汽车、国防、航空航天)
[作品集](https://laithalarmouti.github.io) · [LinkedIn](https://linkedin.com/in/laithalarmouti)
## 固件架构
```
Core/Src/
├── main.c ← Application entry, inference loop
├── can_driver.c ← Bare-metal bxCAN — direct register access
│ RCC, GPIO AF9, BTR timing, filter config
│ Interrupt-driven RX ring buffer (32 frames)
├── feature_extractor.c ← Hardcoded StandardScaler, 11-feature extraction
├── uart_frame_parser.c ← Interrupt-driven UART parser (ESP8266 frames)
└── uart_log.c ← UART logging with printf-style formatting
X-CUBE-AI/App/
├── network.c ← Generated inference API
└── network_data.c ← Quantized model weights in flash
```
### 关键设计决策
- **不使用 HAL 操作 CAN** —— bxCAN 完全通过直接寄存器操作配置。RCC 时钟使能、GPIO 复用功能 9、APB1 45 MHz 下 500 kbit/s 的 BTR 位时序、过滤器组配置、NVIC 优先级分配。
- **环形缓冲区 ISR** —— CAN RX 中断将帧存储在 32 槽循环缓冲区中。主循环独立排空该缓冲区。ISR 中无阻塞,推理期间无丢帧。
- **硬编码缩放器** —— StandardScaler 参数作为 const float 数组嵌入固件。无动态内存分配,无文件 I/O。
- **int8 量化** —— 相比 float32 内存减少 4 倍。Cortex-M4 上更快的整数运算。推理前逐帧应用量化参数。
## 硬件
| 组件 | 用途 |
|-----------|---------|
| STM32F446RE (Nucleo-64) | 主 IDS 节点 —— 180 MHz Cortex-M4, 512KB flash, 128KB RAM |
| ESP8266 (ESP-12S) | 传感器/攻击模拟节点 |
| UART 连接 | 板间帧协议 @ 115200 波特率 |
| ST-Link V2 (板载) | 烧录和 SWD 调试 |
## CAN 位时序
```
APB1 clock: 45 MHz
Prescaler: 9
BS1: 8 time quanta
BS2: 1 time quantum
Baud rate: 45,000,000 / (9 x (1 + 8 + 1)) = 500,000 bit/s
```
## 仓库结构
```
CAN-Bus-IDS-STM32/
├── Core/
│ ├── Inc/ ← Header files
│ └── Src/ ← Firmware source files
├── Drivers/ ← STM32 HAL drivers (CubeMX generated)
├── X-CUBE-AI/ ← ST AI runtime + generated network
├── Middlewares/ ← X-CUBE-AI library
├── ML_Pipeline/ ← Python notebooks and model files
│ ├── explore.ipynb
│ ├── can_ids_model.tflite
│ ├── can_ids_model.h
│ └── scaler_params.json
├── ESP8266/
│ └── can_simulator.ino ← Arduino sketch for frame simulation
└── README.md
```
## 快速开始
### 前置条件
- STM32CubeIDE 1.16+
- X-CUBE-AI 10.2 扩展包(通过 CubeMX Software Packs 安装)
- 带有 ESP8266 开发板包的 Arduino IDE
- Python 3.x 以及 TensorFlow, scikit-learn, pandas
### 烧录 STM32
1. 在 STM32CubeIDE 中打开项目
2. 构建项目 (Ctrl+B)
3. 通过 ST-Link 烧录 (F11)
4. 在 Nucleo COM 端口以 115200 波特率打开串口终端
### 烧录 ESP8266
1. 在 Arduino IDE 中打开 `ESP8266/can_simulator.ino`
2. 选择 Tools → Board → Generic ESP8266 Module
3. 按住 FLASH 按钮 → 按下 RESET → 松开 FLASH → 上传
4. 按下 RESET 运行 —— FLASH 按钮循环切换攻击模式
## 行业相关性
本项目解决了 **ISO 21434** 和 **UN R155** 下的真实汽车网络安全要求,这些标准强制要求联网车辆具备入侵检测能力。设备端推理方法适用于 ECU 部署的生产环境,因为延迟要求排除了云端处理,内存限制需要量化模型,而实时性保证需要确定性的裸机固件。
## 技术栈
**嵌入式:** C · STM32CubeIDE · X-CUBE-AI 10.2 · Bare-metal bxCAN · UART ISR
**ML:** Python · TensorFlow/Keras · scikit-learn · TFLite · int8 Quantization
**工具:** Jupyter Notebook · STM32CubeMX · Arduino IDE
## 作者
**Laith Alarmouti** —— 嵌入式 AI 与实时系统
嵌入式 AI 硕士 · 寻求德国的嵌入式/固件职位(汽车、国防、航空航天)
[作品集](https://laithalarmouti.github.io) · [LinkedIn](https://linkedin.com/in/laithalarmouti)标签:AI, Apex, ARM Cortex-M4, bxCAN, CAN总线, DoS攻击, MCU, STM32, STM32F446RE, X-CUBE-AI, 入侵检测系统, 安全数据湖, 实时检测, 客户端加密, 嵌入式, 机器学习, 模糊攻击, 汽车安全, 深度学习, 物联网安全, 神经网络, 自动化代码审查, 裸机, 边缘计算, 逆向工具, 量化神经网络