Как перехватить сообщения J1939 CAN?
Я строю тест 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 ответ
Вот идея, как реализовать то, что вы ищете. Вам нужно дополнительное оборудование, однако.
Это грубая схема:
- Настройка устройства 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, такими как плата DuC PiCAN2.
- Программное обеспечение: напишите небольшую программу для пересылки трафика между интерфейсами
can0
а такжеcan1
, используя socketcan, который уже включен в ядро Linux. - Если ваши устройства обмениваются данными через транспортный протокол J1939 более высокого уровня, вам также может понадобиться запустить транспортный протокол J1939 на Raspberry Pi. Если вы просто используете 29-разрядные идентификаторы с максимальной полезной нагрузкой в 8 байт данных, это также не должно быть необходимым.
- В качестве альтернативы вы также можете использовать более дорогое коммерческое решение, например, этот CAN-Router.
Ваша оригинальная идея:
Я думаю, что то, что вы предполагаете, технически осуществимо, но может иметь и другие недостатки.
- Поскольку драйверы контроллеров жестких дисков, как правило, не предоставляют интерфейсы для интерактивного манипулирования CAN-кадрами, пока их передача еще продолжается, вы можете напрямую обратиться к приемопередатчику can с микроконтроллера.
- Некоторые исследователи реализовали атаку отказа в обслуживании CAN, превратив первый рецессивный бит в кадре CAN после идентификатора арбитража в доминирующий бит для некоторых выбранных идентификаторов CAN. Они использовали трансивер Arduino Uno и микросхему MCP2551 E/P CAN. Используемый код также доступен онлайн. Поскольку это интерактивное манипулирование CAN-кадрами во время передачи связано с тем, что вы ищете, это может быть хорошей отправной точкой для вас.
- Тем не менее, я вижу некоторые недостатки, когда вы заставляете PDM замолчать таким образом:
- Таким образом, вы не только отключите PDM, но и (по крайней мере) задержите передачу других узлов на шине CAN с арбитражными идентификаторами, которые имеют более низкий приоритет, чем сообщения от PDM
- Весьма вероятно, что PDM перейдет в некоторое состояние ошибки, когда он не сможет успешно отправить свои CAN-кадры на шину после определенного числа попыток
Еще одна идея:
Если вы можете адаптировать программное обеспечение VCU, измените его так, чтобы оно не потребляло CAN-кадры из PDM, а CAN-кадры с вашего ноутбука, используя разные CAN-ID для одних и тех же сообщений. Для этого вам придется изменить dbc-файл.