Зимой при -25°C вы пытаетесь запустить двигатель из приложения. Команда уходит, но стартер молчит. Причина — телематический блок не получил корректную подпись или биометрия не прошла. Удалённый запуск — не просто кнопка, а команда с серьёзными последствиями. Ошибка способна повредить стартер, разрядить АКБ или создать угрозу безопасности. Архитектура приложения для удалённого запуска обязана учитывать задержку GSM-канала (2–15 секунд), проверять множество статусов автомобиля и подписывать каждую команду HMAC-SHA256. Без этого уязвимость цепи «приложение → сервер → ТБУ → реле» открывает доступ злоумышленнику.
Мы занимаемся такими проектами уже более 5 лет. Наш подход — обязательная биометрия, подписанные команды и детальный аудит. В этой услуге вы получаете функцию под ключ: от анализа телематического блока до публикации в 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).
Пошаговая настройка биометрии для запуска
- В методе
onCreate(илиviewDidLoad) инициализируйтеBiometricPrompt/LAContext. - При нажатии кнопки «Запустить» вызовите аутентификацию.
- После успеха — сформируйте подписанную команду и отправьте на сервер.
- При ошибке — покажите сообщение и заблокируйте кнопку на 30 секунд.
Как мы гарантируем безопасность команды?
Каждая команда на запуск проходит 6 проверок: автомобиль не должен двигаться, двери заперты, капот закрыт, прошло более 30 секунд с последней попытки, пользователь не менял пароль за последние 24 часа, а команда подписана HMAC-SHA256 с уникальным секретом устройства. Аудит-лог хранится 90 дней — это позволяет расследовать любые инциденты. Мы гарантируем, что без биометрии и подписи команда не уйдёт на сервер. Стоимость внедрения такой системы составляет часть общего бюджета, но экономия на безопасности очевидна.
Сравнение методов аутентификации
| Метод | Уровень безопасности | Время выполнения | Защита от перебора |
|---|---|---|---|
| Биометрия (Face ID) | Высокий | 1 сек | Да (лаг перед сбросом) |
| PIN-код | Средний | 3-5 сек | Ограниченное число попыток |
| 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 скорость проверяется перед началом. Неавторизованное устройство не получит подпись — секрет привязан к конкретному смартфону. Все эти механизмы вместе снижают вероятность ошибки до статистической погрешности. Экономия на простое автомобиля окупает вложения в течение года.
Что входит в разработку функции удалённого старта?
- Анализ API телематического блока (доступные команды, статусы, документация).
- Проектирование безопасности (аутентификация, подпись команд, аудит).
- Реализация мобильного приложения (iOS/Android) с биометрией и статусом.
- Интеграция с бэкендом (REST/WebSocket, очередь команд).
- Тестирование на реальном автомобиле (до 100 тестовых запусков).
- Документация по эксплуатации и поддержке.
Сроки и стоимость
Разработка занимает 5-8 недель в составе комплексного мобильного приложения. Стоимость рассчитывается индивидуально — зависит от сложности ТБУ и требований к безопасности. Получите консультацию — оценим ваш проект под ключ.
Свяжитесь с нами для консультации по вашему проекту. Закажите проектирование удалённого запуска — ответственная функция, требующая глубокого понимания телематики и мобильной безопасности. Доверьте её реализацию команде с опытом более 100 внедрений.







