Реалізація моніторингу 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
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація моніторингу 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 тижнів. Вартість розраховується індивідуально.