Взимку при -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 впроваджень.







