Реализация мониторинга OBD-II диагностики автомобиля в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация мониторинга OBD-II диагностики автомобиля в мобильном приложении
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация мониторинга OBD-II диагностики автомобиля в мобильном приложении

OBD-II адаптер (ELM327-совместимый или профессиональный) подключается к 16-пиновому разъёму под рулём и говорит с мобильным приложением по Bluetooth Classic, Bluetooth LE или Wi-Fi. Протоколы CAN bus за OBD-II — SAE J1979 (стандарт запроса PID), ISO 15765-4 (CAN), ISO 14230 (KWP2000) — зависят от производителя и года выпуска автомобиля. Задача разработчика: распарсить AT-команды ELM327, декодировать ответы PIDs, интерпретировать коды ошибок DTC.

ELM327 и AT-команды

ELM327 — мост между CAN-шиной автомобиля и последовательным портом. Инициализация и базовые запросы:

ATZ        → сброс адаптера
ATL0       → отключить перевод строки
ATE0       → отключить эхо
ATH0       → отключить заголовки CAN-фреймов
ATSP0      → авто-выбор протокола
0100       → запрос поддерживаемых PIDs (01-20)

Ответ на 0100: 41 00 BE 3F A8 13 — биты показывают какие PIDs поддерживает ECU. 41 — ответ на режим 01, 00 — PID. Следующие 4 байта — битовая маска.

Декодирование:

fun parseSupportedPids(response: String): Set<Int> {
    val bytes = response.trim().split(" ").map { it.toInt(16) }
    if (bytes.size < 6 || bytes[0] != 0x41 || bytes[1] != 0x00) return emptySet()

    val supported = mutableSetOf<Int>()
    var bitMask = (bytes[2].toLong() shl 24) or (bytes[3].toLong() shl 16) or
                  (bytes[4].toLong() shl 8) or bytes[5].toLong()

    for (bit in 31 downTo 0) {
        if ((bitMask and (1L shl bit)) != 0L) {
            supported.add(32 - bit)
        }
    }
    return supported
}

Bluetooth Classic vs Bluetooth LE

ELM327-клоны работают по Bluetooth Classic (SPP profile). На Android — BluetoothSocket с UUID 00001101-0000-1000-8000-00805F9B34FB. На iOS Bluetooth Classic недоступен для сторонних приложений — только через MFi-сертифицированные аксессуары или Wi-Fi адаптер.

Поэтому для кросс-платформы Flutter рекомендуем Wi-Fi ELM327 адаптеры (TCP 192.168.0.10:35000) или BLE-адаптеры нового поколения (OBDLink MX+, Veepeak OBDCheck BLE+):

class OBD2WifiConnector {
  late Socket _socket;
  final StreamController<String> _responseController = StreamController();
  Stream<String> get responses => _responseController.stream;

  Future<void> connect(String host, int port) async {
    _socket = await Socket.connect(host, port,
        timeout: const Duration(seconds: 5));

    _socket.listen(
      (data) {
        final response = String.fromCharCodes(data).trim();
        if (response.endsWith('>')) {
          final clean = response.replaceAll('>', '').trim();
          if (clean.isNotEmpty) _responseController.add(clean);
        }
      },
      onError: (error) => _reconnect(),
    );

    await _initializeAdapter();
  }

  Future<String> sendCommand(String command) async {
    final completer = Completer<String>();
    late StreamSubscription sub;
    sub = responses.first.asStream().listen((response) {
      sub.cancel();
      completer.complete(response);
    });
    _socket.write('$command\r');
    return completer.future.timeout(const Duration(seconds: 3));
  }
}

Опрос PIDs в реальном времени

Популярные PIDs режима 01 (реальное время):

PID Параметр Формула
0C Обороты двигателя RPM (A*256+B)/4
0D Скорость км/ч A
05 Температура охлаждающей жидкости °C A-40
0F Температура впускного воздуха °C A-40
11 Положение дроссельной заслонки % A*100/255
04 Нагрузка двигателя % A*100/255
0B Давление коллектора kPa A

Опрос нескольких PIDs последовательно с минимальной задержкой:

Future<void> startPolling(List<int> pids) async {
  while (_isPolling) {
    for (final pid in pids) {
      final pidHex = pid.toRadixString(16).padLeft(2, '0').toUpperCase();
      final response = await sendCommand('01$pidHex');
      _parsePidResponse(pid, response);
      await Future.delayed(const Duration(milliseconds: 50));
    }
  }
}

50 мс между запросами — минимум для стабильной работы большинства адаптеров. Быстрее — риск переполнения буфера ELM327.

Чтение и сброс кодов ошибок DTC

Режим 03 — запрос активных DTC (Diagnostic Trouble Codes):

fun parseDtcResponse(response: String): List<String> {
    val bytes = response.trim().split(" ").map { it.toInt(16) }
    val dtcs = mutableListOf<String>()

    var i = 2  // пропускаем режим и количество
    while (i + 1 < bytes.size) {
        val byte1 = bytes[i]
        val byte2 = bytes[i + 1]
        if (byte1 == 0 && byte2 == 0) break

        val prefix = when ((byte1 shr 6) and 0x03) {
            0 -> "P"; 1 -> "C"; 2 -> "B"; 3 -> "U"; else -> "P"
        }
        val digit2 = (byte1 shr 4) and 0x03
        val digit3 = byte1 and 0x0F
        val digits45 = byte2.toString(16).padStart(2, '0').uppercase()
        dtcs.add("$prefix$digit2$digit3$digits45")
        i += 2
    }
    return dtcs
}

P0300 — случайные пропуски зажигания, P0171 — бедная смесь, P0420 — катализатор банк 1. Расшифровка DTC — отдельная база данных (SAE J2012 для стандартных, OEM для производителей).

Сброс ошибок: режим 04, команда 04. Подтверждение через диалог обязательно — сброс удаляет данные готовности (Readiness Monitors), что может привести к отказу в техосмотре.

Разработка приложения OBD-II диагностики с BLE/Wi-Fi подключением, опросом PIDs и чтением DTC: 3-5 недель. Добавление расшифровки DTC, трендов и поддержки нескольких автомобилей: 6-8 недель. Стоимость рассчитывается индивидуально.