Создание Android приложения OBD Car Doctor для диагностики параметров автомобиля в онлайн режиме через OBD II Bluetooth адаптер

Идея подключить смартфон к бортовой системе машины возникла давно, а своеобразным толчком послужила статья об электронной начинке современных авто и CAN шине, обеспечивающей обмен данными различных устройств, подключенным  к этой шине. 

Иследование возможных способов подключения к авто показало, что для подключения нужно использовать диагностический разъем DLC - Data Link Connector, который служит для соединения бортовой сети авто с диагностическими сканерами и опроса/съема данных различных подсистем автомобиля. Проблема большого количества и разнообразия марок авто, сканеров, коннекторов была разрешена благодаря одному из экологических ведомств США - California Air Resources Board - CARB, которое отвечает за контроль выбросов автомобилей. Сегодня актуальным является свод стандартов OBD-II, который описывает механические (форма и размер разъема), электрические (питание, сигнальные протоколы) и логические (информационные протоколы) уровни совместимости. Здесь следует обратить внимание, что соответствие одному из параметров еще не гарантирует соответствия остальным. Т.е. Наличие правильного механического разъема в автомобиле не гарантирует соответствия стандарту сигнальных и логических протоколов, то есть не обязательно обеспечивает соответствие OBD-II стандарту.  Рассмотрим вышеупомянутые уровни совместимости:

  • Механически это трапециевидный разъем фиксированного размера с 16 контактами.
  • На электрическом уровне поддерживаются 5 основных сигнальных протоколов:

- SAE J1850 PWM

- SAE J1850 VPW

- ISO 9141-2

- ISO 14230 KWP2000

- ISO 15765 CAN

  • Логический уровень предполагает отсылку сообщений заданной структуры и соответственно получение структурированного ответа.  Пакет состоит из заголовка, тела сообщения, контрольной суммы <header><body><crc>.

Рассмотрим структуру тела запроса

Структура <body> представляется как <mode><pid>. 

  • <mode> (1 байт) определяет функциональную группу параметров, например 01 – параметры реального времени, 02 – «снимки» параметров на момент возникновения ошибки и т.д.
  • <pid>(1 или 2 байта) — Parameter ID, идентификатор запрашиваемого параметра в контексте группы, например для mode 01 pid 0D отвечает за текущее значение скорости автомобиля. 

Например, 68 6C F1 01 0D A6, где header = 68 6C F1, body = 01 0D, crc = A6.  

Структура тела ответа содержит код возврата:

  • для положительного ответа <mode+0x40>< pid >
  • для информации об ошибке 7F<pid | mode>
  • затем собственно возвращаемое значение <header><body><crc>. 

Например,  48 6B 10 41 0D 00 11, где header = 48 6B 10, body = 41 0D 00, crc = 11, т.е. собственно возвращаемое значение 00  

В результате, мы получаем набор команд, охваченных стандартом, при этом разные модели машин поддерживают небольшую часть данного списка. Кроме того, OBD-II стандарт предусматривает наличие пользовательских команд, специфичных для определённых производителей и моделей, однако публичная информация по этим командам практически отсутствует.    

Подводим итоги.  Мы получили список параметров, которые описаны стандартом и которые, при условии поддержки со стороны автомобиля, можно прочитать. Обычно это динамическим параметры, которые можно отслеживать в реальном времени (скорость, обороты, температура, параметры с лямбда датчиков, параметры по которым можно вычислить расход топлива и т.п.); ошибки, приводящие к включению индикатора CheckEngine; некоторые результаты самодиагностики бортовых систем авто. Также может поддерживаться команда сброса информации об ошибках. Также, гипотетически возможно добраться до пользовательских параметров автомобиля, список которых на много больше стандартного. Этой статьей мы начинаем цикл заметок о разработке программ и приложений для автомобилистов.

Подробную статью, а также ее продолжение можно прочитать в блоге нашей компании на ресурсе Хабрахабр.