Возможно это неисправность протокола j1939 в CAN-шине коммерческого транспорта. Проведём реверс-инжиниринг логов Вичай и Ючай. Что это системный сбой, банальный глюк, ошибка в прошивке, а может это эхо?

На периферии двух гигантов инженеры Weichai vs Yuchai. Интересно кто умней? Ответ на этот вопрос я не знаю. Но когда разбираем логи j1939 ты понимаешь, перед тобой две школы китайской инженерии.

Запуск ДВС Ючай:

С пол оборота. При включении зажигания можно сразу, без паузы, крутить ключ на старт - мотор идёт на запуск.

Запуск ДВС Вичай:

Плюс минус на третьей прокрутке стартера. Если при включении зажигания сразу попытаться запустить мотор, стартер часто не срабатывает. ЭБУ нужна пауза несколько секунд, и только потом происходит запуск. Блок явно чем-то занят перед стартом ДВС.

Но самое интересное под капотом CAN-шины

  • Инструменты >> для анализа трафика j1939 использую две свои утилиты на С.

  • Карта ( map_id_j1939_nosemi ) >> даёт общую картину сети.

  • Микроскоп ( viz_j1939 ) >> раскладывает фрейм по битам и байтам.

  • ОС и Железо >> Linux / CANable

Анализ Yuchai << Картой >>

Смотрим поле сообщение с блока на блок ни каких аномалий
Смотрим поле сообщение с блока на блок ни каких аномалий

Анализ Weichai << Картой >>

Смотрим поле сообщение с блока на блок Источник ДВС (0) Блок Назначение ДВС (0) Сообщений 210
Смотрим поле сообщение с блока на блок Источник ДВС (0) Блок Назначение ДВС (0) Сообщений 210

Анализ Weichai << Микроскопом >>

Пишем фильтр viz_j1939.c

byte1 = (id >> 16) & 0xFF;
byte2 = (id >> 8) & 0xFF;
byte3 = id & 0xFF;
if (byte1 < 240 && (byte2 == 0 && byte3 == 0))
Смотрим поле ID байты читаем слева на право от нуля. Байт 1 - 157 [0x9D] фрейм адресный. Байт 3  адрес источника. Байт 2 адрес назначения. С блока ДВС на блок ДВС.
Смотрим поле ID байты читаем слева на право от нуля. Байт 1 - 157 [0x9D] фрейм адресный. Байт 3 адрес источника. Байт 2 адрес назначения. С блока ДВС на блок ДВС.

Просмотрел все сообщения поле данных не изменилось ни на один бит.

Гипотеза 1:

Ошибка утилиты. Но на Ючай ничего подобного я ни когда не вытягивал.

Гипотеза 2:

Я сначала подключился CANable запустил candump на запись, потом включил зажигание. При подаче питания система активируется. Просыпаются блоки ABS, EBS, ECAS и так далее. Возможно переходной процесс.

Беру данные после включения зажигания.

Гипотеза 3:

Эхолокация, запрос, мониторинг, цифровая обратная связь. ЭБУ ДВС отправляет сообщение в сеть. Этот фрейм возвращается и блок анализирует, по идее, поле данных. Даже не знаю что сказать!?

Вот такая загадка инженеров Weichai.

Низкоуровневая работа с сырыми Hex-данными через самописный софт позволяет увидеть реальные инженерные решения, которые скрыты от глаз диагностов за красивой обёрткой сканера.

При этом сам процесс разделяется на две стадии: ты можешь собрать сырые логи в полевых условиях с помощью Linux и CANable, а вот анализировать их и изучать CAN-шину - уже дома, комфортно лёжа на диване в Termux на обычном планшете. Всё, что нужно для реверса - это данные.

Листая Хабр, я поймал себя на мысли, что со своим чистым Си и консольными утилитами для CAN-шины я смотрюсь там как "здравствуй, среди ночи". Вокруг сплошной веб и модные фреймворки. Ребята, неужели Си и низкоуровневое программирование сейчас не востребованы? Или все спецы просто в тени?

На данный момент я ищу работу или стажировку в сфере низкоуровневого программирования. Мечтаю полностью перейти в эту индустрию, чтобы развивать свои навыки программирования на С. Открыт для предложений.

Исходники доступны на GitHub [ https://github.com/Data7Viz/data7-can]

Канал для связи [ https://vk.ru/j1939]