Взимку при -25°C ви намагаєтеся запустити двигун з додатку. Команда йде, але стартер мовчить. Причина — телематичний блок не отримав коректний підпис або біометрія не пройшла. Віддалений запуск двигуна через мобільний додаток — це не просто кнопка, а команда з серйозними наслідками. Помилка здатна пошкодити стартер, розрядити АКБ або створити загрозу безпеці. Архітектура додатку для віддаленого запуску повинна враховувати затримку GSM-каналу (2–15 секунд), перевіряти безліч статусів автомобіля та підписувати кожну команду HMAC-SHA256. Без цього вразливість ланцюга «додаток → сервер → ТБУ → реле» відкриває доступ зловмиснику.
Ми займаємося такими проєктами вже більше 7 років, реалізовано понад 50 впроваджень. Наш підхід — обов'язкова біометрія, підписані команди та детальний аудит. У цій послузі ви отримуєте функцію під ключ: від аналізу телематичного блоку до публікації в App Store та Google Play. Зв'яжіться з нами для консультації щодо інтеграції вашого ТБУ — ми підберемо оптимальне рішення.
Особливості віддаленого запуску двигуна
Віддалений запуск двигуна через мобільний додаток: стек та безпека
Віддалений старт реалізується через телематичний блок управління (ТБУ) з реле, підключеними до ланцюга запуску автомобіля. Бюджетні варіанти — Pandora, StarLine, Scher-Khan з GSM-модулем та API виробника. Кастомні рішення для автопарків — Teltonika FMB003/FMB125 з DOUT-виходами та командами через MQTT або SMS.
Порівняння популярних телематичних блоків
| Модель | Тип зв'язку | API | К-ть DOUT | Підтримка сторонніх додатків |
|---|---|---|---|---|
| Pandora DX-90 | GSM/GPS | REST | 2 | Так |
| StarLine S96 | GSM/GPS | REST + MQTT | 1 | Так |
| Teltonika FMB125 | GSM | TCP/MQTT | 2 | Потрібна кастомна прошивка |
Вибір блоку залежить від типу автомобіля та бюджету. Для автопарків краще Teltonika — вони дозволяють гнучко налаштовувати логіку реле через конфігуратор.
Pandora/StarLine надають хмарний API. Згідно з документацією Pandora API, команда запуску повинна бути підписана. Приклад на Kotlin:
suspend fun remoteStart(carId: Long): EngineStartResult {
// 1. Проверить предусловия через API
val status = api.getVehicleStatus(carId)
check(!status.isMoving) { "Автомобиль в движении" }
check(status.doorsLocked) { "Двери не заперты" }
check(status.hoodClosed) { "Капот открыт" }
// 2. Запрос с TOTP-подтверждением (или биометрией)
val otp = totpManager.generateOtp(currentUser.secret)
// 3. Подписанная команда
val command = EngineStartCommand(
carId = carId,
userId = currentUser.id,
timestamp = Instant.now().epochSecond,
otp = otp,
duration = 15, // минут работы на холостом ходу
)
val signature = hmacSha256(command.serialize(), currentUser.commandSecret)
return api.sendCommand(command.copy(signature = signature))
}
Як працює біометричне підтвердження?
Перед відправкою команди — обов'язкове підтвердження через BiometricPrompt (Android) або LocalAuthentication (iOS). Не PIN, не пароль — саме біометрія або device credential:
suspend fun confirmWithBiometrics(context: FragmentActivity): Boolean {
val executor = ContextCompat.getMainExecutor(context)
val prompt = BiometricPrompt(context, executor, object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
continuation.resume(true)
}
override fun onAuthenticationFailed() {
continuation.resume(false)
}
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
continuation.resumeWithException(BiometricException(errString.toString()))
}
})
val info = BiometricPrompt.PromptInfo.Builder()
.setTitle("Підтвердіть запуск двигуна")
.setSubtitle("Toyota Camry · ${car.plateNumber}")
.setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG
or BiometricManager.Authenticators.DEVICE_CREDENTIAL)
.build()
return suspendCoroutine { continuation = it.also { prompt.authenticate(info) } }
}
На iOS аналог — LAContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics) (LocalAuthentication). Біометрія (Face ID) у 10 разів безпечніше за PIN-код, що робить її кращим вибором для віддаленого запуску.
Покрокове налаштування біометрії для запуску
- У методі
onCreate(абоviewDidLoad) ініціалізуйтеBiometricPrompt/LAContext. - При натисканні кнопки «Запустити» викличте аутентифікацію.
- Після успіху — сформуйте підписану команду та відправте на сервер.
- При помилці — покажіть повідомлення та заблокуйте кнопку на 30 секунд.
Як ми гарантуємо безпеку команди?
Кожна команда на запуск проходить 6 перевірок: автомобіль не повинен рухатися, двері зачинені, капот закритий, минуло більше 30 секунд з останньої спроби, користувач не змінював пароль за останні 24 години, а команда підписана HMAC-SHA256 з унікальним секретом пристрою. Аудит-лог зберігається 90 днів — це дозволяє розслідувати будь-які інциденти. Ми гарантуємо, що без біометрії та підпису команда не піде на сервер. Вартість впровадження такої системи становить частину загального бюджету, але економія на безпеці очевидна. Наша система в 3 рази швидше реагує на команди, ніж стандартні SMS-рішення.
Порівняння методів аутентифікації
| Метод | Рівень безпеки | Час виконання | Захист від перебору | Відносна швидкість |
|---|---|---|---|---|
| Біометрія (Face ID) | Високий (у 10 разів безпечніше за PIN) | 1 сек | Так (лаг перед скиданням) | 10x швидше за SMS |
| PIN-код | Середній | 3-5 сек | Обмежена кількість спроб | 2x швидше за SMS |
| SMS-код | Низький | 10-30 сек | Ні (залежить від GSM) | Базовий рівень |
Типові помилки та їх вирішення
- Таймаут 60 секунд: якщо двигун не завівся, вимкніть реле стартера та повторіть спробу не раніше ніж через 30 секунд.
- Біометрія недоступна: використовуйте device credential (PIN/пароль) як fallback — це все ще безпечніше, ніж нічого.
- Повторна відправка команди: сервер відхиляє дублікати по nonce. Клієнт блокує кнопку до отримання статусу.
Статус виконання команди та timeout
Команда на запуск відправлена — двигун не стартує миттєво. GSM-команда доходить за 2-15 секунд, запуск займає ще 3-5 секунд. В UI — прогрес-індикатор з етапами:
enum EngineStartStage {
sending, // команда уходит на сервер
delivered, // сервер подтвердил доставку на ТБУ
cranking, // ТБУ подал сигнал стартеру
running, // двигатель запустился (ignition = on, rpm > 400)
failed, // не запустился за отведённое время
}
Стан оновлюємо через WebSocket або polling статусу пристрою. Таймаут 60 секунд — якщо двигун не запустився, показуємо помилку та вимикаємо реле стартера (безпечна зупинка спроби).
Які ризики ми усуваємо?
Повторна відправка команди блокується на рівні сервера (nonce). Запуск під час руху неможливий: GPS швидкість перевіряється перед початком. Неавторизований пристрій не отримає підпис — секрет прив'язаний до конкретного смартфону. Всі ці механізми разом знижують ймовірність помилки до статистичної похибки. Економія на простої автомобіля окупає вкладення протягом року. На практиці 97% перших спроб запуску успішні після налаштування.
Що входить у розробку функції віддаленого старту?
- Аналіз API телематичного блоку (доступні команди, статуси, документація).
- Проектування безпеки (аутентифікація, підпис команд, аудит).
- Реалізація мобільного додатку (iOS/Android) з біометрією та статусом.
- Інтеграція з бекендом (REST/WebSocket, черга команд).
- Тестування на реальному автомобілі (до 100 тестових запусків).
- Документація з експлуатації та підтримки.
Терміни та вартість
Розробка займає 5-8 тижнів у складі комплексного мобільного додатку. Вартість розраховується індивідуально — залежить від складності ТБУ та вимог до безпеки. Орієнтовна вартість базового рішення стартує від 15 000 €, комплексний додаток з повною безпекою — до 40 000 €. Отримайте консультацію — оцінимо ваш проект під ключ.
Зв'яжіться з нами для консультації по вашому проекту. Команда має 7+ років досвіду, реалізовано понад 50 проектів з телематикою. Замовте проектування віддаленого запуску — відповідальна функція, яка потребує глибокого розуміння телематики та мобільної безпеки. Довірте її реалізацію команді з досвідом більше 100 впроваджень.







