Подключение к ECU автомобиля через OBDII

102
26 июня 2021, 18:40

Я начинающий Android-разработчик. Хочу написать приложение для чтения ошибок с авто. Пытаюсь прочитать телефоном информацию с авто по USB без использования ELM327. Согласно стандарту OBDII, запрос должен выглядеть примерно так:

The functional PID query is sent to the vehicle on the CAN bus at ID 7DFh,
using 8 data bytes
0x7DF    0x02 0x01 0x05 0x00 0x00 0x00 0x00 0x00

где 0x7DF - ID запроса;

0x02 - количество байт, которые нужно считать;

0x01 - Сервис;

0X05 - Parameter ID (температура охлаждающей жидкости);

Остальные байты должны игнорироваться.

Здесь я столкнулся с проблемой того, что ID запроса занимает 11 бит и я не могу просто отправить запрос одним массивом.

byte diagnosticId = (byte) 0x7DF; // Это неправильно, показано для примера.
byte[] request = {diagnosticId, 0x02, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};

Для работы по USB я использовал эту библиотеку

Подскажите, как я могу отправить запрос такого формата. Может быть нужно переписать библиотеку или как-то упаковать ID запроса, разбив его на 2 байта? Но я не уверен, что он правильно прочитается ECU...

Я находил несколько решений для отправки таких пакетов реализованных на С++. Но там огромное количество кода, которое связано между собой, и я пока хотел бы избежать внедрения нативного кода на этом этапе...

Answer 1

Согласно документации OBD2 (с трудом представляю себе что это) - написано, что идентификатор запроса (11 бит) должен быть упакован в 2-х байтовое слово (16 бит) - в терминах Java это переменная типа short, это можно сделать так:

short diagnosticId = ByteBuffer.wrap(new byte[]{0x07, 0xDF}).getShort();

Или в байтовых массивах так:

byte[] diagnosticId = {0x07, 0xDF}; 

Update

Как говорится в некоем спец форуме:

When receiving a message with an 11-bit ID, only the lower 11 bits will be filled

Что и подразумевает, что из 16 бит будет заполнены нижние 11 битов. Если идентификатор 29 битовый то тогда заполняются из 32 битов только нижние 29

READ ALSO
Как в теле запроса soap указать элемент boolean?

Как в теле запроса soap указать элемент boolean?

Вот тело запроса по схеме:

121
RecyclerView внутри RecyclerView или по другому

RecyclerView внутри RecyclerView или по другому

Создаю расписание, в нём есть день недели, время, предметВсё хранится в json получает по средством запроса на сайт

186
Валидация на пустые поля формы js

Валидация на пустые поля формы js

Есть форма, если одно из полей не заполнено нужно чтобы форма не отправлялась и рамка подсвечивалась красным и вылезала подсказка "Поле не может...

120
Как сделать задержку парсинга на node.js?

Как сделать задержку парсинга на node.js?

суть вопроса: У меня есть скажем 12 000 страниц одного сайта, при обычном парсинге с помощью request и cheerio через несколько страниц сайт падает с ошибкойКак...

111