Реализация контроля доступа через 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 недели
Если вам нужна надёжная СКУД-система с мобильным управлением — получите консультацию или закажите разработку. Мы проектируем и внедряем под ключ, с сертификатами совместимости и реальным опытом на десятках объектов.







