Реалізація удаленого відкриття/закриття замків автомобіля через мобільний додаток
Управління замками автомобіля удалено — функція, яка на перший погляд простіше удаленого запуску двигуна, але має свої технічні нюанси: різні типи ТБУ керують центральним замком по-різному, затримки GSM-команди критичні коли користувач стоїть у машини, а неправильна обробка статусу «заперто/відкрито» приводить до ситуації коли додаток показує одне, а машина робить інше.
Управління через ТБУ: реле та CAN-шина
Простий спосіб — ТБУ з реле на провода центрального замка (сигнальний провід на закриття/відкриття). Працює на будь-якому автомобілі, не потребує CAN-адаптера. Мінус: немає зворотного зв'язку про реальний стан замка — тільки «команда відправлена».
Продвинутий спосіб — CAN-інтеграція (Teltonika FMB003 + CAN адаптер, LAWIG, Fortin EVO). ТБУ читає шину CAN та знає реальний стан дверей, замків, капота. Зворотний зв'язок: команда закрити → статус «двері закриті» з CAN.
data class VehicleLockStatus(
val frontLeftDoor: DoorState,
val frontRightDoor: DoorState,
val rearLeftDoor: DoorState,
val rearRightDoor: DoorState,
val trunk: DoorState,
val centralLock: LockState,
val lastUpdated: Instant,
)
enum class DoorState { OPEN, CLOSED }
enum class LockState { LOCKED, UNLOCKED, UNKNOWN }
Команда запирання та підтвердження
Для команди запирання — спрощене підтвердження порівняно з запуском двигуна, але не повна відсутність захисту:
suspend fun lockDoors(carId: Long): LockCommandResult {
val status = api.getVehicleStatus(carId)
// Попередження якщо дверь відкрита — запирати з відкритою дверею странно
if (status.anyDoorOpen) {
return LockCommandResult.Warning(
message = "Відкрита ${status.openDoors.joinToString()}",
canProceed = true,
)
}
val command = LockCommand(
carId = carId,
action = LockAction.LOCK,
userId = currentUser.id,
timestamp = Instant.now().epochSecond,
)
return api.sendLockCommand(command)
}
UX: відклик при поганому GSM
Користувач стоїть у машини та жме «Закрити» — команда йде через сотову мережу та може затриматися на 5-20 секунд. Оптимістичний UI не працює тут — не можна показувати «Заперто» до підтвердження: користувач піде думаючи що машина заперта.
Правильна модель: кнопка → «Відправлення...» → «Доставлено» → чекаємо зміни статусу замка (з CAN) → «Заперто» або «Таймаут — перевірте машину».
Stream<LockCommandState> watchLockCommand(String commandId) async* {
yield LockCommandState.sending;
final delivered = await api.awaitCommandDelivery(commandId,
timeout: const Duration(seconds: 15));
if (!delivered) { yield LockCommandState.deliveryFailed; return; }
yield LockCommandState.delivered;
// Чекаємо зміни статусу замка
final confirmed = await vehicleStatusStream
.where((s) => s.centralLock == LockState.LOCKED)
.first
.timeout(const Duration(seconds: 30));
yield LockCommandState.confirmed;
}
Digital Key: UWB та NFC
Apple CarKey (iOS 14+) та Google Digital Car Key (Android 12+) — стандарти дистанційного відкриття замків через UWB (Ultra Wideband) для passive entry та NFC для резервного режиму. Потребують підтримки автовиробником (BMW, Hyundai, Genesis). Для кастомних додатків — CCC (Car Connectivity Consortium) Digital Key специфікація, реалізація через PassKit на iOS та DigitalKeyService в Google Wallet API.
Розробка функції удаленого управління замками автомобіля з зворотним зв'язком про статус: 3–5 тижнів (у складі додатку телематики). Вартість розраховується індивідуально після аналізу API конкретного ТБУ.







