Проблема: как получить реальное состояние автомобиля через OBD-II
Владельцы автопарков часто сталкиваются с ситуацией: машина на ходу, но расход топлива внезапно вырос, или загорелся Check Engine, а до ближайшего сервиса 500 км. Мониторинг через OBD-II даёт полную картину, но реализация приложения упирается в кучу нюансов: протоколы адаптеров, фоновый опрос под Android и iOS, декодирование DTC. Мы решаем эти задачи 5+ лет и накопили более 50 проектов.
OBD-II порт есть в любом автомобиле, выпущенном с середины 1990-х. Через него ELM327-совместимый адаптер (Viecar, KONNWEI, Veepeak) по Bluetooth или Wi-Fi отдаёт PID-запросы — и приложение получает обороты двигателя, нагрузку, температуру охлаждающей жидкости, скорость, напряжение бортовой сети, коды ошибок DTC. Задача звучит просто, но реализация упирается в несколько нетривиальных моментов.
Какие данные можно получить через OBD-II?
Стандарт <cite>SAE J1979</cite> определяет Mode 01 (текущие данные) и Mode 03 (коды ошибок). Не все PID поддерживаются всеми автомобилями — сначала запрашиваем PID 0x00 (supported PIDs 01-20), затем 0x20, 0x40, 0x60, чтобы построить карту доступных параметров.
| PID | Параметр | Формула |
|---|---|---|
| 0x04 | Нагрузка двигателя | A * 100 / 255 % |
| 0x05 | Температура охлаждающей жидкости | A - 40 °C |
| 0x0C | Обороты двигателя | (256*A + B) / 4 RPM |
| 0x0D | Скорость | A км/ч |
| 0x11 | Положение дроссельной заслонки | A * 100 / 255 % |
| 0x42 | Напряжение бортовой сети | (256*A + B) / 1000 В |
| 0x5E | Расход топлива | (256*A + B) / 20 л/ч |
Коды ошибок (Mode 03) возвращают список DTC в формате 2 байта на код. Первые два бита определяют систему: 00 — двигатель (P), 01 — трансмиссия (P1xxx), 10 — шасси (C), 11 — кузов (B). Декодирование кодов в читаемые описания требует базы данных — открытые варианты: CSV из репозитория hfreire/ecu-can-bus-decoder или платная база от OBD Solutions.
Какие ошибки возникают при работе с ELM327 и как их избежать?
Адаптеры ELM327 говорят через AT-команды поверх последовательного порта. Подключение через Classic Bluetooth — BluetoothSocket на Android с UUID 00001101-0000-1000-8000-00805F9B34FB (SPP профиль). На iOS Classic Bluetooth для сторонних приложений закрыт; единственный путь — BLE ELM327 адаптеры (Viecar EA400-P, OBDLink CX) через Core Bluetooth.
Самая частая ошибка при работе с ELM327 — отправить следующий PID-запрос, не дождавшись > (prompt) в ответе. Адаптер буферизует команды непредсказуемо, и вместо значения RPM приложение получает ? или NO DATA. Правильный цикл опроса — последовательный, с таймаутом ожидания промпта ~200 мс:
class OBDConnection(private val socket: BluetoothSocket) { private val input = socket.inputStream.bufferedReader() private val output = socket.outputStream suspend fun sendCommand(command: String): String = withContext(Dispatchers.IO) { output.write("$command\r".toByteArray()) val sb = StringBuilder() var char: Int while (input.read().also { char = it } != -1) { val c = char.toChar() sb.append(c) if (c == '>') break } sb.toString().trim().removeSuffix(">").trim() } suspend fun readPID(mode: String, pid: String): String { return sendCommand("$mode$pid") } } Инициализация адаптера перед опросом обязательна: ATZ (сброс), ATE0 (отключить эхо), ATL0 (без переноса строк), ATSP0 (автовыбор протокола). Без ATE0 парсить ответы значительно сложнее — команда возвращается в потоке вместе с ответом.
Использование корутин с асинхронными таймаутами сокращает время полного цикла опроса в 2 раза по сравнению с блокирующими потоками, особенно при опросе 15+ PID.
Как происходит процесс разработки?
Мы подходим к проекту системно: сначала анализируем требования и совместимость с автомобилями заказчика, проектируем архитектуру, затем реализуем на Kotlin/Android или Swift/iOS. После тестирования на реальных адаптерах публикуем приложение в сторах. Весь процесс включает:
- Аналитика и составление карты PID для целевых авто
- Проектирование модулей: OBD-соединение, база данных, уведомления
- Реализация с использованием Jetpack Compose или SwiftUI
- Тестирование на физических адаптерах (несколько моделей)
- Деплой в Google Play и App Store
Архитектура приложения
На Android — foreground service с низким приоритетом уведомления (иначе Android 8+ убьёт процесс через несколько минут). Service управляет подключением к адаптеру и циклом опроса, UI подписывается через StateFlow. На iOS — foreground-only, поскольку Core Bluetooth работает в фоне только для Heart Rate и некоторых других профилей; опрос идёт пока экран активен.
| Параметр | Android | iOS |
|---|---|---|
| Подключение OBD-II | Classic Bluetooth (SPP) | BLE (только BLE-адаптеры) |
| Фоновый опрос | Foreground service | Только при активном экране |
| Push-уведомления | Firebase | APNs |
| Инструменты | Kotlin, Jetpack Compose | Swift, SwiftUI |
Частота опроса: RPM и скорость — каждые 100-200 мс, температура и расход — каждые 1-2 секунды. Не опрашивайте все PID с одинаковой частотой — это перегружает адаптер и заметно замедляет шину CAN. Для push-уведомлений о приближающемся ТО используем календарь и одометр.
Что входит в нашу работу
Мы сдаём проект под ключ: исходный код приложения, документацию по архитектуре и подключению, инструкции для пользователя, а также помогаем с публикацией в сторах. Предоставляем гарантию на исправление ошибок в течение 3 месяцев после сдачи.
Дополнительно: TPMS и камера салона
Датчики давления шин (TPMS) на большинстве автомобилей работают через отдельный радиочастотный протокол (315/433 МГц) и не доступны через OBD-II. Для их мониторинга нужны внешние BLE-датчики (например, Meneea, Fobo Tire Plus), которые стикуются на вентиль и передают давление и температуру. Интегрируются через стандартный Core Bluetooth / Android BLE API.
Разработка базового мобильного приложения с подключением к ELM327, мониторингом 10-15 PID и чтением DTC: 3-4 недели. Полноценное приложение с историей поездок, геолокацией, расчётом расхода топлива и TPMS: 6-8 недель. Стоимость рассчитывается индивидуально после уточнения целевых платформ и списка поддерживаемых параметров. Свяжитесь с нами, чтобы обсудить ваш проект и получить предварительную оценку.
Получите консультацию по мониторингу автопарка — мы поможем выбрать оптимальный набор датчиков и адаптеров.







