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







