Files
can_sniffer/can_sniffer/deploy/README.md

8.2 KiB
Raw Blame History

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