Всем привет.
Когда то я загружал видео на пикабу с разбором значений can шины автомобиля. Но тогда пост не стрельнул. После этого статья была переписана в виде статьи с большим количеством поясняющих изображений. Эта статья изначально была опубликована на Хабре (где получила хорошие отзывы), а сегодня я решил еще раз попробовать рассказать по этом на пикабу. Тематика тут явно не пикабушная, потому посмотрим, стоит ли продолжать тут эту тему.
Сегодня мы поговорим о методах расшифровки данных CAN шины на примере автомобиля VW Polo Sedan 2019 года выпуска. В интернете такие статьи часто называют Хаками CAN шины, но мне такое название не по душе.
В статье описаны методики поиска нужных данных в CAN шине автомобиля, примеры применения этих методик на VW Polo Sedan. В качестве оборудования для подключения к CAN шине используется Vega MTX. Еще чуть-чуть поговорим о телематике.
Подключение к CAN шине произведено в двух местах: за приборной панелью (шина 500 Kbit/s) и за магнитолой (100 Kbit/s). Так же есть одно дублирующее подключение — подключение к разъему OBDII непосредственно на самом разъеме (500 Kbit/s).
Из использованных инструментов: блок мониторинга транспорта Vega MTX, оснащенный CAN сканером. Для его настройки на ПК программа Конфигуратор 1.27.14.
Больше информации о подключении к автомобилю и о MTX можно получить из видео, которое будет в конце статьи.
При подключении ко всем CAN шинам мы увидим такую картину:
В этом потоке данных надо найти те биты и байты, которые отвечают за нужные нам параметры.
На скриншоте ниже показано сколько датчиков в данный момент прописано в блоке телематики, и это еще не полный список. Можно уходить еще глубже и искать еще большее количество датчиков. Часть из этих датчиков в режиме реального времени отсылает показания на сервера, что позволяет в любой момент видеть состояние своего автомобиля.
Телематика — тема для отдельной статьи, поэтому не будем тут подробно на этом останавливаться.
Сразу появляется вопрос — зачем нужно искать данные в потоке, если можно их увидеть через ELM327 или другие диагностические приборы?
Здесь уже вопрос в том, для чего нам нужны эти данные. В нашем случае данные нам нужны для телематики, и, чтобы не вмешиваться в работу CAN шины, и не слать в нее ни каких данных, мы ищем их в потоке. В Vega MTX есть специальный режим работы с CAN шиной — режим «прослушивания». Режим говорит сам за себя, оборудование только слушает кан шину и ничего в нее не отправляет, тем самым минимизируя какие либо воздействия на штатную систему автомобиля.
К примеру датчик на открытие двери. Если мы будет его спрашивать запросом, то мы сможем это делать только на включенном зажигании. После выключения зажигания и засыпания CAN шины этот датчик будет нам недоступен. Если же мы найдем этот датчик в CAN потоке, то мы будем его видеть все время, когда работает CAN шина. А, при открытии двери, CAN будет просыпаться автоматически.
Также следует понимать, что все приведенные ниже примеры актуальны только для Polo Sedan в комплектации connect. В других комплектация может не быть каких-то из приведенных датчиков, а для других марок и моделей автомобилей данные будут находится совершенно в других ID.
Обращаю внимание, что по умолчанию в Конфигураторе стоит отображение значений в HEX формате. В дальнейшем нам не раз придется переводить данные из HEX формата в десятичные значения. Легче всего это сделать с помощью встроенного в Windows 10 приложения Калькулятор. Переводим его в режим “программист” и у нас появляется выбор, в какой системе счисления вводить данные, и они дублируются в других системах счисления.
По методу поиска все датчики в автомобиле я разделяю на несколько типов:
1. Бинарные датчики.
2. Быстро меняющиеся датчики.
3. Температурные датчики.
4. Пробег автомобиля.
5. Датчики уровня.
6. Датчики индикации.
7. Датчики с запросами.
Теперь перейдем к методам, с помощью которых можно найти каждый тип датчиков.
1. Бинарные датчики
Начнем с самых простых датчиков, бинарных.
К этим датчикам относятся датчики дверей, ремни безопасности, тормоз (горят ли стоп сигналы), ручной тормоз, нажаты ли кнопки и т.д. Их значение помещается в 1 бит, то есть может быть 0 (дверь закрыта) или 1 (дверь открыта).
Поиск их прост, но требует внимательности. Для поиска двери водителя надо открывать/закрывать дверь и смотреть, что меняется в CAN шине.
Конфигуратор подсвечивает красным те данные, в которых были изменения в течении нескольких последних секунд.
В нашем случае за дверь водителя отвечает нулевой бит первого байта сообщения с ID 470.
В том же байте лежат датчики все остальных дверей + датчик багажника.
2. Быстро меняющиеся датчики
Быстро меняющиеся датчики похожи на бинарные датчики, только их значение больше, чем 1 бит. На эти датчики мы можем воздействовать и сразу же видеть изменения в CAN — шине.
К таким датчика относятся большинство датчиков положения: положения педали газа, положение стекол, положение АКПП, положение ключа зажигания. Помимо них это датчики скорости, оборотов, датчики ускорения руля, ускорения педали газа и т.д.
Для начала разберемся с датчиками положения на примере датчика положения педали газа.
Для этого глушим автомобиль, включением зажигание и, не заводя двигателя, нажимаем на педаль газа и следим за изменением в CAN шине.
Как правило, при отпущенной педали газа значение этого датчика 0, и, по мере нажатия на педаль газа, увеличивается до какого либо значения. Такой параметр мы видим в первом CAN в ID 280. Пятый байт изменяется от 0 (педаль отпущена) до FA (педаль нажата “в пол”).
Если перевести FA из HEX в DEC, то получим число 250. Следовательно, чтобы получить нажатие на педаль газа в процентах (от 0 до 100) надо умножить наше значение на 0.4.
Теперь перейдем к датчикам, которые не влезают в один байт, например, к оборотам двигателя. Плавно повышаем и понижаем обороты двигателя, при этом смотрим, что меняется в CAN шине. Обороты двигателя находятся в том же ID, что и педаль газа.
Поработав педалью газа можно понять, что данные тут стоят в обратном порядке. То есть старшая часть находится в 3м байте (считаем байты с нулевого), а младшая во втором байте.
Дальше надо перевести данные из HEX в DEC.
Дальше надо оценить реальные обороты по тахометру, или по диагностическим приборам. В моем случае стрелка была, примерно на 1600 об/мин по тахометру.
Дальше делим данные из CAN в десятичном формате (6508) на обороты двигателя с тахометра (1600) получаем 4.0675. Учитывая погрешность определения оборотов на глаз, округляем делитель до 4. После этого надо проверить показания по нескольким точкам. Для этого педалью газа выставляем разные обороты двигателя и сверяем их с данными из CAN шины.
В конфигураторе можно подставить все коэффициенты в настройки датчика и в режиме реального времени смотреть за изменениями оборотов.
Таким образом ищется большое число датчиков: усилия на тормозе, положение руля, ускорение руля, скорость автомобиля и т.д.
3. Температурные датчики
В Polo Sedan найти температуру было очень сложно. Для начала был найден байт, который медленно изменялся в большую сторону при нагреве автомобиля. После этого начинались поиски нужных коэффициентов.
Подключаем диагностику, выбираем температуру двигателя, и сравниваем показания CAN шины и данных из диагностики. Строим таблицу соответствия и подбираем коэффициенты.
В результате подбора коэффициентов появилась формула для расчета температуры.
XX* 0.75 — 48
где XX — значение 1 байта из ID 288 в DEC.
по формуле можно подсчитать, что на скриншоте была температура
179 * 0.75 — 48 = 86.25 °C.
где 179 это переведенное в десятичную систему число B3 из первого байта ID 288.
Но это тяжелый случай, на многих авто температура ищется намного легче.
Так как в шине сложно передать отрицательное число, то производители в качестве 0 измерений принимают значение -40°C, -48°C или -58°C. Поэтому подключаем диагностику и смотрим, какое сейчас значение температуры. Прибавляем к этому значения 40 (48 или 58), и переводим в HEX. Ищем полученное число в потоке. Ждем когда температура машины изменится на один градус и сверяем с найденным значением. Если его значение тоже увеличилось на 1, значит это нужный нам датчик.
Важно не путать значения из CAN шины со значениями диагностических запросов. Если одновременно будете искать показания в шине и будет подключен диагностический прибор, то в шине появятся еще и ответы на диагностические запросы. Их можно определить по ID. Обычно все, что идет свыше 700 ID — диагностические запросы и ответы.
Так же температуру охлаждающей жидкости всегда можно сделать запросом, о данном методе будет описано ниже в разделе о датчиках с запросами.
Можно для поиска температуры воспользоваться и другим методом: находим физически датчик температуры охлаждающей жидкости (ДТОЖ) на двигателе, отключаем его и подключаем к проводке автомобиля переменный резистор. Далее вращая резистор и следя за CAN шиной по методике поиска быстро меняющихся данных, можно найти показания температуры двигателя.
На практике таким методом не пользовался, так как ТОЖ всегда находилась или в потоке, или спрашивали машину запросом.
4. Пробег автомобиля
Один из самых важных параметров для телематики.
Для начала надо оценить, каких размеров мы ищем число. Если взять 2 байта (16 бит) данных, то в них максимум влезет число FF FF = 65 535. Автомобиль явно может проехать свыше 65 тысяч, значит пробег автомобиля должен быть минимум 24 бит длинной. Туда уже влезет 16 млн. км., что явно достаточно для пробега.
Но опять же, в разных автомобилях по разному. В Polo Sedan пробег пишется в км, в некоторых французах он передается с точностью до 100 метров. тогда число может занимать и 32 и больше бит.
Дальше для поиска следует взять пробег с приборной панели автомобиля и перевести его в HEX.
В нашем случае это 5732 км. Переводим его в HEX и получаем 16 64. Дальше поиском надо найти строку, где будет встречаться эта комбинация. Искать надо по одному байту, то есть сначала искать 16, потом в найденых вариантах смотреть, есть ли рядом с числом 16 еще и число 64. Число 64 может быть как слева, так и справа от числа 16. Так как пробег в этом автомобиле не большой, то, вероятнее всего, рядом с числом 64 так же будет 00. В Конфигураторе есть удобный поиск (CTRL + F), если пользуетесь другим инструментом, то придется искать вручную эти данные.
В нашем случае пробег найден в 520 ID
00 16 64 = 5732 км.
Для проверки желательно проехать еще несколько километров и проверить значение найденного датчика.
Таким же образом ищется пробег до заправки. В этом автомобиле приборная панель пробег до заправки не передает в шину, поэтому он сделан запросом.
6. Датчики уровня
Второй наиболее важный датчик для телематики — датчик уровня топлива. Можно его найти или в потоке, что предпочтительно, или запросом (менее предпочтительно, но в некоторых авто по другому не получится).
Для начала надо найти показания уровня топлива в диагностическом приборе. У меня уровень топлива нашелся в комбинации приборов (17 блок). В комбинации приборов показания с датчика уровня идут в литрах.
Сейчас в автомобиле 21 литр топлива.
Переводим 21 из DEC в HEX и получаем число 15. Поиском пробуем найти его. В потоке находится данное число в ID 320. Если число не находится, то нужно попробовать искать значения на единицу больше или меньше. В некоторых авто топливо идет с точностью в пол литра, потому надо поискать значение в 2 раза больше.
После того, как найден уровень топлива надо залить в автомобиль несколько литров топлива и посмотреть за результатом.
Так же можно разобрать бензобак, вытащить ДУТ из бака и перемещать его, следя за показания CAN шины. Или же снять разъем с ДУТ и подключить туда переменный резистор. Вращая его и следя за изменениями можно найти датчик уровня топлива. Если решили разбирать, тогда уровень топлива следует искать по методике поиска быстро меняющихся датчиков.
Так же при поиске не следует брать во внимание данные с ID свыше 700. Это диагностические запросы. После отключения диагностического оборудования эти данные пропадут. Более подробно с запросами мы разберемся ниже.
К примеру ответ на запросы диагностического оборудования уровня топлива из приборной панели выглядит так.
Также уровень топлива (в процентах) можно найти в стандартных OBDII запросах, но на VAG группе они не всегда показывают верные данные. На Skoda Rapid и Skoda Oktavia при полном баке диагностика показывает уровень топлива 85 %.
6. Датчики индикации
Датчики индикации сильно похожи на бинарные датчики, и искать их следует по той же методике. К этим датчикам относятся разнообразные иконки на приборной панели. К примеру состояние значка Check Engine находится в первом байте ID 480. При включении зажигания в этом датчике 2С.
После запуска, когда погаснет значок Check Engine (CE) в этом датчике будут 00.
Теперь остается вопрос, какой именно бит отвечает за значок CE. Переводим 2C в BIN и получаем число 0010 1100.
Дальше копируем весь 480 ID, изменяем первый байт на 2C (0010 1100) и пробуем посылать этот пакет в автомобиль.
Внимание!, слать данные в автомобиль не всегда безопасно, можно что нибудь сломать, или накрутить пробег. Прибегать к этому методу стоит только в случае, если датчик не смогли найти методом поиска бинарных датчиков.
В моем случае я слал в заведенный авто (что делать не рекомендуется) и у меня на приборке моргает значок CE и EPC.
Дальше посылаем вместо 2C (0010 1100) 08 (0000 1000). На приборке начинает моргать CE. Следовательно 3 бит отвечает именно за эту иконку.
Если слать 04 (0000 0100), то моргает значок EPC.
7. Датчики с запросами
Не все данные можно найти в потоке. К примеру в дизельном VW Transporter T4 в потоке нет температуры двигателя. Ее нет и на приборке. Поэтому приходится автомобиль спрашивать об этих параметрах. То же самое относится к уровню топлива на Rio\Solaris.
В этом примере попробуем спросить уровень топлива Polo Sedan. Заходим в 17 блок, как это мы делали в пункте про поиск уровня топлива, и спрашиваем приборную панель. Проанализировав запросы мы видим, что диагностика спрашивает уровень топлива следующей командой:
Дальше копируем ID 714, отключаем диагностический прибор и пробуем послать в автомобиль запрос. Если в ID 77E приходит такой же ответ, какой был при подключенной диагностике, то мы получили пакет с уровнем топлива (4 байт. HEX 15 = DEC 21 ) 21 литр.
В Vega MTX есть встроенные средства работы с датчиками с запросами. Там можно настроить, что бы запросы слались после включения зажигания с определенным интервалом или при соблюдение каких то условий.
На этом заканчиваю с методикой поиска данных в CAN шине. Если кто знает еще какие методики поиска нужных данных в CAN шине или поделится своим опытом, то с удовольствием выслушаю их.
До написания данной статьи делал видео по этой теме. В видео есть больше информации по подключению к CAN шине автомобиля, работе с Конфигуратором и файловым сервером
Ссылка на Конфигуратор
На сервере есть настройки для некоторых легковых автомобилей, грузовиков и сельскохозяйственной техники. Все файлы лежат в зашифрованном виде, можно увидеть какие датчики видны в CAN автомобиля. При подключении будут видны значения датчиков, но посмотреть адреса не получится.
Продолжение следует.
Уже на подходе статья о управлении внешней нагрузкой с руля, впрочем мои подписчики в инстаграмм и вк уже в курсе.
Я ВКонтакте
https://vk.com/fokin_alexeyЯ в инстаграмм https://www.instagram.com/fokin91_smart/
Я на драйв 2 https://www.drive2.ru/users/as91/#blog