Как перехватить сообщения CAN J1939?

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

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

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

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

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

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


person Bart    schedule 01.11.2018    source источник


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

Ваша первоначальная идея:

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

  • Поскольку драйверы контроллеров CAN обычно не предоставляют интерфейсы для интерактивного управления кадрами CAN, пока их передача еще продолжается, вы можете напрямую обращаться к приемопередатчику CAN с микроконтроллера.
  • Несколько исследователей реализовали атаку отказа в обслуживании CAN. путем превращения первого рецессивного бита в CAN-кадре после идентификатора арбитража в доминирующий бит для определенных выбранных идентификаторов CAN-ID. Они использовали Arduino Uno и CAN-трансивер Microchip MCP2551 E / P. Используемый код также доступен в Интернете. Поскольку это интерактивное манипулирование CAN-кадрами во время передачи связано с тем, что вы ищете, это может стать для вас хорошей отправной точкой.
  • Still I see some drawbacks, when you silence the PDM this way:
    • You will not only silence the PDM this way, but also (at least) delay the transmission of other nodes on the CAN-bus with arbitration IDs that have lower priority than the messages from the PDM
    • Очень вероятно, что PDM перейдет в состояние ошибки, когда он не сможет успешно отправить свои CAN-кадры на шину после определенного количества повторных попыток.

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

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

person oh.dae.su    schedule 01.11.2018
comment
Хотя это идеальное решение, к сожалению, для меня это не вариант. Я рассматривал это раньше, но это означает физическое проникновение в машину, которая принадлежит государственной обороне, поскольку это касается военной техники. Мне сказали, что это не вариант. Вот почему я стремился перехватить сообщения, а не фильтровать их при ретрансляции шины CAN PDM на VCU, что вы предлагаете. Так что я боюсь, что мне придется продолжать обнаруживать сообщения до того, как поле арбитража будет завершено. Думаю, это единственный способ перехватить сообщения. Но я не уверен, возможно ли это. Тем не менее, спасибо за ваш вклад. - person Bart; 02.11.2018
comment
Жаль, что это не вариант. Я добавил к своему ответу часть, касающуюся вашей первоначальной идеи. Надеюсь, это поможет вам. - person oh.dae.su; 03.11.2018
comment
Еще раз спасибо, хороший вклад. К счастью, нет других узлов, которым будет запрещено отправлять сообщения, когда я блокирую сообщения от PDM, если я сбрасываю только последний рецессивный бит. Я не уверен, что PDM будет вызывать ошибки, если его запретить отправлять, но я так не думаю. В противном случае это не имеет значения, пока он продолжает нормально работать. Хотя это тоже хорошая идея, программное обеспечение VCU нельзя изменить, по той же причине, по которой я не мог сделать физический разрыв для ретрансляции шины CAN. Так что это не вариант .. Но я обязательно посмотрю на статью, которую вы опубликовали! Я чувствую, что там прячется решение. - person Bart; 05.11.2018
comment
Конечно. Удачи в вашем проекте. - person oh.dae.su; 06.11.2018