"Этот программист вместо текстовых мессенджеров переписываются через утилиту NetCat."

Пролог
Недавно я купил себе CAN-трансивер USB2CANFD_V1 и с удивлением обнаружил насколько же простой и лаконичный протокол заложили разработчики в прошивку STM32G0B1CBT6. Это протокол SLCAN. По сути serial CLI. И это оказалось очень кстати, ведь в программировании микроконтроллеров порой приходится работать с UDS протоколом. Как известно, UDS протокол работает поверх сетевого протокола ISO-TP. В этом тексте я написал под SLCAN простую отладочную утилиту для отладки процесса передачи данных по протоколу ISO-TP (ISO 15765-2).
В чем проблема?
Проблема в том, что переходники с USB на CAN и сопутствующий для них софт от вендоров как правило заточен только на что, чтобы просто отправлять отдельные атомарные CAN пакеты. А это только 8 байт данных. При этом для отправки надо заполнять payload пакетов мышкой в виде hex нимблов. А как отправить массив размер которого больше чем 8 байт? Для этого существует как раз протокол ISO-TP. Подробнее про него можно почитать тут. Однако вендоры переходников USB-CAN обычно не добавляют поддержку ISO-TP в свои GUI приложения. Да, есть плагины на С#, но прикручиваются они очень трудно.
В связи с этим возникла потребность написать на Си монолитную утилиту, которая позволит извлекать сырые ISO-TP данные из CAN шины, просто анализируя трафик ISO-TP.
Постановка задачи:
Написать на языке программирования Си Windows консольную PC утилиту, которая позволит передавать и принимать произвольные массивы данных через интерфейс CAN по протоколу ISO-TP. При этом использовать расширенную 29-битную адресацию (CAN 2.0 B).
В качестве переходника с USB на CAN использовать широко распространённый и дешевый CAN-трансивер USB2CANFD_V1 с Aliexpress.
Образно, говоря нужна утилита аналогичная NetCat, только для случая с CAN интерфейсом. Эдакая утилита memcpy по CAN шине. Только и всего.
Аргументы утилиты
Утилита должна на вход получить номер COM порта трансивера, битовую скорость CAN, свой адрес в протоколе ISO-TP (сетевой адрес).
Аргумент |
Порядок |
Варианты |
Номер COM порта на котором примонтирован переходник USB2CANFD_V1 |
1 |
0; 1; 2; 3; 4; 5 и т д |
Битовая скорость CAN шины |
2 |
250k 500k 1M |
IsoTp адрес отправителя |
3 |
8 битное число |
IsoTp адрес получателя |
4 |
8 битное число |
Данные |
5 |
Hex строка |
Я решил назвать утилиту CANcat по аналогии с утилитой NetCat, которая делает в сущности то же самое только не для CAN кадров, а для Ethernet пакетов. Плюс я каждый день вижу котов (cat).
Инструкция
Саму утилиту можно скачать тут. Затем надо взять два LapTop PC, соединить их через CAN шину переходниками USB2CANFD_V1. Теперь можно запускать CANcat и передать данные.

Отладка
Я подключил два переходника к одному LapTop. Операционная система увидела COM4 и COM6. Затем я запустил на исполнение два Windows экземпляра процесса CANcat с разным пучком опций.

Первую утилиту CANcat я сконфигурировал так. Тут ссс - это CLI команда конфигурации приложения. По сути через аргументы функции main передается CLI команда.
echo off
cls
set com_num=6
set can_bit_rate=250000
set src_addr=0xD
set options_bunch=%com_num% %can_bit_rate% %src_addr%
CANcat.exe ccc %options_bunch%
скрипт пуска второго приложения CANcat
echo off
cls
set com_num=4
set can_bit_rate=250000
set src_addr=0xC
set options_bunch=%com_num% %can_bit_rate% %src_addr%
CANcat.exe ccc %options_bunch%
Тут стоит отметить, что конфиги в приложение CANcat передаются через аргументы функции main. При этом ключи позиционные. Сначала COMport, затем битовая скорость, адрес источника адрес приемника и сами передаваемые данные в виде hex строки с префиксом 0x.
Открыв приложения CANcat разворачивается интерфейс командной строки, который дает возможность в текстовом режиме консоли отправлять hex массивы из одного процесса в другой процесс прямо через CAN шину.

Чтобы отправить данные надо использовать CLI команду iso_tp_send. Синтаксис команды прост. Даешь адрес получателя и пишешь сообщение ( iso_tp_send TargetAddr TxData ). Например iso_tp_send 0xd Hello_Com6_I_am_COM4

Чтобы закрыть приложение достаточно нажать кнопку Esc.
Что можно делать с утилитой CANcat?
++Вы можете отлаживать свой UDS протокол. Буквально подключаетесь к CAN шине автомобиля, автобуса, поезда или трактора и посылать сырые UDS пакеты. Метаданные от ISO-TP не будут мозолить вам глаза. Вы получите чистый UDS ответ без прочей шелухи.
++Образно говоря, вы можете свесить CAN шину с балкона на 24 этажа вниз (80 метров), через форточку подключиться на каждом этаже переходником USB2CANFD, запустить утилиту CANcat и у вас получится общедомовой чат среди жильцов одного подъезда. Получится народный текстовый мессенджер по CAN.
++Можно организовать военно-полевую связь через CAN шину. CAN позволяет протягивать провода до 5 км.
++Благодаря утилите CANcat вы можете по CAN передавать CLI команды в микроконтроллер по CAN и получать ответ в виде сырого ASCII текста.
Итоги
Удалось создать консольную windows утилиту для обмена данными по CAN с использованием протокола ISO-TP. Утилиту CANcat.
Надеюсь эта утилита поможет Вам в отладке протоколов работающих поверх ISO 15765-2.
Если есть пожелания по улучшению утилиты CANcat, то пишите в комментариях.
Словарь
Акроним |
Расшифровка |
SLCAN |
Serial-Line CAN |
CAN |
controller area network |
CLI |
command-line interface |
Ссылки
Название |
URL |
CAN-шина (Теория) |
|
Обзор USB-CAN переходника USB2CANFD_V1 |
|
Обзор Протокола ISO-TP [ISO 15765-2] |
|
SLCAN Protocol (Serial-Line CAN) |
|
Почему Нам Нужен UART-Shell? |
|
Вопросы
--Почему интернет не стали прокладывать по CAN шине, а выбрали другой интерфейс 100Base-TX? 100Base-TX в 100 раз быстрее чем CAN
--Есть ли какая-нибудь бесплатная клиентская Windows CAN утилита, которая посылает и принимает по ISO-TP огромные массивы сырых данных (бинарные файлы)? Утилита, которая оперирует не на канальном уровне, а на транспортном и сетевом уровне модели OSI-7. Что-нибудь типа аналога программы NetCat, только не для Ethernet протокола, а для CAN протокола. https://github.com/aabzel/Artifacts/tree/main/can\_cat
konstantin_bashkatov
Надо будет испытать на своих адаптерах. Было бы удобно, если бы CANcat умел экспортировать сессии в формате, совместимом с SocketCAN/wireshark.
aabzel Автор
А что у Вас за адаптеры? Тоже поддерживают протокол SLCAN?