12 KiB
GPIO Monitor Dashboard for Raspberry Pi
Реалтайм мониторинг параллельной GPIO-шины Raspberry Pi через C + Go + Web Dashboard.
Проект читает входящие сигналы с GPIO-пинов Raspberry Pi по прерыванию, передаёт данные через FIFO pipe в Go-сервер и отображает всё в браузере в реальном времени с возможностью просмотра исторических данных.
Возможности
✅ Захват данных по GPIO interrupt (C + WiringPi)
✅ FIFO pipe, а также stdin/stdout между C + WiringPi и Go Service
✅ Реализация кольцевого буфера чтения
✅ HTTP API + Web Dashboard
✅ Автоматическая ротация лог-файлов
✅ Retention (автоматическая очистка старых логов)
✅ Watchdog мониторинг активности
✅ MJPEG камера через go2rtc
✅ TypeScript фронтенд
✅ Работа через Wi-Fi Access Point
Архитектура
GPIO BUS (8 bit)
↓
gpio-interrupt.c (C + WiringPi)
↓ stdout
FIFO pipe (/tmp/gpio_pipe)
↓
Go Server (gpio-monitor-server)
├── RingBuffer (RAM)
├── Data Logger (бинарные .bin файлы)
├── Human Logger (текстовые логи)
├── Event Logger (события системы)
├── Watchdog (мониторинг)
└── Retention (очистка старых логов)
↓
HTTP API (:8080)
├── /api/health - статус сервера
├── /api/latest - последние данные
├── /api/history - история (последние 100)
├── /api/stream - статус камеры
├── /api/cam - MJPEG поток
├── /api/log/files - список лог-файлов
├── /api/log/data - данные из лог-файла
└── /api/log/events - события системы
↓
Web Dashboard (Embedded)
├── index.html
├── dashboard.html (главная)
├── logs.html (просмотр логов)
├── css/style.css
├── js/*.ts (TypeScript исходники)
└── dist/*.js (скомпилированный JS)
Структура проекта
.
├── build/
│ └── gpio-monitor-server # Скомпилированный бинарник
├── build.sh # Скрипт сборки (Go + TypeScript)
├── cmd/server/
│ ├── main.go # Go HTTP сервер
│ └── web/ # Веб-интерфейс
│ ├── css/style.css
│ ├── dist/ # Скомпилированный JS
│ │ ├── app.js
│ │ ├── chart.js
│ │ ├── data.js
│ │ └── ...
│ ├── js/ # TypeScript исходники
│ │ ├── app.ts
│ │ ├── chart.ts
│ │ ├── data.ts
│ │ └── ...
│ ├── dashboard.html
│ ├── index.html
│ ├── logs.html
│ ├── favicon.png
│ ├── package.json
│ ├── tsconfig.json
│ └── README.md
├── internal/
│ ├── adapter/buffer.go # RingBuffer
│ ├── logger/ # Система логирования
│ │ ├── config.go
│ │ ├── data_logger.go # Бинарные логи
│ │ ├── event_logger.go # События
│ │ ├── human_logger.go # Человекочитаемые логи
│ │ ├── monitor.go # Watchdog
│ │ ├── parser.go # Парсер данных GPIO
│ │ ├── paths.go # Пути к файлам
│ │ ├── retention.go # Очистка старых логов
│ │ └── rotation.go # Ротация файлов
│ └── pipe/reader.go # Чтение из FIFO pipe
├── scripts/
│ ├── monitor-gpio.service # Systemd сервис
│ ├── monitor-gpio.socket # Systemd socket
│ ├── go2rtc # Бинарник go2rtc
│ ├── go2rtc.yaml # Конфиг go2rtc
│ ├── view_logs.sh # Скрипт просмотра логов
│ ├── emulator.py # Эмулятор GPIO
│ └── imi_wire.py # IMI Wire эмулятор
├── SDR/ # SDR компоненты
│ ├── common.c/h
│ ├── reciever.c
│ ├── transmitter.c
│ └── makefile
├── go.mod
├── start-server.sh
└── README.md
GPIO пины
WR/STROBE = GPIO27
DATA BUS:
D0 = GPIO21
D1 = GPIO7
D2 = GPIO6
D3 = GPIO5
D4 = GPIO25
D5 = GPIO24
D6 = GPIO23
D7 = GPIO22
Установка
1. Установка зависимостей
sudo apt update
sudo apt install -y golang git build-essential wiringpi nodejs npm
2. Клонирование и сборка
git clone <your-repo>
cd ~/work/golang
# Сборка TypeScript + Go
./build.sh
3. Настройка systemd сервиса
# Копировать сервисные файлы
sudo cp scripts/monitor-gpio.service /etc/systemd/system/
sudo cp scripts/monitor-gpio.socket /etc/systemd/system/
# Перезагрузить systemd
sudo systemctl daemon-reload
# Включить автозапуск
sudo systemctl enable monitor-gpio.socket
sudo systemctl enable monitor-gpio.service
# Запустить сервис
sudo systemctl start monitor-gpio.service
4. Проверка статуса
sudo systemctl status monitor-gpio.service
journalctl -u monitor-gpio.service -f
Настройка firewall (nftables)
Важно: На Raspberry Pi OS Bookworm по умолчанию активен nftables, который блокирует все входящие порты, кроме SSH (22).
Разрешить порт 8080:
# Добавить правило для порта 8080
sudo nft add rule inet filter input tcp dport 8080 accept
# Проверить правила
sudo nft list ruleset
# Сохранить правила (для сохранения после перезагрузки)
sudo nft list ruleset | sudo tee /etc/nftables.conf > /dev/null
sudo systemctl enable nftables
sudo systemctl restart nftables
Для доступа только с локальной сети:
# Разрешить только с сети 10.1.1.0/24
sudo nft add rule inet filter input ip saddr 10.1.1.0/24 tcp dport 8080 accept
# Или только с конкретного IP
sudo nft add rule inet filter input ip saddr 192.168.1.100 tcp dport 8080 accept
Для доступа через Wi-Fi AP:
# Разрешить с Wi-Fi сети (192.168.77.0/24)
sudo nft add rule inet filter input iifname "wlan0" tcp dport 8080 accept
Запуск
Ручной запуск
./build/gpio-monitor-server \
-pipe /tmp/gpio_pipe \
-retention-hours=72 \
-retention-mb=2000 \
-retention-interval=60 \
-rotation-check-interval=1 \
-buffer-size=10240 \
-human-log-interval=5
Параметры командной строки
| Параметр | По умолчанию | Описание |
|---|---|---|
-pipe |
/tmp/gpio_pipe |
Путь к FIFO pipe |
-port |
:8080 |
Порт веб-сервера |
-retention-hours |
48 |
Часы хранения логов (0 = отключено) |
-retention-mb |
5000 |
Максимальный размер логов в MB |
-retention-interval |
15 |
Интервал проверки retention (мин) |
-rotation-check-interval |
1 |
Интервал проверки ротации (мин) |
-buffer-size |
10240 |
Размер кольцевого буфера |
-human-log-interval |
5 |
Интервал записи human-логов (сек) |
-alert-cooldown |
10 |
Задержка между алертами (сек) |
-camera-url |
http://127.0.0.1:1984/api/stream.mjpeg?src=cam_mjpeg |
URL MJPEG камеры |
Dashboard
Открывайте в браузере:
- Через Ethernet:
http://10.1.1.33:8080(или ваш IP) - Через Wi-Fi AP:
http://192.168.77.1:8080 - Локально:
http://localhost:8080
Страницы
http://<IP>:8080/- Перенаправление на dashboardhttp://<IP>:8080/dashboard.html- Главная панель мониторингаhttp://<IP>:8080/logs.html- Просмотр исторических логов
API
Основные эндпоинты
GET /api/health
# Статус сервера, uptime, статистика
GET /api/latest
# Последние данные и история (10 записей)
GET /api/history
# Последние 100 записей
GET /api/stream
# Статус камеры
GET /api/cam
# MJPEG поток камеры (прокси на go2rtc)
Работа с логами
GET /api/log/files
# Список доступных лог-файлов
GET /api/log/data?file=gpio-2026-06-17-11.bin
# Данные из конкретного бинарного лога
GET /api/log/events?limit=100
# Последние события системы
Диагностика проблем
Если Dashboard не открывается:
-
Проверьте, что сервер запущен:
ps aux | grep gpio-monitor-server sudo systemctl status monitor-gpio.service -
Проверьте firewall:
sudo nft list ruleset | grep 8080 -
Проверьте, на каком интерфейсе слушает сервер:
sudo ss -tlnp | grep 8080 # Должно быть *:8080 или 0.0.0.0:8080 -
Проверьте маршрутизацию:
ip route show -
Посмотрите логи:
sudo journalctl -u monitor-gpio.service -f tail -f /home/user/logs/gpio-events.log tail -f /home/user/logs/gpio-human.log -
Проверьте наличие pipe:
ls -la /tmp/gpio_pipe
Wi-Fi режим Raspberry Pi
SSID: fix_me
IP: 192.168.77.1
Подключение: ssh user@192.168.77.1
Запуск Go сервера в режиме разработки:
go run cmd/server/main.go \
-pipe /tmp/gpio_pipe \
-retention-hours=1 \
-human-log-interval=1
Эмуляция GPIO сигналов:
python3 scripts/emulator.py
Просмотр логов:
./scripts/view_logs.sh
Камера (go2rtc)
Для работы камеры установите go2rtc:
# Запуск go2rtc
./scripts/go2rtc -config scripts/go2rtc.yaml
Камера будет доступна по адресу:
- MJPEG поток:
http://<IP>:1984/api/stream.mjpeg?src=cam_mjpeg - Встроенный интерфейс:
http://<IP>:1984
Сборка пакета
make deb