Система контроля доступа с функцией Anti-Passback для терминалов Hikvision. Предотвращает двойное проникновение - пользователь не может войти повторно, пока не выйдет.
- ✅ 18 терминалов - 9 входа + 9 выхода
- ✅ APB логика - запрет повторного входа без выхода
- ✅ MySQL - хранение состояний и полный аудит
- ✅ Управление дверями - через HCNetSDK
- ✅ Graceful degradation - работает даже если часть терминалов офлайн
- ✅ Автосброс - каждый день в настраиваемое время
- ✅ REST API - статус и управление через HTTP
- ✅ Логирование - консоль + файлы + база данных
| Состояние | Терминал | Действие | Дверь |
|---|---|---|---|
| outside | entry (вход) | ✅ РАЗРЕШЕНО | Открывается |
| outside | exit (выход) | Закрыта | |
| inside | entry (вход) | ❌ ЗАПРЕЩЕНО | Закрыта |
| inside | exit (выход) | ✅ РАЗРЕШЕНО | Открывается |
Если человек показал лицо/карту на терминале входа, но не успел пройти через турникет, он может повторить попытку входа в течение 1 минуты (настраивается через ENTRY_WINDOW_SECONDS).
Пример:
- Пользователь показал лицо на терминале входа → вход разрешен, дверь открылась
- Пользователь не успел пройти (отвлекся, дверь закрылась и т.д.)
- В течение 60 секунд пользователь может снова показать лицо → вход будет разрешен повторно
- После 60 секунд повторный вход будет запрещен (пользователь уже внутри)
SDK не включен в репозиторий. Скачайте и установите:
# См. инструкцию в SDK_INSTALL.mdpip install -r requirements.txtmysql -u root -p < setup_database.sqlcp .env.example .env
nano .env # Отредактируйте настройкиОбязательно настройте:
DB_HOST,DB_USER,DB_PASSWORD- подключение к MySQLTERMINAL_IN_*иTERMINAL_OUT_*- IP адреса ваших терминаловTERMINAL_USER,TERMINAL_PASSWORD- учетные данные терминалов
Если в базе данных уже есть записи в таблице event_logs, необходимо выполнить миграцию для заполнения полей status_code и is_violation:
Вариант 1: Python скрипт (рекомендуется)
python migrate_status_codes.pyВариант 2: SQL скрипт
mysql -u root -p apb_system < migrate_status_codes.sqlpython main.pyНа каждом терминале (221-238) в веб-интерфейсе:
- Configuration → Network → Advanced Settings → HTTP Listening
- Включите HTTP Listening
- URL:
http://YOUR_SERVER_IP:3000/event - Protocol Version: 1.0
- Отметьте события:
- ✅ Face Recognition Success
- ✅ Card Swiped
- Сохраните настройки
Проверка статуса системы
curl http://localhost:3000/Текущее состояние пользователей
curl http://localhost:3000/statusВозвращает JSON с информацией о пользователях внутри здания.
Ручной сброс всех состояний (admin)
curl -X POST http://localhost:3000/resetПолучить все нарушения 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=Иван Иванов"Статистика нарушений APB
curl http://localhost:3000/violations/statsНарушения по коду статуса
# Все попытки входа когда уже внутри
curl http://localhost:3000/violations/DENIED_ALREADY_INSIDEПрием событий от терминалов (автоматически)
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.pypython test_system.pyapb/
├── 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).sqlpython migrate_status_codes.pyСкрипт автоматически:
- Добавит поля
status_codeиis_violationесли их нет - Заполнит их на основе существующих данных (
action_taken,terminal_type,state_before,state_after) - Покажет статистику миграции
- Безопасен для повторного запуска
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→inside→SUCCESS_ENTRY"ВХОД ЗАПРЕЩЕН - уже внутри"+entry→DENIED_ALREADY_INSIDE(нарушение)"ВЫХОД РАЗРЕШЕН"+exit+inside→outside→SUCCESS_EXIT
# Терминалы входа (нечетные 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
-- События сегодня
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защищает конфиденциальные файлы - ✅ Полный аудит всех событий
- ✅ Предотвращение двойного проникновения
# Проверьте IP и доступность
ping 192.168.18.221
# Проверьте логин/пароль в .env# Запустите MySQL
net start MySQL80 # Windows
systemctl start mysql # Linux
# Проверьте пароль в .env# Убедитесь что 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
- Сетевой доступ к терминалам
Создайте bat файл и добавьте в планировщик задач.
sudo nano /etc/systemd/system/apb.serviceСм. комментарии в коде для примера конфигурации.
При возникновении проблем:
- Запустите
python check_system.py - Проверьте логи в консоли
- Проверьте
logs/и таблицуevent_logs - Убедитесь что терминалы настроены правильно
akmalovichdev - Все права защищены © 2024
Версия: 1.0.0 Дата: Октябрь 2024