10 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 между капчером и Go-сервером (systemd socket-activation)
✅ Кольцевой буфер в RAM + бинарный архив на диске
✅ HTTP API + встроенный Web Dashboard (TypeScript)
✅ Автоматическая ротация лог-файлов (почасовые .bin)
✅ Retention — автоочистка старых логов по возрасту и размеру
✅ Watchdog — события при пропадании данных
✅ Монитор звука с микрофона (arecord/ALSA)
✅ MJPEG-камера через go2rtc
✅ Сборка deb-пакета с версионированием через git
✅ Работа через Wi-Fi Access Point
Документация
| Документ | Содержание | Для кого |
|---|---|---|
| docs/operations.md | Установка (deb и вручную), systemd, firewall, камера, микрофон, диагностика | Администраторы |
| docs/architecture.md | Устройство системы: компоненты, поток данных, конкурентность | Разработчики |
| docs/api.md | Спецификация HTTP API: все эндпоинты с примерами ответов | Разработчики |
| docs/data-formats.md | Байт GPIO, формат .bin, протокол pipe, события, пути хранения |
Разработчики |
| docs/development.md | Сборка, Makefile, эмуляторы, тесты, соглашения | Разработчики |
| docs/frontend.md | Веб-дашборд: модули TypeScript, сборка, dev-цикл | Разработчики |
| docs/tech-debt.md | Реестр технического долга | Разработчики |
| SDR/README.md | Подпроект OFDM-радиолинка на PlutoSDR (автономный) | Разработчики |
| CHANGELOG.md | История изменений | Все |
Архитектура (кратко)
GPIO BUS (8 bit)
↓ прерывание
gpio-interrupt (C + WiringPi) ← поставляется отдельно, вне репозитория
↓ stdout → systemd socket
FIFO pipe (/tmp/gpio_pipe)
↓
Go Server (gpio-monitor-server)
├── RingBuffer (RAM)
├── Data Logger (почасовые .bin)
├── Human / Event Logger (текстовые логи)
├── Watchdog + Retention
├── Audio Monitor (arecord)
└── HTTP API (:8080) + Web Dashboard (embedded)
↓
Браузер: dashboard.html / logs.html
HTTP API: /api/health, /api/latest, /api/history (последние 300), /api/stream, /api/cam (MJPEG-прокси), /api/log/files, /api/log/data?file=...&page=..., /api/log/events?page=... — подробности в docs/api.md.
Подробная схема — docs/architecture.md.
Структура проекта
.
├── Makefile # Сборка (основной способ)
├── build.sh # Исторический скрипт сборки
├── start-server.sh # Скрипт запуска на устройстве
├── build/ # Артефакты сборки (генерируется)
├── cmd/server/
│ ├── main.go # Go HTTP-сервер (точка входа)
│ └── web/ # Веб-интерфейс
│ ├── js/ # TypeScript-исходники (10 модулей)
│ ├── dist/ # Скомпилированный JS (генерируется tsc)
│ ├── css/, fonts/
│ ├── index.html, dashboard.html, logs.html, favicon.png
│ ├── package.json, tsconfig.json
│ └── README.md
├── internal/
│ ├── adapter/buffer.go # Кольцевой буфер
│ ├── audio/monitor.go # Монитор уровня звука (arecord)
│ ├── logger/ # Система логирования
│ │ ├── config.go # Конфигурация
│ │ ├── data_logger.go # Бинарные логи
│ │ ├── event_logger.go # События
│ │ ├── human_logger.go # Человекочитаемые логи
│ │ ├── monitor.go # Watchdog
│ │ ├── parser.go # Разбор байта GPIO
│ │ ├── paths.go # Пути хранения
│ │ ├── retention.go # Очистка старых логов
│ │ ├── retention_test.go # Тесты retention
│ │ └── rotation.go # Почасовая ротация
│ └── pipe/reader.go # Чтение из FIFO pipe
├── scripts/
│ ├── monitor-gpio.service # systemd: капчер GPIO
│ ├── monitor-gpio.socket # systemd: FIFO pipe
│ ├── go2monitor.service # systemd: Go-сервер (ручная установка)
│ ├── go2rtc, go2rtc.yaml # Стрим камеры
│ ├── emulator.py, array.txt # Эмулятор потока GPIO
│ ├── imi_wire.py # Имитатор шины на реальных GPIO
│ ├── emulatohackrf.sh # Передача данных через HackRF
│ ├── vu_meter.py # Консольный VU-метр микрофона
│ └── view_logs.sh # Статистика dev-логов
├── debian/ # Сборка deb-пакета (control, unit, скрипты)
├── SDR/ # Подпроект: OFDM-радиолинк PlutoSDR (C)
│ ├── common.c/h, transmitter.c, reciever.c
│ ├── makefile
│ └── README.md
├── docs/ # Документация (см. таблицу выше)
├── go.mod # module gpio-monitor, Go 1.21, без зависимостей
├── CHANGELOG.md
└── README.md
Каталоги build/, cmd/server/web/dist/ и cmd/server/web/node_modules/ генерируются при сборке и в git не хранятся.
GPIO-пины
WR/STROBE = GPIO27
DATA BUS:
D0 = GPIO21 D4 = GPIO25
D1 = GPIO7 D5 = GPIO24
D2 = GPIO6 D6 = GPIO23
D3 = GPIO5 D7 = GPIO22
Быстрый старт
Сборка
sudo apt install -y golang git build-essential wiringpi nodejs npm alsa-utils
git clone <your-repo> && cd golang
make init # подготовка окружения (Node.js, Go-модули, npm-пакеты)
make build # TypeScript-фронтенд + Go-сервер → build/gpio-monitor-server
Подробности, кросс-компиляция, эмуляция без железа — docs/development.md.
Запуск
./build/gpio-monitor-server \
-pipe /tmp/gpio_pipe \
-retention-hours=72 \
-retention-mb=2000
Дашборд: http://<IP>:8080 (через Wi-Fi AP — http://192.168.77.1:8080, локально — http://localhost:8080). Страницы: /dashboard.html — мониторинг, /logs.html — история.
Полная таблица из 13 CLI-флагов, настройка systemd, firewall (nftables), камеры и микрофона — docs/operations.md.
Deb-пакет
make deb # от обычного пользователя, без sudo
sudo dpkg -i build/gpio-monitor-server_1.0.0-build<N>_arm64.deb
Версия пакета формируется автоматически: <база из debian/control>-build<число git-коммитов>. Полезные цели: make version (показать версию), make deb-info (информация о пакете), make deb-contents (список файлов), make deb-clean (очистка). Подробнее — docs/development.md; что делает пакет при установке — docs/operations.md.
Хранение данных (кратко)
Бинарные данные пишутся в почасовые файлы gpio-YYYY-MM-DD-HH.bin в каталоге данных (/var/log/gpio-monitoring/data/ при deb-установке, ~/.local/share/gpio-monitoring/logs/data/ в dev-режиме). Ротация открывает новый файл каждый час; retention удаляет старые файлы по возрасту (-retention-hours) и суммарному размеру (-retention-mb), всегда сохраняя минимум 2 свежих файла.
Форматы файлов, словарь событий и алгоритм очистки — docs/data-formats.md.
Диагностика (кратко)
sudo systemctl status gpio-monitor-server # или monitor-gpio / go2monitor
sudo ss -tlnp | grep 8080 # сервер слушает порт?
sudo nft list ruleset | grep 8080 # firewall пропускает?
ls -la /tmp/gpio_pipe # FIFO существует?
gpio-logs -f # журнал сервиса (deb-установка)
Полный чек-лист (дашборд, звук, камера, «Нет связи») — docs/operations.md.