소켓캔
SocketCANSocketCAN은 Volkswagen Research가 Linux 커널에 제공하는 오픈 소스 CAN 드라이버 및 네트워킹 스택 세트입니다.이전에는 Low Level CAN Framework(LLCF)로 불렸습니다.
기존의 Linux용 CAN 드라이버는 문자 디바이스 모델을 기반으로 합니다.일반적으로 CAN 컨트롤러와의 송수신만 허용합니다.이 클래스의 디바이스 드라이버의 종래의 실장에서는, 1개의 프로세스만이 디바이스에 액세스 할 수 있습니다.그 사이에 다른 모든 프로세스는 차단됩니다.게다가 이러한 드라이버는, 통상, 애플리케이션에 표시되는 인터페이스가 약간 다르기 때문에, 휴대성이 저하됩니다.한편 Socket CAN 개념은 네트워크 디바이스 모델을 사용하여 여러 애플리케이션이 하나의 CAN 디바이스에 동시에 액세스할 수 있도록 합니다.또, 1개의 애플리케이션이 복수의 CAN 네트워크에 병렬로 액세스 할 수 있습니다.
SocketCAN 개념은 인터넷 프로토콜용 PF_INET과 같은 다른 프로토콜 패밀리와 공존하는 새로운 프로토콜 패밀리 PF_CAN을 도입함으로써 Linux에서 Berkeley 소켓 API를 확장합니다.따라서 CAN 버스와의 통신은 소켓을 통한 인터넷 프로토콜 사용과 유사하게 이루어집니다.SocketCAN의 기본 컴포넌트는 다양한 CAN 컨트롤러용 네트워크 디바이스 드라이버와 CAN 프로토콜 패밀리의 구현입니다.프로토콜 제품군인 PF_CAN은 버스에서 다양한 프로토콜을 사용할 수 있는 구조를 제공합니다. 즉, 직접 CAN 통신을 위한 원시 소켓과 포인트 투 포인트 연결을 위한 전송 프로토콜입니다.게다가 CAN 프로토콜 패밀리의 일부인 브로드캐스트 매니저는, 예를 들면, CAN 메시지를 정기적으로 송신하거나 복잡한 메시지 필터를 실현하기 위한 기능을 제공한다.Linux 커널 버전 5.10 이후 프로토콜 제품군에는 ISO-TP 구현인 CAN_ISOTP도 [1]포함되어 있습니다.
2.6.25 Linux 커널에 CAN용 패치가 추가되었습니다.한편, 일부 컨트롤러 드라이버가 추가되어 다양한 컨트롤러의 드라이버를 추가하는 작업이 진행되고 있습니다.
사용.
애플리케이션은 먼저 소켓을 초기화하고(TCP/IP 통신과 거의 동일), 그 소켓을 인터페이스(또는 애플리케이션이 원하는 경우 모든 인터페이스)에 바인드함으로써 CAN 인터페이스에 대한 액세스를 설정합니다.바인드되면 소켓은 UDP 소켓처럼 사용할 수 있습니다.read,write등...
Python은 버전 3.[2]3에서 SocketCAN에 대한 지원을 추가했습니다.오픈 소스 라이브러리 python-can은 Python 2와 Python[3][circular reference] 3에 대한 SocketCAN 지원을 제공합니다.
CAN 디바이스를 설치하려면 can_dev 모듈을 로드하고 CAN 버스 비트레이트를 지정하도록 IP 링크를 구성해야 합니다.다음은 예를 제시하겠습니다.
$ modprobe can_dev $ modprobe can $ modprobe can_raw $ sudo ip link set can0 type은 비트레이트 500000 $ sudo ip link setup can0또, 테스트용의 가상 CAN 드라이버도 있습니다.이 드라이버는, 다음의 커맨드로 Linux 로 로드해 작성할 수 있습니다.
$ modprobe can_raw $ modprobe vcan $ sudo ip link add dev vcan0 type vcan $ sudo ip link setup vcan0 $ ip link show vcan0 3: vcan0: < NOARP,UP,LOWER_UP> mtu 16 qdisc noqueue 상태 UNKNOWN 링크/캔다음 코드 스니펫은 원시 인터페이스를 사용하여 패킷을 전송하는 SocketCAN API의 동작 예입니다.Linux [4]커널에 기재되어 있는 주의사항을 기반으로 합니다.
#실패하다 <stdio.h> #실패하다 <stdlib.h> #실패하다 <리스트 없음.h> #실패하다 <문자열>h> #실패하다 <net / if >h> #실패하다 < sys / types >h> #실패하다 <sys/module >h> #실패하다 < sys / ioctl >h> #실패하다 <linux/can.h> #실패하다 <linux/can/raw.h> 인트 주된(무효) { 인트 s; 인트 바이트 수; 구조 sockaddr_can 주소; 구조 can_frame(프레임) 틀; 구조 ifreq ifr; 컨스턴트 차 *ifname(이프네임) = "vcan0"; 한다면 ((s = 소켓(PF_CAN, 양말_RAW, CAN_RAW)) == -1) { 에러("소켓 여는 중 오류"); 돌아가다 -1; } 스트럭시(ifr.ifr_name, ifname(이프네임)); 동작하다(s, Sioc GIF 인덱스, &ifr); 주소.can_패밀리 = AF_CAN; 주소.can_ifindex = ifr.ifr_ifindex; 인쇄물(%s at 인덱스 %d\n", ifname(이프네임), ifr.ifr_ifindex); 한다면 (묶다(s, (구조 키보드 *)&주소, 크기(주소)) == -1) { 에러("소켓 바인딩 오류"); 돌아가다 -2; } 틀.can_id = 0x123; 틀.할 수 있다 = 2; 틀.데이터.[0] = 0x11; 틀.데이터.[1] = 0x22; 바이트 수 = 쓰다(s, &틀, 크기(구조 can_frame(프레임))); 인쇄물("%d바이트를 썼습니다.\n", 바이트 수); 돌아가다 0; } 패킷은 소켓 CAN 캔유틸스[5] 패키지의 일부인 candump 유틸리티를 사용하여 vCAN0 인터페이스 상에서 분석할 수 있습니다.
user@server:~/can-cans $./candump vCAN0 123 [2] 11 22