Занимаюсь реверс-инжинирингом CAN шины своего Volkswagen CC. Хочу поделиться некоторыми наработками, так как эта информация разбросана по разныим закоулкам интернета, а то и вовсе не находится. Также спрошу совета, но об этом вконце.
Из общих сведений известно, что в машинах концерна VAG есть три CAN шины: drivetrain, entertainment, comfort. Также в распиновке гейтвея присутствуют extended и instruments cluster (kombi) шины.
Вот сама распиновка:
1 Plus Terminal 15, fuse holder B Fuse 15 and 24 — ro/ws
11 Ground (earth connection 35 in the main strand) — br
5 Komfort-CAN low — or/br
15 Komfort-CAN high — or/gn
6 Antrieb-CAN low — or/br
16 Antrieb-CAN high — or/sw
7 Extended CAN low — gr/rt
17 Extended CAN high — gr/ws
8 Kombi-CAN low — br
18 Kombi-CAN high — ge
10 Infotaiment-CAN low — or/br
20 Infotaiment-CAN high — or/li
*ge = yellow, gr = gray, ro = red, or = orange, br = brown, sw = black, gn = green, li = purple, ws = white
Drivetrain шина работает на скорости 500 кб/с. Entertainment и comfort шины — на 100 кб/с. Если подключаться через диагностический разьем OBD2, у нас не получится слушать траффик шины, а только получать ответы на отосланые запросы.
В моем распоряжении есть контроллер MCP2515, я использовал его в связке с Arduino Nano и подключился к drivetrain шине. Вскоре был разочарован тем, что ардуино очень сильно не хватает скорости для обработки траффика в шине. После замены его на Teensy 3.2 обнаружил по несколько сообщений каждую миллисекунду. Основная цель во всем этом — раскодировать найболее интересные параметры для дальнейшей визуализации.

Вот что мне удалось собрать за несколько "тестдрайвов":
CAN ID: 0x280, частота 10ms
байт 0: 0/8 — нажато/ненажато сцеплений, 1/9 — аналогично когда заведен двигатель и не нажата педаль газа (комбинация двух бит)
байт 1: крутной момент, формула: байт1*2
байт 2 и 3: RPM — (байт3*256+байт2)/4
байт 5: педаль акселератора, диапазон 0-250
0x320, частота 20ms
байт 3 и 4: скорость, формула: (байт4*256+байт3)/200
байт 5 и 6: скорость с поправкой в плюс пару процентов
0x4A0, частота 10ms — 4 пары байт означают значения скорости с 4 колес, по идее с датчика абс
В общем занятие это интересное, но очень трудоемкое. Я сделал такой визуальный сниффер траффика:

Для каждого сообщения в шине по ID рисую 8 бегающих горизонтальных линий, которые соответствуют данным в 8 байтах. Так намного проще заметить кореляцию значений с тем, что происходит с машиной, чем смотреть на постоянно меняющиеся цифры. Кстати, пришлось уделить время оптимизации прорисовки, в результате frame rate упал с 80мс до 1-2.
Вот теперь сам вопрос — кроме тех параметров, которые мне удалось вычислить, меня интересуют следующие:
— буст турбины или давление
— поворот руля (уже нашел)
— нажатие на педаль тормоза + ручник (уже нашел)
— включеная передача (или как минимум задняя) (уже нашел)
— время с часов
— состояние аварийки, поворотников и других ламп (уже нашел)
Буду очень признателен, если кто-то знает, как считывать эти параметры. Вся эта затея в рамках небольшого "проектика", если все получится, опубликую результат :)
UPD: Здесь сводка того, что мне удалось со временем все таки найти


Комментарии 59
Может попадалась информация в каком айдишнике плавают значения от умной клеммы по току разряда/заряда?
Есть готовое решение Can Hacker а также софт под него для компа.

