Skip to content

Anti-Passback система контроля доступа для терминалов Hikvision с MySQL и автоматическим управлением дверями

Notifications You must be signed in to change notification settings

akmalovichdev/HikVision-APB

Repository files navigation

🚪 APB System - Anti-Passback для Hikvision

Python Flask MySQL

Система контроля доступа с функцией Anti-Passback для терминалов Hikvision. Предотвращает двойное проникновение - пользователь не может войти повторно, пока не выйдет.

🎯 Возможности

  • 18 терминалов - 9 входа + 9 выхода
  • APB логика - запрет повторного входа без выхода
  • MySQL - хранение состояний и полный аудит
  • Управление дверями - через HCNetSDK
  • Graceful degradation - работает даже если часть терминалов офлайн
  • Автосброс - каждый день в настраиваемое время
  • REST API - статус и управление через HTTP
  • Логирование - консоль + файлы + база данных

📋 Правила Anti-Passback

Состояние Терминал Действие Дверь
outside entry (вход) ✅ РАЗРЕШЕНО Открывается
outside exit (выход) ⚠️ ПРЕДУПРЕЖДЕНИЕ Закрыта
inside entry (вход) ❌ ЗАПРЕЩЕНО Закрыта
inside exit (выход) ✅ РАЗРЕШЕНО Открывается

⏱️ Временное окно для повторного входа

Если человек показал лицо/карту на терминале входа, но не успел пройти через турникет, он может повторить попытку входа в течение 1 минуты (настраивается через ENTRY_WINDOW_SECONDS).

Пример:

  1. Пользователь показал лицо на терминале входа → вход разрешен, дверь открылась
  2. Пользователь не успел пройти (отвлекся, дверь закрылась и т.д.)
  3. В течение 60 секунд пользователь может снова показать лицо → вход будет разрешен повторно
  4. После 60 секунд повторный вход будет запрещен (пользователь уже внутри)

🚀 Быстрый старт

1. Установка SDK Hikvision

SDK не включен в репозиторий. Скачайте и установите:

# См. инструкцию в SDK_INSTALL.md

2. Установка зависимостей

pip install -r requirements.txt

3. Настройка MySQL

mysql -u root -p < setup_database.sql

4. Конфигурация .env

cp .env.example .env
nano .env  # Отредактируйте настройки

Обязательно настройте:

  • DB_HOST, DB_USER, DB_PASSWORD - подключение к MySQL
  • TERMINAL_IN_* и TERMINAL_OUT_* - IP адреса ваших терминалов
  • TERMINAL_USER, TERMINAL_PASSWORD - учетные данные терминалов

5. Миграция базы данных (если уже есть данные)

Если в базе данных уже есть записи в таблице event_logs, необходимо выполнить миграцию для заполнения полей status_code и is_violation:

Вариант 1: Python скрипт (рекомендуется)

python migrate_status_codes.py

Вариант 2: SQL скрипт

mysql -u root -p apb_system < migrate_status_codes.sql

⚠️ ВАЖНО: Перед миграцией сделайте резервную копию базы данных!

6. Запуск

python main.py

🔧 Конфигурация терминалов Hikvision

На каждом терминале (221-238) в веб-интерфейсе:

  1. ConfigurationNetworkAdvanced SettingsHTTP Listening
  2. Включите HTTP Listening
  3. URL: http://YOUR_SERVER_IP:3000/event
  4. Protocol Version: 1.0
  5. Отметьте события:
    • Face Recognition Success
    • Card Swiped
  6. Сохраните настройки

📡 API Endpoints

GET /

Проверка статуса системы

curl http://localhost:3000/

GET /status

Текущее состояние пользователей

curl http://localhost:3000/status

Возвращает JSON с информацией о пользователях внутри здания.

POST /reset

Ручной сброс всех состояний (admin)

curl -X POST http://localhost:3000/reset

GET /violations

Получить все нарушения APB

# Все нарушения
curl http://localhost:3000/violations

# Нарушения за период
curl "http://localhost:3000/violations?start_date=2024-01-01&end_date=2024-01-31"

# Нарушения конкретного пользователя
curl "http://localhost:3000/violations?user_name=Иван Иванов"

GET /violations/stats

Статистика нарушений APB

curl http://localhost:3000/violations/stats

GET /violations/<status_code>

Нарушения по коду статуса

