SocketCAN - SocketCAN

SocketCAN это набор Открытый исходный код МОЖЕТ драйверы и сетевой стек предоставлены Volkswagen Research к Ядро Linux. Ранее известный как CAN Framework низкого уровня (LLCF).

Типичные уровни связи CAN. С SocketCAN (слева) или обычным (справа).

Традиционные драйверы CAN для Linux основаны на модели символьных устройств. Обычно они разрешают только отправку и получение от контроллера CAN. Обычные реализации этого класса драйверов устройства позволяют только одному процессу получить доступ к устройству, что означает, что все остальные процессы в это время блокируются. Кроме того, эти драйверы обычно немного отличаются интерфейсом, представленным для приложения, что затрудняет переносимость. С другой стороны, концепция SocketCAN использует модель сетевых устройств, которая позволяет нескольким приложениям одновременно обращаться к одному устройству CAN. Кроме того, одно приложение может иметь параллельный доступ к нескольким сетям CAN.

Концепция SocketCAN расширяет Розетки Berkeley API в Linux за счет введения нового семейства протоколов PF_CAN, которое сосуществует с другими семействами протоколов, такими как PF_INET для протокол Интернета. Таким образом, связь с шиной CAN осуществляется аналогично использованию Интернет-протокола через сокеты. Основными компонентами SocketCAN являются драйверы сетевых устройств для различных контроллеров CAN и реализация семейства протоколов CAN. Семейство протоколов PF_CAN предоставляет структуры для включения различных протоколов на шине: необработанные сокеты для прямого обмена данными по CAN и транспортные протоколы для двухточечных соединений. Кроме того, диспетчер вещания, который является частью семейства протоколов CAN, предоставляет такие функции, как для периодической отправки CAN сообщений или реализации сложных фильтров сообщений.

Патчи для CAN были добавлены в 2.6.25 Ядро Linux. Тем временем были добавлены некоторые драйверы контроллеров, и продолжается работа по добавлению драйверов для различных контроллеров.

использование

Приложение сначала устанавливает свой доступ к интерфейсу CAN, инициализируя сокет (во многом как в связи TCP / IP), затем привязывая этот сокет к интерфейсу (или ко всем интерфейсам, если приложение того пожелает). После привязки сокет можно использовать как UDP сокет через читать, записывать, так далее...

Python добавлена ​​поддержка SocketCAN в версии 3.3.[1] Библиотека с открытым исходным кодом питон может обеспечивает поддержку SocketCAN для Python 2 и Python 3[2][циркулярная ссылка ].

Для установки устройства CAN необходимо загрузить модуль can_dev и настроить IP-канал для указания скорости передачи данных шины CAN, например:

$ modprobe can_dev$ modprobe может$ modprobe can_raw$ sudo ip ссылка набор can0 тип может битрейт 500000$ sudo ip ссылка набор вверх can0

Существует также виртуальный драйвер CAN для тестирования, который можно загрузить и создать в Linux с помощью приведенных ниже команд.

$ modprobe может$ modprobe can_raw$ modprobe vcan$ sudo ip ссылка добавить dev vcan0 тип vcan$ sudo ip ссылка набор вверх vcan0$ IP ссылка показать vcan03: vcan0:  mtu 16 qdisc noqueue state UNKNOWN     ссылка / может

Следующий фрагмент кода является рабочим примером SocketCAN API, который отправляет пакет с использованием необработанного интерфейса. Он основан на примечаниях, приведенных в Ядро Linux.[3]

#включают <stdio.h>#включают <stdlib.h>#включают <unistd.h>#включают <string.h>#включают <net/if.h>#включают <sys/types.h>#включают <sys/socket.h>#включают <sys/ioctl.h>#включают <linux/can.h>#включают <linux/can/raw.h>intглавный(пустота){	int s;	int nbytes;	структура sockaddr_can адрес;	структура can_frame Рамка;	структура ifreq ifr;	const char *ifname = "vcan0";	если((s = разъем(PF_CAN, SOCK_RAW, CAN_RAW)) == -1) {		перрор(«Ошибка при открытии сокета»);		возвращаться -1;	}	strcpy(ifr.ifr_name, ifname);	ioctl(s, SIOCGIFINDEX, &ifr);		адрес.can_family  = AF_CAN;	адрес.can_ifindex = ifr.ifr_ifindex;	printf("% s в индексе% d п", ifname, ifr.ifr_ifindex);	если(связывать(s, (структура sockaddr *)&адрес, размер(адрес)) == -1) {		перрор(«Ошибка привязки сокета»);		возвращаться -2;	}	Рамка.can_id  = 0x123;	Рамка.can_dlc = 2;	Рамка.данные[0] = 0x11;	Рамка.данные[1] = 0x22;	nbytes = записывать(s, &Рамка, размер(структура can_frame));	printf("Записано% d байт п", nbytes);		возвращаться 0;}

Пакет можно проанализировать на интерфейсе vcan0 с помощью утилиты candump, которая является частью SocketCAN can-utils.[4] упаковка.

пользователь @ сервер: ~ / can-utils $ ./candump vcan0  vcan0 123 [2] 11 22

Рекомендации

  1. ^ http://bugs.python.org/issue10141
  2. ^ SocketCAN
  3. ^ Доступно для просмотра в Интернете с Документация по ядру Linux или в linux / Документация / сети / can.txt в самых последних исходных деревьях
  4. ^ Can-utils https://github.com/linux-can/can-utils/

внешняя ссылка