Вот видео где наглядно продемонстрирована работа
Начиная с 21 минуты как раз по теме.
Привет! Тоже занимаюсь обратной разработкой CAN у своего B6. Правда пока ковыряюсь в CAN-Comfort. Вот мои наработки: docs.google.com/spreadshe…RedwFiM8aWbAH5juUaVc/edit
Хорошая сводка! На ее основании можно много чего придумать по салону. Кстати, мне интересно, как проще всего подменять какой то байт в траффике?
Да, я на этом собрал подключение к умному дому, автозапуск, турботаймер и много чего еще планирую…) Всё есть в БЖ. Подменять проще всего, если поставить в разрез CAN'а два модуля по типу MCP2515, если у них и МК хватит скорости, ИМХО
Заценил! Очень крутое решение вопроса с прогревом двигателя :)
Благодарю!
отличный пост, спасибо
Привет. У тебя в 320м стоит знак вопроса по поводу 2 байта. Твое предположение верно, это уровень топлива. Из hex переводим в dec и получаем уровень топлива в литрах. А в 520м ID можно взять пробег автомобиля. Начало в 5 бите (если с 0го считать). Вот я не могу разобраться, у меня в 35B 3 байт (с 0го считаю) — какая то температура. Предполагаю что АКПП, возможно масло. Пока не разобрался что это такое.
а где по ВАГам еще инфу видел?
Спасибо, проверю у себя при возможности. Инфа в инете довольно разрозненная, вот что удалось найти:
vehicle-reverse-engineeri…andom.com/wiki/Volkswagen
wiki.openstreetmap.org/wiki/VW-CAN
docs.google.com/spreadshe…9UStdWLXwKvHJw/edit#gid=0
www.janssuuh.nl/en/blog/2016/03/18/bekende-canids/
Если у тебя получится добыть еще «байты», дай знать. Мне еще интересны уровень наружного освещения и дистанция к впереди едущему авто (из адаптивного круиза), планирую провести соответствующие эксперименты.
Круиза у меня на поло нет, а на клиентских не искал, им этот параметр не интересен. Уровень наружного освещения это что? у меня есть биты ближний, дальний, габариты.
По идее должен быть какой-то параметр с датчика света, который влияет на автовключение фар и подсветку приборки.
тут уж не подскажу, у меня нет датчика света. Если есть такой параметр в васе-диагносте можно его попробовать вытащить запросом.
Расскажи подробнее о проблеме производительности ардуино, насколько часто пропускает пакеты? Народ же как-то пользуется, нигде не упоминалось об этом. Или у тебя производительности не хватало по причине одновременной визуализации на экран?
Траффик с drivetrain шины (к которой я подключился) более нагружен, чем с infotainment, куда как правило подключаются. В случае с подключением к OBD2 пакеты приходят только в ответ на запрос. Когда я пробовал ардуино, ему не хватало ресурсов даже для трансляции траффика в серийный порт. Если прописать фильтр/маску в CAN контроллере и ловить только интересующие пакеты, проблем быть не должно. Или смириться с тем, что некоторая часть траффика теряется. Кстати, я в итоге стал использовать встроенный в teensy CAN контроллер — он имеет больший буффер чем MCP2515.
приветствую! как оптимизировал отрисовку? думаю что при необходимости закрашивал кусок старой линии или дорисовывал кусок новой линии. что означает цвет линии? как выбирал айдишники, которые надо рисовать, а какие не надо
По оптимизации — перерисовывал только линии измененных значений, без перерисовки текста и без очистки экрана. Цвет синий/красный парных/непарных байт, камера плохо передает. По идишках — сначала засниферил весь трафик, выписал идишки и погрупировал так, чтобы влезались на экран. Для анализа траффика сделал такую програмку на питоне: github.com/v-ivanyshyn/pa…ogs/blob/master/README.md
спасибо. а что значит парных или непарных? типа пришел такой же пакет, как предыдущий?
Имеется ввиду номер байта. Так как в пакете до 8 байт, сложно визуально определить номер байта по линии, когда все они одного цвета. Поэтому парные байты синии, непарные красные.
четный нечетный?)
Точно 😁
Комментарий удалён
По всему ВАГу ID в основном те самые. Я встречал по инету ид от ауди, которые подходили мне. Плюс, что моторы, что мультимедиа и навесная електроника взаимозаменяемы по разным моделям.
Комментарий удалён
Спасибо за идею! Попробую поискать время в моторной шине. В Пассате В5 только две шины.
А время с часов по comfort или по infotaiment ходит? Хочу поставить в Passat b5 часы от Фаэтона. Выяснил, что у него часы работают по сan — включается подсветка, выставляется время. Пробовал подключить их к комфортной шине Пассата, ничего не заработало.
Не могу сказать, в какой шине. Управляется и «ходит» время в приборке, так как если ее отключить и включить назад, то время собьется.
Попробую "послушать" шину. У Фаэтона время синхронизируется через GPS, так что, фиг знает, где его искать)
У меня пока в таком виде. Но плата уже разработана, готова
Приветствую! Пишу такой же сниффер. 105 и 205 stm опробовал с полной CanHacker, работают. Прикрутил дисплей на SSD1289., потестил. Вопрос такого плана: не поделишься частью кода по выводу отрезков в зависимости от ID и частоты появления? Напишу и сам, но на грабли зачем лишний раз наступать? Буду премного благодарен
Вот, держи: gist.github.com/v-ivanysh…7466c1bf2bcac47dff4cad83f
спасибо
Добрый день/вечер/ночь .Хочу подобный визуальный сниффер
написать под stm32(занимаюсь только ими, MEG и ардуинок нет).
Прям один в один принцип отрисовки хотел такой.Вопрос: длинна отрезка на каждый байт в зависимости от времени между появлениями байта в определенном ID или содержимого байта?И -цвет с чем связан?
Длина соответствует значению байта. По 8 полос на каждый фрейм кан шини. Цвета синий/красный для парных/непарных индексов байт, чтобы проще потом анализировать, но камера их смешивает.
ок
NIKEYY
Добрый день/вечер/ночь .Хочу подобный визуальный сниффер
написать под stm32(занимаюсь только ими, MEG и ардуинок нет).
Прям один в один принцип отрисовки хотел такой.Вопрос: длинна отрезка на каждый байт в зависимости от времени между появлениями байта в определенном ID или содержимого байта?И -цвет с чем связан?
Кстати, сразу стоит заморочиться с кешированием. У меня полная перерисовка экрана занимала 20мс, а отрисовка только обновленных полос — 2мс. Если нужно, могу скинуть исходник. Удачи и успехов! :)
Как узнали формулу момента?
Использую Polar Fis, который показывает момент на бк. В поларе нужно ввести однажды макс. момент для калибровки. Так что этот коэфициент скорее всего индивидуальный.
Я по опелю сделал чат в телеграмме, это дало хорошее развитие теме. Так что могу такой вариант порекомендовать.
Снифферил я через mcp2515+raspberry pi (can utils) — включая режим подсветки только меняющихся данных и исключая лишние айди.
Также удобно записать дамп и разложить его в экселе по битам.
Да, так же визуализировал массив данных В екселе. Я добавлял вычисляемые колонки, где вставлял формулы с старшем/младшем байтами, строил графики по разным идишкам и потом сопоставлял с графиками скорости, оборотов и тд. Так находил закономерности.
Интересно заморочился!
Полезная информация!
Только страшно смотреть во что превратили автомобильную электронику. Столько шин наплодили. А ведь изначально CAN шина начала внедряться для того, чтобы избавиться от жгутов провода, как следствие их стало еще больше и усложнили.
Разумней было бы использовать две шины для управление двигателем и все остальное и поднять скорость.
Не разумнее, какой нибудь блок может запросто положить шину (или просто провод перетрется где нибудь) и тогда перестанут работать все блоки на шине, поэтому несколько шин это хорошо. А скорость поднимать там незачем, обычно шины работают на скоростях 250+ кбит, этого хватает для передачи всех данных. А там где этого не хватает используют flexray, эзернет, и прочую хрень
А можешь сделать лог сообщений и одновременно записать видео приборки?
В принципе могу. Для какой цели?
По видео можно понять примерные параметры — обороты, скорость, давление масла ит.д. а потом примерно по таймстемпу сопоставить их сообщениями в логе. и таким образом реверснуть основные типы сообщений.
А вообще, глобальная цель — поставить DSG в машину, где она никогда не стояла :)
Занятие трудоёмкое — верно подмечено.
Вопрос, у тебя именно ардуино или чистый AVR?
У меня просто чё-то странная проблема с AVR, не могу нормально инициализировать mcp2515
Ардуино. Пробовал несколько разных либ, вроде все работают.
Да с ардуино проблем нет, есть именно с чистым AVR.
Устройство уже готово, платы изготовлены, элементы распаяны, а с прошивкой не всё гладко :)
Спросить у Эльдара ))
Кто этот человек?
Специалист по вагам )))
highwalker
Кто этот человек?
Блоггер в Ютуб поищи
Он то может и разбирается в электронике, но вряд ли разбирается в данных которые передаются по Кан шине 🤷🏻♂️
Он упрямый и если не сам то найдёт такого человека)))
Storm70
Спросить у Эльдара ))
Ильдара )
Точно, сорян. Хоть Эльдар — это форма имени Ильдар, широко распространенного среди башкир и татар, а также других тюркских народов, мужского имени, но всё же вы правы.
Программу канхакер пробовал для поиска значений?
Пробовал, но не получилось подключиться к ноуту. У меня макбук с виртуалкой. Залил на ардуино прошивку, но на вириуалке не прокидывается юсб подключение.
Кто ищет тот найдет.
Именно, других вариантов тут нет