# Все попытки входа когда уже внутри
curl http://localhost:3000/violations/DENIED_ALREADY_INSIDE

POST /event

Прием событий от терминалов (автоматически)

🗄️ База данных

Таблицы

user_states - состояния пользователей

SELECT * FROM user_states WHERE state='inside';

event_logs - журнал всех событий

SELECT * FROM event_logs ORDER BY created_at DESC LIMIT 20;

Нарушения APB - все попытки входа когда уже внутри

-- Все нарушения
SELECT * FROM event_logs WHERE is_violation = TRUE ORDER BY created_at DESC;

-- Нарушения по коду статуса
SELECT * FROM event_logs WHERE status_code = 'DENIED_ALREADY_INSIDE';

-- Статистика нарушений по пользователям
SELECT user_name, COUNT(*) as violations_count
FROM event_logs
WHERE is_violation = TRUE
GROUP BY user_name
ORDER BY violations_count DESC;

Коды статусов событий:

  • SUCCESS_ENTRY - успешный вход
  • SUCCESS_EXIT - успешный выход
  • ALLOWED_TIME_WINDOW - разрешен вход в пределах временного окна
  • DENIED_ALREADY_INSIDE - запрещен вход, уже внутри (нарушение APB)
  • DENIED_OUTSIDE_WINDOW - запрещен вход, вне временного окна (нарушение APB)
  • WARNING_EXIT_WITHOUT_ENTRY - предупреждение при выходе без входа

Полезные запросы - см. файл queries.sql

🧪 Тестирование

Проверка системы

python check_system.py

Тестирование без терминалов

python test_system.py

📂 Структура проекта

apb/
├── main.py                    # Основное приложение
├── db.py                      # Модуль работы с MySQL
├── requirements.txt           # Python зависимости
├── .env                       # Конфигурация (создать!)
├── .env.example               # Пример конфигурации
├── setup_database.sql         # Создание БД
├── migrate_status_codes.py    # Скрипт миграции (Python)
├── migrate_status_codes.sql  # Скрипт миграции (SQL)
├── check_system.py            # Проверка готовности
├── test_system.py             # Тестирование
└── lib/
    └── HCNetSDK.dll           # SDK Hikvision

🔄 Миграция базы данных

Если в базе данных уже есть записи в таблице event_logs, необходимо выполнить миграцию для заполнения полей status_code и is_violation.

⚠️ Перед миграцией

ОБЯЗАТЕЛЬНО сделайте резервную копию базы данных:

mysqldump -u root -p apb_system > backup_$(date +%Y%m%d_%H%M%S).sql

Вариант 1: Python скрипт (рекомендуется)

python migrate_status_codes.py

Скрипт автоматически:

  • Добавит поля status_code и is_violation если их нет
  • Заполнит их на основе существующих данных (action_taken, terminal_type, state_before, state_after)
  • Покажет статистику миграции
  • Безопасен для повторного запуска

Вариант 2: SQL скрипт

mysql -u root -p apb_system < migrate_status_codes.sql

Что делает миграция

Миграция определяет status_code и is_violation на основе:

  • action_taken - текст действия
  • terminal_type - тип терминала (entry/exit)
  • state_before и state_after - состояния до и после события

Примеры определения:

  • "ВХОД РАЗРЕШЕН" + entry + outside→insideSUCCESS_ENTRY
  • "ВХОД ЗАПРЕЩЕН - уже внутри" + entryDENIED_ALREADY_INSIDE (нарушение)
  • "ВЫХОД РАЗРЕШЕН" + exit + inside→outsideSUCCESS_EXIT

⚙️ Конфигурация (.env)

# Терминалы входа (нечетные IP)
TERMINAL_IN_1=192.168.18.221
TERMINAL_IN_2=192.168.18.223
TERMINAL_IN_3=192.168.18.225
TERMINAL_IN_4=192.168.18.227
TERMINAL_IN_5=192.168.18.229

TERMINAL_IN_6=192.168.18.231
TERMINAL_IN_7=192.168.18.233
TERMINAL_IN_8=192.168.18.235
TERMINAL_IN_9=192.168.18.237

# Терминалы выхода (четные IP)
TERMINAL_OUT_1=192.168.18.222
TERMINAL_OUT_2=192.168.18.224
TERMINAL_OUT_3=192.168.18.226
TERMINAL_OUT_4=192.168.18.228
TERMINAL_OUT_5=192.168.18.230

