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







