# 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 --- ## Архитектура ```text 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. Установка зависимостей ```bash sudo apt update sudo apt install -y golang git build-essential wiringpi nodejs npm ``` ### 2. Клонирование и сборка ```bash git clone cd ~/work/golang # Сборка TypeScript + Go ./build.sh ``` ### 3. Настройка systemd сервиса ```bash # Копировать сервисные файлы 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. Проверка статуса ```bash sudo systemctl status monitor-gpio.service journalctl -u monitor-gpio.service -f ``` --- ## Настройка firewall (nftables) **Важно:** На Raspberry Pi OS Bookworm по умолчанию активен nftables, который блокирует все входящие порты, кроме SSH (22). ### Разрешить порт 8080: ```bash # Добавить правило для порта 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 ``` ### Для доступа только с локальной сети: ```bash # Разрешить только с сети 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: ```bash # Разрешить с Wi-Fi сети (192.168.77.0/24) sudo nft add rule inet filter input iifname "wlan0" tcp dport 8080 accept ``` --- ## Запуск ### Ручной запуск ```bash ./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://:8080/` - Перенаправление на dashboard - `http://:8080/dashboard.html` - Главная панель мониторинга - `http://:8080/logs.html` - Просмотр исторических логов --- ## API ### Основные эндпоинты ```bash GET /api/health # Статус сервера, uptime, статистика GET /api/latest # Последние данные и история (10 записей) GET /api/history # Последние 100 записей GET /api/stream # Статус камеры GET /api/cam # MJPEG поток камеры (прокси на go2rtc) ``` ### Работа с логами ```bash GET /api/log/files # Список доступных лог-файлов GET /api/log/data?file=gpio-2026-06-17-11.bin # Данные из конкретного бинарного лога GET /api/log/events?limit=100 # Последние события системы ``` --- ## Диагностика проблем ### Если Dashboard не открывается: 1. **Проверьте, что сервер запущен:** ```bash ps aux | grep gpio-monitor-server sudo systemctl status monitor-gpio.service ``` 2. **Проверьте firewall:** ```bash sudo nft list ruleset | grep 8080 ``` 3. **Проверьте, на каком интерфейсе слушает сервер:** ```bash sudo ss -tlnp | grep 8080 # Должно быть *:8080 или 0.0.0.0:8080 ``` 4. **Проверьте маршрутизацию:** ```bash ip route show ``` 5. **Посмотрите логи:** ```bash sudo journalctl -u monitor-gpio.service -f tail -f /home/user/logs/gpio-events.log tail -f /home/user/logs/gpio-human.log ``` 6. **Проверьте наличие pipe:** ```bash ls -la /tmp/gpio_pipe ``` --- ## Wi-Fi режим Raspberry Pi SSID: `fix_me` IP: `192.168.77.1` Подключение: `ssh user@192.168.77.1` --- ### Запуск Go сервера в режиме разработки: ```bash go run cmd/server/main.go \ -pipe /tmp/gpio_pipe \ -retention-hours=1 \ -human-log-interval=1 ``` ### Эмуляция GPIO сигналов: ```bash python3 scripts/emulator.py ``` ### Просмотр логов: ```bash ./scripts/view_logs.sh ``` --- ## Камера (go2rtc) Для работы камеры установите go2rtc: ```bash # Запуск go2rtc ./scripts/go2rtc -config scripts/go2rtc.yaml ``` Камера будет доступна по адресу: - MJPEG поток: `http://:1984/api/stream.mjpeg?src=cam_mjpeg` - Встроенный интерфейс: `http://:1984` --- ### Сборка пакета ```bash make deb