13 KiB
Руководство администратора
Установка, настройка и обслуживание GPIO Monitor на Raspberry Pi.
Аудитория: администраторы и операторы.
Содержание
- Требования
- Установка из deb-пакета
- Ручная установка
- Параметры командной строки
- Firewall (nftables)
- Wi-Fi Access Point
- Камера (go2rtc)
- Микрофон
- Логи: где лежат и как смотреть
- Диагностика проблем
Требования
- Raspberry Pi (целевая платформа — ARM64, Raspberry Pi OS Bookworm);
- C-программа захвата
gpio-interrupt(WiringPi) на устройстве — поставляется отдельно, в репозитории её нет; alsa-utils(arecord) — для монитора уровня звука;- go2rtc — для видеопотока камеры (бинарник в scripts/go2rtc);
- systemd.
Назначение GPIO-пинов:
WR/STROBE = GPIO27
DATA BUS:
D0 = GPIO21 D4 = GPIO25
D1 = GPIO7 D5 = GPIO24
D2 = GPIO6 D6 = GPIO23
D3 = GPIO5 D7 = GPIO22
Установка из deb-пакета
Рекомендуемый способ развёртывания. Сборка пакета — см. development.md; итоговый файл: build/gpio-monitor-server_<база>-build<N>_arm64.deb, где N — число git-коммитов (например gpio-monitor-server_1.0.0-build83_arm64.deb).
sudo dpkg -i build/gpio-monitor-server_1.0.0-build83_arm64.deb
Пакет при установке (debian/preinst, debian/postinst):
- создаёт системного пользователя
gpio-monitor(группыgpio,dialout) и каталоги/var/log/gpio-monitoring,/var/lib/gpio-monitoring,/opt/gpio-monitoring/web; - ставит бинарник в
/usr/bin/gpio-monitor-serverи утилитуgpio-logsв/usr/bin/gpio-logs; - кладёт unit
gpio-monitor-server.serviceв/etc/systemd/system/и справочный конфиг в/etc/gpio-monitoring/config; - включает и сразу запускает сервис.
Unit debian/gpio-monitor-server.service запускает сервер с параметрами -retention-hours=72 -retention-mb=2000 -retention-interval=60 -rotation-check-interval=1 -buffer-size=10240 -human-log-interval=5 (обратите внимание: retention здесь 72 часа, а не встроенные по умолчанию 48). Чтобы изменить параметры, отредактируйте ExecStart в unit-файле и выполните sudo systemctl daemon-reload && sudo systemctl restart gpio-monitor-server.
Файл
/etc/gpio-monitoring/config— справочный: сервис его не читает, параметры берутся только изExecStart(см. tech-debt.md).
Управление:
sudo systemctl status gpio-monitor-server
sudo systemctl restart gpio-monitor-server
gpio-logs -f # журнал сервиса
Удаление: sudo apt remove gpio-monitor-server; полная очистка с логами и пользователем: sudo apt purge gpio-monitor-server.
Ручная установка
1. Зависимости и сборка
sudo apt update
sudo apt install -y golang git build-essential wiringpi nodejs npm alsa-utils
git clone <your-repo> && cd golang
make init && make build # подробности — development.md
2. Канал данных: systemd socket-activation
FIFO /tmp/gpio_pipe и программу захвата запускает systemd (scripts/monitor-gpio.socket, scripts/monitor-gpio.service): socket-юнит создаёт FIFO, service-юнит направляет stdout gpio-interrupt в него.
sudo cp scripts/monitor-gpio.service scripts/monitor-gpio.socket /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable monitor-gpio.socket monitor-gpio.service
sudo systemctl start monitor-gpio.service
Пути в
monitor-gpio.service(/home/user/WiringPi/examples/gpio-interrupt) и владелец FIFO вmonitor-gpio.socket(SocketUser=user) заданы под конкретное устройство — проверьте их перед установкой.
3. Go-сервер как сервис
Шаблон — scripts/go2monitor.service (запуск собранного бинарника от обычного пользователя). Поправьте WorkingDirectory и путь в ExecStart под своё расположение проекта, затем:
sudo cp scripts/go2monitor.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now go2monitor.service
Либо запустите вручную:
./build/gpio-monitor-server -pipe /tmp/gpio_pipe -retention-hours=72 -retention-mb=2000
4. Проверка
sudo systemctl status monitor-gpio.service
curl http://localhost:8080/api/health
Дашборд: http://<IP>:8080/ (редирект на dashboard.html), просмотр истории: http://<IP>:8080/logs.html.
Параметры командной строки
Полный список флагов gpio-monitor-server (источник — cmd/server/main.go):
| Параметр | По умолчанию | Описание |
|---|---|---|
-pipe |
/tmp/gpio_pipe |
Путь к FIFO pipe |
-port |
:8080 |
Адрес/порт веб-сервера |
-retention-hours |
48 |
Часы хранения .bin-логов (0 = отключено) |
-retention-mb |
5000 |
Максимальный суммарный размер .bin-логов, МБ (0 = отключено) |
-retention-interval |
15 |
Интервал проверки retention, мин |
-rotation-check-interval |
1 |
Интервал проверки ротации, мин |
-buffer-size |
10240 |
Размер кольцевого буфера, элементов |
-silence-5min |
5 |
Порог тишины для события ТИШИНА_5МИН, мин |
-silence-10min |
10 |
Порог тишины для события ТИШИНА_10МИН, мин |
-watchdog-interval |
1 |
Интервал проверки watchdog, мин |
-alert-cooldown |
10 |
Анти-спам между одинаковыми алертами, сек |
-human-log-interval |
5 |
Интервал записи human-логов, сек |
-camera-url |
http://127.0.0.1:1984/api/stream.mjpeg?src=cam_mjpeg |
URL MJPEG-потока для прокси /api/cam |
Firewall (nftables)
На Raspberry Pi OS Bookworm по умолчанию активен nftables, блокирующий входящие порты, кроме SSH (22).
Разрешить порт 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
Ограничить доступ:
# Только локальная сеть
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
sudo nft add rule inet filter input iifname "wlan0" tcp dport 8080 accept
Wi-Fi Access Point
Raspberry Pi может работать точкой доступа:
- SSID:
fix_me, IP устройства:192.168.77.1; - подключение:
ssh user@192.168.77.1; - дашборд:
http://192.168.77.1:8080.
Камера (go2rtc)
Видеопоток отдаёт go2rtc (конфиг — scripts/go2rtc.yaml): поток cam_mjpeg — MJPEG 640×480 15 fps с /dev/video0 через ffmpeg, API на порту 1984 (также RTSP :8554, WebRTC :8555).
./scripts/go2rtc -config scripts/go2rtc.yaml
Проверка: http://<IP>:1984 (встроенный интерфейс go2rtc), http://<IP>:1984/api/stream.mjpeg?src=cam_mjpeg (прямой поток). Go-сервер проксирует этот поток на /api/cam.
Микрофон
Уровень звука снимается через arecord (пакет alsa-utils); USB-микрофон находится автоматически. Проверка:
arecord -l
# **** List of CAPTURE Hardware Devices ****
# card 3: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
Если список пуст — микрофон не определился; сервер при этом работает нормально, но /api/health отдаёт sound_level: 0. Пользователь, от которого запущен сервис, должен состоять в группе audio (sudo usermod -aG audio <user>). При физическом отвале микрофона сервер сам пытается восстановить захват каждые 5 секунд.
Логи: где лежат и как смотреть
Пути зависят от режима (подробно — data-formats.md):
| Файл | Пакетная установка | Ручной запуск (dev) |
|---|---|---|
Бинарные данные gpio-*.bin |
/var/log/gpio-monitoring/data/ |
~/.local/share/gpio-monitoring/logs/data/ |
| События | /var/log/gpio-monitoring/events.log, events_human.log |
~/.local/share/gpio-monitoring/logs/... |
| GPIO human-лог | /var/log/gpio-monitoring/gpio_human.log |
~/.local/share/gpio-monitoring/logs/gpio_human.log |
| Журнал сервиса | journalctl -u gpio-monitor-server |
stdout |
Просмотр:
# Пакетная установка — утилита gpio-logs:
gpio-logs -f # журнал сервиса (journalctl)
gpio-logs -e # события
gpio-logs -g # GPIO human-лог
gpio-logs -d # сырые бинарные данные (xxd)
# Dev-режим:
./scripts/view_logs.sh # сводная статистика логов
Место на диске контролируется retention (см. флаги -retention-*); при значениях по умолчанию deb-юнита — не более 2000 МБ и 72 часов бинарных данных.
Диагностика проблем
Dashboard не открывается
- Сервер запущен?
ps aux | grep gpio-monitor-server sudo systemctl status gpio-monitor-server # или go2monitor / monitor-gpio при ручной установке - Firewall:
sudo nft list ruleset | grep 8080 - Сервер слушает нужный интерфейс:
sudo ss -tlnp | grep 8080(должно быть*:8080или0.0.0.0:8080) - Маршрутизация:
ip route show - Логи:
sudo journalctl -u gpio-monitor-server -f sudo tail -f /var/log/gpio-monitoring/events_human.log # пакетная установка tail -f ~/.local/share/gpio-monitoring/logs/events_human.log # dev-режим - FIFO существует:
ls -la /tmp/gpio_pipe
Статус «Нет связи» на дашборде
Данные не поступают дольше 15 секунд. Проверьте цепочку: monitor-gpio.service запущен → FIFO существует → в events_human.log нет свежих PIPE_НЕ_НАЙДЕН/PIPE_ОТКЛЮЧЕН → события ТИШИНА_5МИН укажут, что pipe жив, но данных нет (проблема на стороне захвата/шины).
Индикатор «🔊 ЗВУК» не реагирует
which arecord && arecord -l— arecord установлен и видит микрофон;- в журнале сервера при старте нет строки
Аудио-монитор не запущен (микрофон недоступен?); - пользователь сервиса в группе
audio:groups <user>.
Камера не показывает
- go2rtc запущен и отвечает:
curl http://localhost:1984/api/streams; /dev/video0существует;/api/streamвозвращаетavailable: true. Учтите: проверка доступности всегда идёт наlocalhost:1984независимо от-camera-url(см. api.md).