Реализация контроля доступа через RFID в мобильном приложении
Представьте: охранник на проходной видит в приложении, что карта сотрудника заблокирована, а на удалённом складе происходит попытка прохода вне расписания. RFID-контроль доступа через мобильное приложение — это аудит-лог каждого события, управление правами доступа для каждого пользователя и зоны, обработка оффлайн-сценариев когда контроллер двери недоступен, и интеграция с HID/Wiegand RFID-считывателями. Наш опыт в этой области — более 5 лет и 15 проектов для промышленных объектов и бизнес-центров. Мы реализуем СКУД-мобильные приложения под ключ, включая настройку контроллеров и обучение персонала.
Как мобильное приложение взаимодействует с контроллером двери?
Мобильное приложение — это инструмент администратора СКУД и просмотра аудит-лога. Логика «открывать или нет» никогда не должна быть только на телефоне — контроллер двери (например HID VertX, Honeywell Pro-Watch) принимает решение сам по своей базе. Типичный поток:
Мобильное приложение → REST API СКУД → Контроллер двери → Считыватель → Электромагнитный замок Мобильное приложение управляет:
- Базой держателей карт (добавление, блокировка, удаление)
- Расписанием доступа (когда кому можно в какую зону)
- Мониторингом событий в реальном времени до 10 000 событий/мин
- Ручным открытием двери (Remote Unlock)
Считывание RFID-карт мобильным телефоном
Сам телефон может выступать как RFID-ридер через NFC (для карт MIFARE Classic/DESFire) или через внешний BLE-ридер (для HF 13.56 MHz или LF 125 kHz карт).
NFC на iOS (CoreNFC) для MIFARE:
import CoreNFC class AccessCardReader: NSObject, NFCTagReaderSessionDelegate { var session: NFCTagReaderSession? func startReading() { session = NFCTagReaderSession(pollingOption: [.iso14443], delegate: self) session?.alertMessage = "Приложите карту доступа" session?.begin() } func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) { guard let tag = tags.first, case .miFare(let mifareTag) = tag else { return } session.connect(to: tag) { error in if error != nil { session.invalidate(errorMessage: "Ошибка подключения"); return } let uid = mifareTag.identifier.map { String(format: "%02X", $0) }.joined() self.onCardDetected(uid: uid) session.invalidate() } } } UID MIFARE-карты — это просто уникальный номер. Для HID ProxCard 125 кГц мобильный телефон не умеет читать физически. Нужен внешний BLE-ридер.
MIFARE DESFire EV2 — безопасное чтение: DESFire карты используют в серьёзных СКУД. Чтение секторов требует аутентификации с AES-128:
let selectCmd = Data([0x90, 0x5A, 0x00, 0x00, 0x03]) + applicationId + Data([0x00]) mifareTag.sendMiFareCommand(commandPacket: selectCmd) { response, error in // Далее Authenticate с AES ключом приложения } Где хранятся ключи?
Ключи хранятся в Secure Enclave — не в коде приложения. `SecKeyCreateRandomKey` с `.secureEnclaveBound` атрибутом.Аудит-лог и мониторинг
Мониторинг событий в реальном времени через WebSocket или SSE (Server-Sent Events):
class AccessEventMonitor(private val accessApi: AccessControlApi) { private val _events = MutableSharedFlow<AccessEvent>(replay = 50) val events: SharedFlow<AccessEvent> = _events.asSharedFlow() fun startMonitoring(zoneIds: List<String>) { scope.launch { accessApi.streamEvents(zoneIds).collect { event -> _events.emit(event) if (event.accessResult == AccessResult.DENIED) { sendDeniedAlert(event) } } } } } data class AccessEvent( val cardholderName: String, val cardUid: String, val doorName: String, val timestamp: Long, val accessResult: AccessResult, val deniedReason: String? ) deniedReason — детализация отказа. Охраннику нужно знать: карта заблокирована или просто человек пришёл вне расписания. Разные действия — разная реакция.
Что делать при потере сети?
Контроллер двери работает автономно по локальной базе держателей карт. При восстановлении связи мобильное приложение синхронизирует пропущенные события через REST API. Оффлайн-режим не критичен для безопасности, но аудит-лог должен быть полным. Мы гарантируем корректную синхронизацию с помощью паттерна Outbox и идемпотентных запросов.
Удалённое управление дверьми
Remote Unlock — открытие двери без физического присутствия:
suspend fun remoteUnlock(doorId: String, durationSeconds: Int = 5) { val result = accessApi.unlockDoor( doorId = doorId, unlockDuration = durationSeconds, operatorId = currentUser.id, reason = "remote_unlock_mobile" ) if (result.isSuccess) { logAuditEvent(AuditAction.REMOTE_UNLOCK, doorId) } } Каждое удалённое открытие — в аудит-лог с operatorId. Без этого невозможно расследование инцидентов.
Сравнение технологий: NFC vs BLE-ридер
| Параметр | NFC (встроенный) | BLE-ридер (внешний) |
|---|---|---|
| Частота | 13.56 МГц | LF 125 кГц / HF 13.56 МГц |
| Поддерживаемые карты | MIFARE Classic, DESFire | HID Prox, iClass, LEGIC |
| Безопасность | Высокая (AES в Secure Enclave) | Средняя (ключи на ридере) |
| Скорость чтения | < 0.3 с | 0.1–0.5 с |
| Необходимость носить ридер | Нет | Да |
Для объектов с существующей инфраструктурой HID ProxCard — BLE-ридер единственный вариант. Для новых систем выбираем MIFARE DESFire — надёжнее и быстрее.
Таблица сроков этапов разработки
| Этап | Срок | Состав работ |
|---|---|---|
| Аналитика | 1–2 дня | Изучение СКУД, схемы зон, протоколы Wiegand/OSDP |
| Проектирование | 2–3 дня | REST API, модель аудит-лога, схема авторизации |
| Реализация | 5–10 дней | Мобильное приложение, backend, интеграция с контроллером |
| Тестирование | 2–3 дня | Функциональное, нагрузочное (до 10 000 событий/мин), оффлайн |
| Деплой | 1–2 дня | Публикация в магазины, настройка push, обучение |
Процесс работы
- Аналитика — изучение существующей СКУД, протоколов (Wiegand, OSDP), схемы зон.
- Проектирование — архитектура REST API, модель данных аудит-лога, схемы авторизации.
- Реализация — мобильное приложение (iOS/Android/Flutter), backend-сервис, интеграция с контроллерами.
- Тестирование — функциональное, нагрузочное (до 10 000 событий/мин), оффлайн-сценарии.
- Деплой — публикация в App Store/Google Play, настройка push (APNs/FCM), обучение администраторов.
Что входит в работу
- Исходный код мобильного приложения и backend
- Документация: API-спецификация (OpenAPI), руководство администратора
- Интеграция с существующей СКУД (HID, Honeywell, ZKTeco)
- Настройка push-уведомлений (APNs/FCM) и тестовой среды (TestFlight, Firebase Distribution)
- Гарантия 1 год на ошибки приложения
- Поддержка 3 месяца после запуска (консультации, доработки)
Сроки и как заказать
Оценим проект за 1 день после заполнения брифа. Сроки:
- База держателей, аудит-лог, Remote Unlock: от 5 дней
- Добавление NFC-чтения MIFARE: +3 дня
- Полная интеграция с HID/Honeywell: 2–4 недели
Если вам нужна надёжная СКУД-система с мобильным управлением — получите консультацию или закажите разработку. Мы проектируем и внедряем под ключ, с сертификатами совместимости и реальным опытом на десятках объектов.







