Реалізація контролю доступу через RFID у мобільних додатках
RFID-контроль доступу через мобільний додаток — це не просто «прочитати карту і відкрити двері». Це аудит-лог кожної события, управління правами доступу для кожного користувача та зони, обробка офлайн-сценаріїв коли контролер дверей недоступний, та інтеграція з HID/Wiegand RFID-зчитувачами. Тут надійність важливіша за швидкість.
Архітектура: де живе логіка
Мобільний додаток — інструмент адміністратора системи контролю доступу та переглядачу аудит-логу. Логіка «відкривати або ні» ніколи не повинна бути лише на телефоні — контролер дверей (наприклад HID VertX, Honeywell Pro-Watch) вирішує за своєю базою.
Типовий потік:
Мобільний додаток → REST API контролю доступу → Контролер дверей → Зчитувач → Електромагнітний замок
Мобільний додаток управляє:
- Базою власників карт (додавання, блокування, видалення)
- Розпорядженням доступу (коли кому можна в яку зону)
- Моніторингом подій у реальному часі
- Ручним відкриттям дверей (Remote Unlock)
Читання RFID-карт мобільним телефоном
Сам телефон може виступати як RFID-зчитувач через NFC (для карт MIFARE Classic/DESFire) або через зовнішній BLE-зчитувач (для HF 13.56 МГц або LF 125 кГц карт).
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 }
// Читаємо UID карти (унікальний ідентифікатор)
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:
// Команда SELECT Application
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, // GRANTED / DENIED / TAILGATING
val deniedReason: String? // "outside_schedule", "card_blocked", "no_permission"
)
deniedReason — деталізація відмови. Охоронцю потрібно знати: карта заблокована або людина просто прийшла поза розпорядженням. Різні дії — різна реакція.
Дистанційне управління дверми
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. Без цього розслідування інцидентів неможливе.
Терміни
Мобільний додаток адміністратора контролю доступу з аудит-логом та REST-інтеграцією з існуючою системою: 5 днів. З NFC-читанням MIFARE UID та Remote Unlock: +3 дні. Повна інтеграція з HID або Honeywell контролем доступу включаючи настройку контролерів: 2–4 тижні.