TERMINAL_OUT_6=192.168.18.232
TERMINAL_OUT_7=192.168.18.234
TERMINAL_OUT_8=192.168.18.236
TERMINAL_OUT_9=192.168.18.238

# Учетные данные терминалов
TERMINAL_PORT=8000
TERMINAL_USER=admin
TERMINAL_PASSWORD=123456

# MySQL
DB_HOST=localhost
DB_NAME=apb_system
DB_USER=root
DB_PASSWORD=your_password

# Настройки APB
RESET_TIME=00:00         # Время сброса (HH:MM)
DOOR_OPEN_TIME=3         # Секунды открытия двери
ENTRY_WINDOW_SECONDS=60  # Временное окно для повторного входа после аутентификации (секунды)

📊 Мониторинг

Логи в консоли

Все события отображаются в реальном времени:

============================================================
👤 Пользователь: Иван Иванов
📍 Терминал: 192.168.18.221 (entry)
📊 Текущее состояние: outside
============================================================
✅ Иван Иванов входит в здание через 192.168.18.221
✏️  Действие: ВХОД РАЗРЕШЕН
🔄 Новое состояние: inside
============================================================

Логи файлы

Детальные логи в папке logs/:

logs/YYYYMMDD_HHMMSS_MMMMMM/
  ├── headers.json
  ├── AccessControllerEvent.json
  └── photo.jpg

Логи в MySQL

-- События сегодня
SELECT * FROM event_logs WHERE DATE(created_at) = CURDATE();

-- Нарушения APB (новый способ с кодами статусов)
SELECT * FROM event_logs WHERE is_violation = TRUE ORDER BY created_at DESC;

-- Нарушения APB по коду статуса
SELECT * FROM event_logs WHERE status_code = 'DENIED_ALREADY_INSIDE';

-- Топ нарушителей
SELECT user_name, COUNT(*) as violations
FROM event_logs
WHERE is_violation = TRUE
GROUP BY user_name
ORDER BY violations DESC
LIMIT 10;

-- Пользователи внутри
SELECT * FROM user_states WHERE state='inside';

🔒 Безопасность

  • ✅ Секретные данные в .env (не в git!)
  • .gitignore защищает конфиденциальные файлы
  • ✅ Полный аудит всех событий
  • ✅ Предотвращение двойного проникновения

🚨 Troubleshooting

"Login failed" при подключении к терминалам

# Проверьте IP и доступность
ping 192.168.18.221

# Проверьте логин/пароль в .env

"MySQL connection error"

# Запустите MySQL
net start MySQL80          # Windows
systemctl start mysql      # Linux

# Проверьте пароль в .env

"HCNetSDK.dll not found"

# Убедитесь что DLL в папке lib/
ls lib/HCNetSDK.dll

Терминал не отправляет события

  • Проверьте настройки HTTP Listening на терминале
  • Убедитесь что URL правильный
  • Проверьте что порт 3000 доступен

Терминал недоступен при запуске

Система продолжит работу!

  • Недоступные терминалы будут пропущены
  • APB логика будет работать для всех событий
  • Управление дверями работает только для подключенных терминалов
  • События логируются даже если терминал офлайн

🛠️ Технологии

  • Python 3.8+
  • Flask 3.0 - веб-фреймворк
  • MySQL 8.0+ - база данных
  • mysql-connector-python - драйвер БД
  • HCNetSDK.dll - SDK Hikvision

📝 Требования

  • Python 3.8 или выше
  • MySQL 8.0 или выше
  • Windows 10/11 или Linux
  • HCNetSDK.dll от Hikvision
  • Сетевой доступ к терминалам

🔄 Автоматический запуск

Windows (Task Scheduler)

Создайте bat файл и добавьте в планировщик задач.

Linux (systemd)

sudo nano /etc/systemd/system/apb.service

См. комментарии в коде для примера конфигурации.

🤝 Поддержка

При возникновении проблем:

  1. Запустите python check_system.py
  2. Проверьте логи в консоли
  3. Проверьте logs/ и таблицу event_logs
  4. Убедитесь что терминалы настроены правильно

📄 Лицензия

akmalovichdev - Все права защищены © 2024


Версия: 1.0.0 Дата: Октябрь 2024

About

Anti-Passback система контроля доступа для терминалов Hikvision с MySQL и автоматическим управлением дверями

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published