8.2 KiB
8.2 KiB
CAN Sniffer Deployment for Raspberry Pi 5
Автоматическое развёртывание CAN Sniffer с systemd на Raspberry Pi 5 с 2-CH CAN HAT.
Архитектура
Boot
│
▼
systemd-modules-load (SPI модули)
│
▼
can-setup.service (OneShot)
│ - ip link set can0 type can bitrate 1000000
│ - ip link set can0 up
│ - ip link set can1 type can bitrate 1000000
│ - ip link set can1 up
│
▼
can-sniffer.service
│ - python main.py
│ - Чтение CAN → SQLite → PostgreSQL
│
▼
Running...
Требования
Hardware
- Raspberry Pi 5
- 2-CH CAN HAT (MCP2515 или MCP251xFD)
- Flipper Zero (опционально, для мониторинга)
Software
- Raspberry Pi OS Bookworm (64-bit recommended)
- Python 3.11+
- Настроенный overlay для CAN HAT
Настройка CAN HAT
Перед установкой убедитесь, что CAN HAT настроен в /boot/firmware/config.txt:
Для MCP2515 (стандартный CAN):
# Enable SPI
dtparam=spi=on
# Waveshare 2-CH CAN HAT (MCP2515)
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=mcp2515-can1,oscillator=16000000,interrupt=24
Для MCP251xFD (CAN FD):
# Enable SPI
dtparam=spi=on
# Waveshare 2-CH CAN FD HAT (MCP251xFD)
dtoverlay=mcp251xfd,spi0-0,oscillator=40000000,interrupt=25
dtoverlay=mcp251xfd,spi0-1,oscillator=40000000,interrupt=24
После изменения config.txt требуется перезагрузка:
sudo reboot
Проверка после перезагрузки:
ip link show | grep can
# Должны появиться can0 и can1
Настройка UART для Flipper Zero
Для работы с Flipper Zero через UART (/dev/ttyAMA0) необходимо:
1. Отключить serial console
sudo raspi-config
# Interface Options → Serial Port
# - Login shell over serial: NO
# - Serial port hardware enabled: YES
2. Добавить в /boot/firmware/config.txt:
# Enable UART
enable_uart=1
# На RPI5 освобождаем ttyAMA0 от Bluetooth
# Вариант 1: Полностью отключить BT (рекомендуется)
dtoverlay=disable-bt
# Вариант 2: Переместить BT на mini-UART
# dtoverlay=miniuart-bt
3. Перезагрузить и проверить:
sudo reboot
# После перезагрузки
ls -la /dev/ttyAMA0
# Должен показать устройство
# Тест чтения (Ctrl+C для выхода)
cat /dev/ttyAMA0
4. Подключение Flipper Zero
| Flipper Pin | RPI5 Pin |
|---|---|
| TX | GPIO15 (RXD) |
| RX | GPIO14 (TXD) |
| GND | GND |
Установка
1. Клонирование репозитория
cd /home/pi
git clone https://github.com/your-repo/carpibord.git
cd carpibord/can_sniffer/deploy
2. Запуск установщика
sudo ./install.sh
Установщик автоматически:
- Проверит зависимости (python3, can-utils)
- Создаст директории
/opt/can_sniffer/{data,logs} - Установит Python venv и зависимости
- Скопирует production конфиг
- Установит systemd сервисы
- Включит автозапуск
3. Проверка статуса
sudo systemctl status can-setup
sudo systemctl status can-sniffer
Конфигурация
Основной конфиг
sudo nano /opt/can_sniffer/src/config.json
Переопределение через environment
Редактируйте /etc/default/can-sniffer:
# CAN interfaces (для can-setup.service)
CAN_INTERFACES="can0 can1"
CAN_BITRATE=1000000
# Переопределение config.json (для can-sniffer.service)
CAN_SNIFFER_CAN__INTERFACES="can0,can1"
CAN_SNIFFER_POSTGRESQL__HOST="192.168.1.100"
CAN_SNIFFER_LOGGING__LEVEL="DEBUG"
После изменений:
sudo systemctl restart can-sniffer
Управление сервисами
# Статус
sudo systemctl status can-sniffer
sudo systemctl status can-setup
# Запуск/остановка
sudo systemctl start can-sniffer
sudo systemctl stop can-sniffer
# Перезапуск
sudo systemctl restart can-sniffer
# Просмотр логов
sudo journalctl -u can-sniffer -f
sudo journalctl -u can-sniffer --since "1 hour ago"
# Логи приложения
tail -f /opt/can_sniffer/logs/can_edge.log
Диагностика
Проверка CAN интерфейсов
# Статус интерфейсов
ip -details link show can0
ip -details link show can1
# Статистика
ip -s link show can0
# Прослушивание (can-utils)
candump can0 can1
Частые проблемы
1. CAN интерфейсы не появляются
# Проверить overlay
dmesg | grep -i can
dmesg | grep -i mcp
# Проверить SPI
ls /dev/spidev*
2. Ошибка "Network is down"
# Перезапустить can-setup
sudo systemctl restart can-setup
sudo ip link show can0
3. Ошибка доступа к CAN сокету
# Проверить capabilities в systemd
sudo journalctl -u can-sniffer | grep -i denied
# Или запустить вручную для теста
sudo /opt/can_sniffer/venv/bin/python /opt/can_sniffer/src/main.py
4. PostgreSQL недоступен
# Sniffer работает offline-first, данные сохраняются локально
# Проверить SQLite
ls -la /opt/can_sniffer/data/
# Синхронизация произойдёт автоматически когда PostgreSQL станет доступен
5. Flipper Zero не подключается (нет handshake)
Симптомы: cat /dev/ttyAMA0 показывает "INIT:flipper", но ACK не отправляется.
Проверки:
# 1. Проверить что flipper enabled в конфиге
grep -A5 '"flipper"' /opt/can_sniffer/src/config.json
# Должно быть: "enabled": true
# 2. Проверить что pyserial установлен
/opt/can_sniffer/venv/bin/pip show pyserial
# 3. Проверить права на UART
ls -la /dev/ttyAMA0
# crw-rw---- 1 root dialout ...
# 4. Проверить что пользователь в группе dialout
groups pi
# Должен содержать: dialout
# 5. Проверить что serial console отключена
sudo dmesg | grep ttyAMA0
# НЕ должно быть "console [ttyAMA0]"
# 6. Проверить логи flipper handler
sudo journalctl -u can-sniffer | grep -i flipper
Типичные исправления:
# Добавить в группу dialout
sudo usermod -aG dialout pi
# Перезапустить после изменения групп
sudo systemctl restart can-sniffer
# Или перелогиниться для применения группы
Удаление
sudo ./uninstall.sh
Структура файлов
/opt/can_sniffer/
├── src/
│ ├── main.py # Entry point
│ ├── config.py # Configuration
│ ├── config.json # Production config
│ └── ...
├── venv/ # Python virtual environment
├── data/
│ └── can_offline.db # SQLite database
├── logs/
│ └── can_edge.log # Application logs
└── requirements.txt
/etc/systemd/system/
├── can-setup.service # CAN interface setup (OneShot)
└── can-sniffer.service # Main application service
/etc/default/
└── can-sniffer # Environment overrides
Security Notes
- Сервис запускается от пользователя
pi(не root) - Используется
ProtectSystem=strictдля защиты файловой системы - Capabilities ограничены
CAP_NET_RAWиCAP_NET_ADMINдля CAN - Пароль PostgreSQL в config.json - рассмотрите использование secrets