Реалізація UWB-ключів для відкриття дверей/авто через мобільний додаток
UWB (Ultra-Wideband) — не Bluetooth з точним позиціонуванням. Це IEEE 802.15.4z, імпульсна радіосвязь з точністю вимірювання дистанції ±10 см та кута ±5°. iPhone 11+ та сучасні Android-флагмани з чипом Qorvo DWM3000 або NXP SR150 вміють визначати точне положення UWB-пристрою у просторі. На цьому будуються Hands-Free ключі: телефон у кармані → дверь відкривається при приближенні на 0.5–1.5 м. Без натиснення. Без NFC-додатку.
Як працює UWB Ranging
UWB використовує Two-Way Ranging (TWR): пристрій відправляє імпульс, акцесуар відповідає, за часом пролету (Time-of-Flight) обчислюється дистанція з сантиметровою точністю. На відміну від RSSI у Bluetooth — жодних перешкод від багатолучевого поширення, стін, тіла людини.
Архітектура Hands-Free unlock:
- Смартфон починає BLE-advertise при розблокуванні
- UWB-модуль у замку виявляє телефон за BLE
- Ініціюється UWB-сесія для точного виміру дистанції
- При дистанції < 1.5 м + кут у секторі «перед дверею» → замок відкривається
- При видаленні > 5 м → замок закривається
iOS: NearbyInteraction framework
Apple відкрила UWB-доступ через NearbyInteraction (iOS 14+). Працює тільки на iPhone 11+ з чипом U1. Акцесуар повинен підтримувати MFi UWB протокол.
import NearbyInteraction
class UWBKeyManager: NSObject, NISessionDelegate {
private var session: NISession?
func startRanging(accessoryToken: Data) {
session = NISession()
session?.delegate = self
session?.delegateQueue = DispatchQueue.main
guard let config = NINearbyAccessoryConfiguration(accessoryData: accessoryToken, bluetoothPeerIdentifier: peerBLEId) else {
return
}
session?.run(config)
}
func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) {
guard let object = nearbyObjects.first else { return }
if let distance = object.distance {
// distance у метрах, точність ±10 см
if distance < 1.5 {
triggerUnlock()
}
}
if let direction = object.direction {
// SIMD3<Float> — вектор напрямку на об'єкт
let isInFront = direction.z < 0 // об'єкт перед телефоном
}
}
func session(_ session: NISession, didInvalidateWith error: Error) {
// NIErrorCode.invalidConfiguration — неверний токен
// NIErrorCode.userDidNotAllow — користувач відмовив у Nearby Interaction
restartWithDelay()
}
}
accessoryToken — криптографічно підписаний токен, який акцесуар передає по BLE при першому виявленні. Apple не розкриває формат токена публічно — він частина MFi UWB Accessory Protocol. Без ліцензії MFi на стороні виробника замку ця схема недоступна.
Entitlement для NearbyInteraction з акцесуарами: com.apple.developer.nearby-interaction.allow — стандартний, доступний без MFi. Але NINearbyAccessoryConfiguration вимагає токен від сертифікованого MFi UWB-акцесуара.
Android: UWB API (Android 12+)
Google відкрив UWB через androidx.core.uwb:uwb (Jetpack). Вимагає пристрій з UWB-чипом: Pixel 6 Pro+, Samsung Galaxy S21 Ultra+, деякі моделі OnePlus та Xiaomi.
implementation("androidx.core.uwb:uwb:1.0.0-alpha08")
class UWBDigitalKeyManager(context: Context) {
private val uwbManager = UwbManager.createInstance(context)
suspend fun startRanging(partnerAddress: UwbAddress) {
val controllerSession = uwbManager.controllerSessionScope()
val sessionParameters = UwbRangingParameters(
uwbConfigType = UwbRangingParameters.CONFIG_MULTICAST_DS_TWR,
complexChannel = controllerSession.uwbComplexChannel,
peerDevices = listOf(UwbDevice.createForAddress(partnerAddress)),
updateRateType = UwbRangingParameters.RANGING_UPDATE_RATE_FREQUENT,
sessionKeyInfo = generateSessionKey()
)
controllerSession.prepareSession(sessionParameters)
.collect { rangingResult ->
when (rangingResult) {
is RangingResult.RangingResultPosition -> {
val distance = rangingResult.position.distance?.value ?: return@collect
if (distance < 1.5f) triggerUnlock()
}
is RangingResult.RangingResultPeerDisconnected -> {
restartSession()
}
}
}
}
}
CONFIG_MULTICAST_DS_TWR — двусторонній ranging з підтримкою кількох пирів. Для одного замку достатньо CONFIG_UNICAST_DS_TWR.
Безпека: захист від relay attack
Головна уязвимість ключів на основі радіо — relay attack: зловмисник ретранслює BLE/UWB-сигнал, імітуючи близість телефону до замку, коли реальний телефон далеко. UWB робить relay-атаку фізично неможливою: швидкість світла обмежує, та додаткова затримка ретрансляції (>1 мкс) детектується TWR як аномалія.
Додатково: токени ключів мають бути ephemeral (короткоживучі, оновлюватися по BLE перед кожним ranging), підписані ECDSA-256 закритим ключем, збереженим у Secure Enclave (iOS) або Android Keystore.
Замкове обладнання
Без підтримки UWB на стороні замку все вищесказане не працює. Партнери з готовими UWB-модулями для інтеграції:
- Allegion (Schlage) — UWB-замки для комерційної нерухомості
- dormakaba — CCC Digital Key 3.0 сумісні замки
- NXP SR150 eval kit — для розробки власного обладнання
Строки
Мобільний додаток з UWB-ranging та Hands-Free логікою (при наявності готового UWB-акцесуара): 2–4 тижні. Розробка з нуля включаючи прошивку замку та UWB-модуль на NXP SR150: 2–4 місяці. Стоимість залежить від цільової платформи та наявності партнерських договорів з виробниками обладнання.







