Как перехватить сообщения CAN J1939? - PullRequest
0 голосов
/ 01 ноября 2018

Я строю тест HIL / SIL с Simulink, который проверяет блок управления транспортным средством (VCU) от транспортного средства. Этот VCU взаимодействует с модулем распределения питания (PDM) по сети CAN J1939. PDM обрабатывает входы и выходы от переключателей и исполнительных механизмов и выводит информацию на шину CAN. Затем VCU знает, что PDM видит из подключенных датчиков. В свою очередь, VCU помещает на шину CAN информацию о том, как PDM должен управлять подключенными приводами.

Мой ноутбук подключен к той же шине CAN с векторным адаптером и Simulink.

Чтобы проверить VCU, мне нужно имитировать PDM и отправлять сообщения в VCU, как если бы я был PDM. Затем VCU должен предпринять правильные действия и соответственно контролировать реальный PDM.

Очевидно, что если я просто имитирую PDM, мои сообщения будут мешать тем, которые отправляются с реального PDM. В общем, мне нужно, чтобы PDM заткнулся и только слушал. Я разговариваю за ДПМ. Однако PDM не настраивается в режиме только для прослушивания, поэтому мне приходится перехватывать все отправляемые им сообщения, чтобы они никогда не поступали в VCU.

Моя идея состояла в том, чтобы я обнаружил (наблюдая поле арбитража всех сообщений), когда PDM начинает отправку, и потянул немного вниз в поле арбитража. Он распознал бы приоритет моего «сообщения» над своим собственным и прекратил бы передачу. Было бы так, как будто шина CAN всегда занята, чтобы освободить место для PDM. Это закроет PDM без ошибок. Но другие предложения приветствуются.

Так (как) возможно ли перехватывать сообщения CAN J1939 в MATLAB / Simulink или с отдельным контроллером CAN?

1 Ответ

0 голосов
/ 02 ноября 2018

Вот идея, как реализовать то, что вы ищете. Однако вам нужно дополнительное оборудование.

Это грубый набросок:

  • Настройка устройства CAN-шлюза, которое имеет два независимых интерфейса CAN can0 и can1.
  • Отключите PDM от CAN-шины и подключите его к одному из интерфейсов вашего CAN-шлюза, например, can0
  • Подключите второй интерфейс CAN-шлюза, can1, к исходной шине CAN, которая также включает ваш ноутбук и VCU
  • Запрограммируйте шлюз CAN для пересылки всех входящих кадров CAN на can1 на интерфейс can0
  • Поскольку вы хотите игнорировать все сообщения от PDM, просто игнорируйте CAN-кадры, поступающие на интерфейс can0, а , а не , перенаправляйте их на can1

Пример, как реализовать такой CAN-шлюз:

  • Оборудование: используйте плату расширения Raspberry Pi и CAN с двумя can-интерфейсами, такими как плата PiCAN2 duo .
  • Программное обеспечение: Напишите небольшую программу для пересылки трафика между интерфейсами can0 и can1, используя socketcan , который уже включен в ядро ​​Linux.
  • В случае, если ваши устройства обмениваются данными через транспортный протокол J1939 более высокого уровня, вам также может потребоваться запустить транспортный протокол J1939 на Raspberry Pi. Если вы просто используете 29-битные идентификаторы с максимальной полезной нагрузкой в ​​8 байт данных, это также не должно быть необходимым.
  • В качестве альтернативы вы также можете использовать более дорогое коммерческое решение, например CAN-Router .

Ваша оригинальная идея:

Я думаю, что то, что вы предполагаете, технически возможно, но может иметь и другие недостатки.

  • Поскольку драйверы контроллеров жестких дисков обычно не предоставляют интерфейсы для интерактивного манипулирования CAN-кадрами, пока их передача еще продолжается, вы можете напрямую обратиться к приемопередатчику can из микроконтроллера
  • Несколько исследователей реализовали атаку отказа в обслуживании CAN , превратив первый рецессивный бит в кадре CAN после идентификатора арбитража в доминирующий бит для некоторых выбранных идентификаторов CAN-ID. Они использовали трансивер Arduino Uno и микросхемы MCP2551 E / P CAN. Используемый код также доступен онлайн . Поскольку это интерактивное манипулирование CAN-кадрами во время передачи связано с тем, что вы ищете, это может быть хорошей отправной точкой для вас.
  • Тем не менее, я вижу некоторые недостатки, когда вы отключаете PDM следующим образом:
    • Таким образом, вы не только отключите PDM, но и (по крайней мере) задержите передачу других узлов по шине CAN с идентификаторами арбитража, которые имеют более низкий приоритет, чем сообщения от PDM
    • Весьма вероятно, что PDM перейдет в состояние ошибки, когда он не сможет успешно отправить свои CAN-кадры на шину после определенного числа попыток

Еще одна идея:

Если вы можете адаптировать программное обеспечение VCU, измените его таким образом, чтобы оно не потребляло CAN-кадры из PDM, а CAN-кадры с вашего ноутбука, используя разные идентификаторы CAN для одного и того же Сообщения. Для этого вам придется изменить dbc-файл.

...