Я начинающий 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...
Я находил несколько решений для отправки таких пакетов реализованных на С++. Но там огромное количество кода, которое связано между собой, и я пока хотел бы избежать внедрения нативного кода на этом этапе...
Согласно документации 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
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости