Глава 3 Приступаем к кодингу
Когда вы начнете использовать CAN для связи с автомобилем, вы вполне можете найти его как мешанину различных драйверов и программных утилит. Идеальным было бы объединить CAN-инструменты и их различные интерфейсы в общий интерфейс, чтобы мы могли легко обмениваться информацией между инструментами. К счастью, есть набор инструментов с общим интерфейсом, и это бесплатно! Если у вас Linux или установлена Linux на виртуальной машине (VM), у вас уже есть этот интерфейс. Интерфейс, называемый SocketCAN, был создан на сайте разработки Open Source BerliOS в 2006 году. Сегодня термин SocketCAN используется для обозначения реализации CAN-драйверов в качестве сетевых устройств, таких как карты Ethernet, и для описания доступа приложений к шине CAN через интерфейс сетевого сокета.
В этой главе мы создадим SocketCAN, чтобы мы могли легко общаться с автомобилем.Volkswagen Group Research внесла свой вклад в реализацию оригинальной реализации SocketCAN, которая поддерживает встроенные CAN-чипы и драйверы карт, внешние USB-устройства и последовательные CAN-устройства, а также виртуальные CAN-устройства. Пакет can-utils предоставляет несколько приложений и инструментов для взаимодействия с сетевыми устройствами CAN, CAN-специфическими протоколами и возможностью настройки виртуальной среды CAN. Чтобы проверить многие примеры из этой книги, установите последнюю версию в виртуальной машине Linux в вашей системе. Новейшие версии Ubuntu могут использовать в своих стандартных хранилищах. SocketCAN связывается с сетевым стеком Linux, что упрощает создание инструментов для поддержки CAN. Приложения SocketCAN могут использовать стандартные вызовы сокетов C(язык программирования) с пользовательским семейством сетевых протоколов, PF_CAN. Эта функциональность позволяет ядру обрабатывать драйверы CAN-устройств и взаимодействовать с существующим сетевым оборудованием, чтобы обеспечить общий интерфейс и утилиты для пользовательского пространства. На рисунке 3-1 сравнивается реализация традиционного программного обеспечения CAN с объединенным SocketCAN.
С традиционным ПО CAN, приложение имеет свой собственный протокол, который обычно разговаривает с символьным устройством, например, с последовательным драйвером, а затем с фактическим аппаратным драйвером. Слева от рисунка SocketCAN реализован в ядре Linux. Создавая собственный семейство CAN-протоколов, SocketCAN может интегрироваться с существующими драйверами сетевых устройств, что позволяет приложениям обрабатывать интерфейс шины CAN, как если бы это был общий сетевой интерфейс.
Настройка can-utils на устройства Connect to Can
Чтобы установить can-utils, вы должны запускать дистрибутив Linux с 2008 года или позже или один из ядер Linux 2.6.25 или выше. Сначала мы установим can-utils, а затем рассмотрим, как настроить его для вашей конкретной настройки.
Установка can-utils
Вы можете использовать диспетчер пакетов для установки can-utils. Вот пример Debian / Ubuntu:
Если у вас нет приложений в вашем диспетчере пакетов, установите его из источника с помощью команды git:
На момент написания этой статьи, can-utils настраивает, создает и создает файлы установки, но в более старых версиях вы просто вводите make для установки из источника.
Настройка встроенных наборов микросхем
Следующий шаг зависит от вашего оборудования. Если вы ищете сниффер CAN, вы должны проверить список поддерживаемых драйверов Linux, чтобы обеспечить совместимость вашего устройства. На момент написания этой статьи встроенные CAN-драйверы Linux поддерживали следующие чипсеты:
Вы можете проверить правильность загрузки интерфейса ifconfig и убедиться, что теперь присутствует интерфейс can0:
Теперь установите скорость шины CAN. (Более подробную информацию о скорости шины вы найдете в главе 5.) Ключевым компонентом, который необходимо установить, является скорость передачи данных. Это скорость шины. Типичное значение для высокоскоростной CAN (HS-CAN) составляет 500 Кбит / с. Значения 250 Кбит / с или 125 Кбит / с типичны для низкоскоростных шин CAN.
Как только вы откроете устройство can0, вы сможете использовать инструменты из can-utils в этом интерфейсе. Linux использует netlink для обмена данными между ядром и инструментами пользовательского пространства. Вы можете получить доступ к netlink с помощью команды ip link. Чтобы просмотреть все параметры netlink, введите следующее:
Если вы начнете видеть нечетное поведение, такое как отсутствие захвата пакетов и ошибки пакетов, интерфейс может быть остановлен. Если вы работаете с внешним устройством, просто отключите или перезагрузите его. Если устройство является внутренним, запустите эти команды для его сброса:
Конфигурирование последовательных CAN-устройств
Внешние CAN-устройства обычно обмениваются данными через последовательный порт. На самом деле даже USB-устройства на транспортном средстве часто общаются через последовательный интерфейс - обычно это чип FTDI от Future Technology Devices International, Ltd. Известно, что следующие устройства работают с SocketCAN:
Чтобы использовать один из USB-последовательных адаптеров, вы должны сначала инициализировать как серийное оборудование, так и скорость передачи данных на шине CAN:
Демон slcand предоставляет интерфейс, необходимый для перевода последовательной связи на сетевой драйвер slcan0. В slcand могут быть переданы следующие параметры:
В таблице 3-1 перечислены номера, переданные на -s и соответствующие скорости передачи.
Как вы можете видеть, ввод -s6 подготавливает устройство для связи с сетью CAN-шины 500 Кбит / с. С этими параметрами вы должны теперь иметь устройство slcan0. Чтобы подтвердить, введите следующее:
Большая часть информации, возвращаемой ifconfig, устанавливается на общие значения по умолчанию, которые могут быть все 0s. Это нормально. Мы просто следим за тем, чтобы мы могли видеть устройство с ifconfig. Если мы увидим устройство slcan0, мы знаем, что мы должны использовать наши инструменты для связи через последовательный порт с контроллером CAN.
Если у вас нет аппаратного обеспечения CAN для исследований, не бойтесь. Вы можете настроить виртуальную сеть CAN для тестирования. Для этого просто загрузите модуль vcan.
Если вы проверите dmesg, вы не увидите гораздо больше, чем такое сообщение:
Теперь вы просто настроили интерфейс, но без указания скорости передачи для виртуального интерфейса
Чтобы проверить настройки, введите следующее:
Пока вы видите vcan0 на выходе, вы готовы к работе.
Набор утилит Can
С помощью нашего CAN-устройства, давайте посмотрим на can-utils на высоком уровне. Они перечислены и описаны здесь кратко; мы будем использовать их во всей книге, и мы рассмотрим их более подробно, когда мы их используем.
______________________________________________________________
asc2log Этот инструмент анализирует ASCII CAN-дампы в следующем виде в стандартный формат журнала SocketCAN:
____________________________________________________________________________________________
bcmserver Ян-Никлас Мейер (Rc), управляющий сервером трансляций, принимает команды, подобные следующим:
По умолчанию он прослушивает порт 28600. Его можно использовать для обрабатывать некоторые занятые работы при работе с повторяющимися сообщениями CAN.
______________________________________________________________
canbusload Этот инструмент определяет, какой идентификатор является наиболее ответственным за размещение самого трафика на шине и принимает следующие аргументы:
Вы можете указать столько интерфейсов, сколько захотите, и иметь canbusload, отображающий гистограмму наихудших нарушителей полосы пропускания.
______________________________________________________________
can-calc-bit-timing Эта команда вычисляет скорость передачи битов и соответствующие значения регистра для каждого набора микросхем CAN, поддерживаемого ядром.
______________________________________________________________
candump Эта утилита сбрасывает CAN-пакеты. Он также может принимать фильтры и лог-пакеты
______________________________________________________________
canfdtest Этот инструмент выполняет тесты отправки и получения по двум CAN-шинам.
_______________________________________________________________
cangen Эта команда генерирует CAN-пакеты и может передавать их с установленными интервалами. Он также может генерировать случайные пакеты. cangw Этот инструмент управляет шлюзами между различными шинами CAN, а также может фильтровать и изменять пакеты перед отправкой их на следующую шину.
______________________________________________________________________
canlogserver Эта утилита прослушивает порт 28700 (по умолчанию) для CAN-пакетов и записывает их в стандартном формате в стандартный вывод. canplayer Эта команда повторяет пакеты, сохраненные в стандартном компактном формате SocketCAN. cansend Этот инструмент отправляет один CAN-кадр в сеть.
______________________________________________________________________
cansniffer Этот интерактивный снифер группирует пакеты по ID и выделяет измененные байты.
_______________________________________________________________________
isotpdump Этот инструмент выгружает ISO-TP CAN-пакеты, которые объясняются в разделе «Отправка данных с помощью ISO-TP и CAN» на стр. 55.
_______________________________________________________________________
isotprecv Эта утилита принимает ISO-TP CAN-пакеты и выходы в stdout.
________________________________________________________________________
isotpsend Эта команда отправляет ISO-TP CAN-пакеты, которые отправляются по каналу из stdin.
________________________________________________________________________
isotpserver Этот инструмент реализует мосты TCP / IP в ISO-TP и принимает пакеты данных в формате 1122334455667788.
_______________________________________________________________________
isotpsniffer Этот интерактивный сниффер похож на cansniffer, но предназначен для пакетов ISO-TP.
__________________________________________________________________________________________________________
isotptun Эта утилита создает сетевой туннель через сеть CAN.
___________________________________________________________________________
log2asc Этот инструмент преобразуется из стандартного компактного формата в следующий формат ASCII:
____________________________________________________________________________
log2long Эта команда преобразует из стандартного компактного формата в читаемый пользователем формат.
_____________________________________________________________________________
slcan_attach Это инструмент командной строки для последовательных CAN-устройств.
______________________________________________________________________________
slcand Этот демон обрабатывает CAN-устройства последовательной линии. slcanpty Этот инструмент создает интерфейс psuedoterminal Linux (PTY) для связи с последовательным интерфейсом CAN.
______________________________________________________________________________
Во 2 части мы приступим к кодингу приложений SocketCAN на Си
Когда вы начнете использовать CAN для связи с автомобилем, вы вполне можете найти его как мешанину различных драйверов и программных утилит. Идеальным было бы объединить CAN-инструменты и их различные интерфейсы в общий интерфейс, чтобы мы могли легко обмениваться информацией между инструментами. К счастью, есть набор инструментов с общим интерфейсом, и это бесплатно! Если у вас Linux или установлена Linux на виртуальной машине (VM), у вас уже есть этот интерфейс. Интерфейс, называемый SocketCAN, был создан на сайте разработки Open Source BerliOS в 2006 году. Сегодня термин SocketCAN используется для обозначения реализации CAN-драйверов в качестве сетевых устройств, таких как карты Ethernet, и для описания доступа приложений к шине CAN через интерфейс сетевого сокета.
В этой главе мы создадим SocketCAN, чтобы мы могли легко общаться с автомобилем.Volkswagen Group Research внесла свой вклад в реализацию оригинальной реализации SocketCAN, которая поддерживает встроенные CAN-чипы и драйверы карт, внешние USB-устройства и последовательные CAN-устройства, а также виртуальные CAN-устройства. Пакет can-utils предоставляет несколько приложений и инструментов для взаимодействия с сетевыми устройствами CAN, CAN-специфическими протоколами и возможностью настройки виртуальной среды CAN. Чтобы проверить многие примеры из этой книги, установите последнюю версию в виртуальной машине Linux в вашей системе. Новейшие версии Ubuntu могут использовать в своих стандартных хранилищах. SocketCAN связывается с сетевым стеком Linux, что упрощает создание инструментов для поддержки CAN. Приложения SocketCAN могут использовать стандартные вызовы сокетов C(язык программирования) с пользовательским семейством сетевых протоколов, PF_CAN. Эта функциональность позволяет ядру обрабатывать драйверы CAN-устройств и взаимодействовать с существующим сетевым оборудованием, чтобы обеспечить общий интерфейс и утилиты для пользовательского пространства. На рисунке 3-1 сравнивается реализация традиционного программного обеспечения CAN с объединенным SocketCAN.
С традиционным ПО CAN, приложение имеет свой собственный протокол, который обычно разговаривает с символьным устройством, например, с последовательным драйвером, а затем с фактическим аппаратным драйвером. Слева от рисунка SocketCAN реализован в ядре Linux. Создавая собственный семейство CAN-протоколов, SocketCAN может интегрироваться с существующими драйверами сетевых устройств, что позволяет приложениям обрабатывать интерфейс шины CAN, как если бы это был общий сетевой интерфейс.
Настройка can-utils на устройства Connect to Can
Чтобы установить can-utils, вы должны запускать дистрибутив Linux с 2008 года или позже или один из ядер Linux 2.6.25 или выше. Сначала мы установим can-utils, а затем рассмотрим, как настроить его для вашей конкретной настройки.
Установка can-utils
Вы можете использовать диспетчер пакетов для установки can-utils. Вот пример Debian / Ubuntu:
Bash:
$ sudo apt-get install can-utils
Bash:
$ git clone https://github.com/linux-can/can-utils
Настройка встроенных наборов микросхем
Следующий шаг зависит от вашего оборудования. Если вы ищете сниффер CAN, вы должны проверить список поддерживаемых драйверов Linux, чтобы обеспечить совместимость вашего устройства. На момент написания этой статьи встроенные CAN-драйверы Linux поддерживали следующие чипсеты:
- Atmel AT91SAM SoCs
- Bosch CC770
- Карты ESD CAN-PCI / 331
- Freescale FlexCAN
- Freescale MPC52xx SoCs (MSCAN)
- Intel AN82527
- Microchip MCP251x
- NXP (Philips) SJA1000
- Контроллеры SoCs CAN от TI, такие как SJA1000, обычно встроены в карты ISA, PCI и PCMCIA или другие встроенные аппаратные средства.
Bash:
$ dmesg
--snip--
[ 8603.743057] CAN device driver interface
[ 8603.748745] peak_usb 3-2:1.0: PEAK-System PCAN-USB adapter hwrev 28 serial FFFFFFFF (1 channel)
[ 8603.749554] peak_usb 3-2:1.0 can0: attached to PCAN-USB channel 0 (device 255)
[ 8603.749664] usbcore: registered new interface driver peak_usb
Bash:
$ ifconfig can0
can0
Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Bash:
$ sudo ip link set can0 type can bitrate 500000
$ sudo ip link set up can0
Bash:
$ ip link set can0 type can help
Bash:
$ sudo ip link set canX type can restart-ms 100
$ sudo ip link set canX type can restart
Внешние CAN-устройства обычно обмениваются данными через последовательный порт. На самом деле даже USB-устройства на транспортном средстве часто общаются через последовательный интерфейс - обычно это чип FTDI от Future Technology Devices International, Ltd. Известно, что следующие устройства работают с SocketCAN:
- Любое устройство, поддерживающее протокол LAWICEL
- CAN232 / CANUSB последовательные адаптеры
Ссылка скрыта от гостей
- VSCOM USB-последовательный адаптер
Ссылка скрыта от гостей
- CANtact
Ссылка скрыта от гостей
linux-can/can-miscЗаметим: Если вы используете Arduino или создаете свой собственный сниффер, вы должны реализовать протокол LAWICEL, также известный как протокол SLCAN, в вашей прошивке, чтобы ваше устройство работало. Для получения дополнительной информации см.Ссылка скрыта от гостейи ЗДЕСЬlinux-can/can-misc
Чтобы использовать один из USB-последовательных адаптеров, вы должны сначала инициализировать как серийное оборудование, так и скорость передачи данных на шине CAN:
Bash:
$ slcand -o -s6 -t hw -S 3000000 /dev/ttyUSB0
$ ip link set up slcan0
- -o Открывает устройство
- s6 Устанавливает скорость и скорость передачи CAN-шины (см. Таблицу 3-1)
- -t hw Определяет управление последовательным потоком, будь то HW (аппаратное обеспечение) или SW (программное обеспечение)
- -S 3000000 Устанавливает последовательный бод или скорость передачи данных, скорость
В таблице 3-1 перечислены номера, переданные на -s и соответствующие скорости передачи.
Как вы можете видеть, ввод -s6 подготавливает устройство для связи с сетью CAN-шины 500 Кбит / с. С этими параметрами вы должны теперь иметь устройство slcan0. Чтобы подтвердить, введите следующее:
Bash:
$ ifconfig slcan0
slcan0
Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Настройка виртуальной сети CANЗаметим:На данный момент, может быть хорошо видеть, есть ли у вашего физического устройства сниффера дополнительные огни. Часто сниффер CAN имеет зеленый и красный огни, чтобы обозначить, что он может правильно общаться с шиной CAN. Ваше устройство CAN должно быть подключено к вашему компьютеру и автомобилю, чтобы эти лампы работали должным образом. Не все устройства имеют эти огни. (Проверьте руководство по эксплуатации устройства.)
Если у вас нет аппаратного обеспечения CAN для исследований, не бойтесь. Вы можете настроить виртуальную сеть CAN для тестирования. Для этого просто загрузите модуль vcan.
Bash:
$ modprobe vcan
Bash:
$ dmesg
[604882.283392] vcan: Virtual CAN interface driver
Bash:
$ ip link add dev vcan0 type vcan
$ ip link set up vcan0
Bash:
$ ifconfig vcan0
vcan0
Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Набор утилит Can
С помощью нашего CAN-устройства, давайте посмотрим на can-utils на высоком уровне. Они перечислены и описаны здесь кратко; мы будем использовать их во всей книге, и мы рассмотрим их более подробно, когда мы их используем.
______________________________________________________________
asc2log Этот инструмент анализирует ASCII CAN-дампы в следующем виде в стандартный формат журнала SocketCAN:
Код:
0.002367 1 390x Rx d 8 17 00 14 00 C0 00 0
bcmserver Ян-Никлас Мейер (Rc), управляющий сервером трансляций, принимает команды, подобные следующим:
Код:
vcan1 A 1 0 123 8 11 22 33 44 55 66 77 88
______________________________________________________________
canbusload Этот инструмент определяет, какой идентификатор является наиболее ответственным за размещение самого трафика на шине и принимает следующие аргументы:
Код:
interface @ bitrate
______________________________________________________________
can-calc-bit-timing Эта команда вычисляет скорость передачи битов и соответствующие значения регистра для каждого набора микросхем CAN, поддерживаемого ядром.
______________________________________________________________
candump Эта утилита сбрасывает CAN-пакеты. Он также может принимать фильтры и лог-пакеты
______________________________________________________________
canfdtest Этот инструмент выполняет тесты отправки и получения по двум CAN-шинам.
_______________________________________________________________
cangen Эта команда генерирует CAN-пакеты и может передавать их с установленными интервалами. Он также может генерировать случайные пакеты. cangw Этот инструмент управляет шлюзами между различными шинами CAN, а также может фильтровать и изменять пакеты перед отправкой их на следующую шину.
______________________________________________________________________
canlogserver Эта утилита прослушивает порт 28700 (по умолчанию) для CAN-пакетов и записывает их в стандартном формате в стандартный вывод. canplayer Эта команда повторяет пакеты, сохраненные в стандартном компактном формате SocketCAN. cansend Этот инструмент отправляет один CAN-кадр в сеть.
______________________________________________________________________
cansniffer Этот интерактивный снифер группирует пакеты по ID и выделяет измененные байты.
_______________________________________________________________________
isotpdump Этот инструмент выгружает ISO-TP CAN-пакеты, которые объясняются в разделе «Отправка данных с помощью ISO-TP и CAN» на стр. 55.
_______________________________________________________________________
isotprecv Эта утилита принимает ISO-TP CAN-пакеты и выходы в stdout.
________________________________________________________________________
isotpsend Эта команда отправляет ISO-TP CAN-пакеты, которые отправляются по каналу из stdin.
________________________________________________________________________
isotpserver Этот инструмент реализует мосты TCP / IP в ISO-TP и принимает пакеты данных в формате 1122334455667788.
_______________________________________________________________________
isotpsniffer Этот интерактивный сниффер похож на cansniffer, но предназначен для пакетов ISO-TP.
__________________________________________________________________________________________________________
isotptun Эта утилита создает сетевой туннель через сеть CAN.
___________________________________________________________________________
log2asc Этот инструмент преобразуется из стандартного компактного формата в следующий формат ASCII:
Код:
0.002367 1 390x Rx d 8 17 00 14 00 C0 00 08 00
log2long Эта команда преобразует из стандартного компактного формата в читаемый пользователем формат.
_____________________________________________________________________________
slcan_attach Это инструмент командной строки для последовательных CAN-устройств.
______________________________________________________________________________
slcand Этот демон обрабатывает CAN-устройства последовательной линии. slcanpty Этот инструмент создает интерфейс psuedoterminal Linux (PTY) для связи с последовательным интерфейсом CAN.
______________________________________________________________________________
Во 2 части мы приступим к кодингу приложений SocketCAN на Си