Files
go-service/README.md
2026-07-17 15:57:05 +03:00

10 KiB
Raw Permalink Blame History

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.