한국어
Linux Programming
 

SocketCAN 유틸 사용방법

makersweb 2022.02.05 15:52 조회 수 : 10625

SocketCAN은 Linux용 CAN 프로토콜(Controller Area Network)의 구현이다. 다른 네트워크 장치와 유사한 방식으로 다른 CAN 버스 장치와 커뮤니케이션 할 수 있는 인터페이스를 제공한다. 즉 네트워크 소켓 프로그래밍 인터페이스를 통해서 CAN 버스에 접근하는 애플리케이션을 개발할 수 있다. 또한 CAN 드라이버 및 네트워킹 도구 모음등을 제공한다. 이 글에서는 SocketCAN 관련 유틸에 대한 간단한 사용방법을 소개한다.

SocketCAN.png
 

먼저 SocketCAN에서 제공하는 CAN 인터페이스 유형을 알아보자. 다음과 같은 것들이 있다.

  • vcan0과 같은 가상 인터페이스
  • can0과 같은 네이티브 (실제 하드웨어) 인터페이스
  • slcan0과 같은 SLCAN(serial line CAN interface driver) 기반 인터페이스

 

slcan 의 경우 직렬 인터페이스로 연결하는 장치, 일반적으로 USB 방식으로 연결하는 장치를 위한 인터페이스다. LAWICEL 프로토콜 호환 CANUSB 등과 같은 어댑터가 대표적인 예다.

 

SocketCAN 유틸리티 설치

이제 필요한 패키지를 설치해본다. Ubuntu에는 필수 커널 모듈은 포함되어 있지만 can-utils는 별도로 설치해야 한다.

sudo apt-get install can-utils

관련 커널 모듈을 활성화해야 할 수도 있다. 다음 명령줄을 실행한다.

sudo modprobe can
sudo modprobe vcan
sudo modprobe slcan

 

시리얼 CAN 장치 사용

시리얼 CAN 장치가 없다면 이부분을 건너뛰고 가상 CAN 장치를 활성화하면 된다.

SLCAN 기반 장치는 직렬 인터페이스를 제공한다. 이 직렬 인터페이스 CAN 장치와 SocketCAN과 함께 사용하려면 slcand를 실행해야 한다. 예를 들어 다음 명령줄과 같이 실행할 수 있다.

sudo slcand -o -c -s6 /dev/ttyACM0 can0

이 명령은 /dev/ttyACM0에 연결된 can0이라는 새 장치를 만든다. 시작 (-o)시 장치가 열리고 완료되면 (-c) 장치가 닫히고 속도 모드를 6 (-s6)으로 설정한다.

ASCII Command CAN Bitrate
s0 10 Kbit/s
s1 20 Kbit/s
s2 50 Kbit/s
s3 100 Kbit/s
s4 125 Kbit/s
s5 250 Kbit/s
s6 500 Kbit/s
s7 800 Kbit/s
s8 1000 Kbit/s

그다음 인터페이스를 활성화해야 한다.

sudo ip link set up can0

 

가상 CAN 장치 사용

가상 CAN 장치 또는 vcan 장치를 사용하여 실제 하드웨어 없이 CAN 버스를 시뮬레이션 할 수 있다. 이것은 시뮬레이션, 테스트에 유용하다. 또한 실제 CAN 장치 없이 can-utils를 사용해 볼 수 있다. vcan 장치를 생성하려면 다음을 실행한다.

sudo ip link add name vcan0 type vcan
sudo ip link set up vcan0

 

장치가 활성화되면 사용할 수 있는 여러 유틸리티가 있다.

 

candump
candump는 버스의 메시지를 실시간으로 표시한다. can0 기기에서 모든 트래픽을 실시간으로 표시하려면 다음을 실행한다.

candump can0

표시된 메시지는 마스크와 식별자를 사용하여 필터링 할 수 있다. 두 가지 필터 유형을 사용할 수 있다. [can_id]:[can_mask] matches when [received_can_id] & [can_mask] == [can_id] & [mask][can_id]~[can_mask] matches when [received_can_id] & [can_mask] != [can_id] & [mask]

예를 들어 다음 명령 줄은 vcan0 에서 ID가 0x123 인 메시지 만 표시한다 :

candump vcan0,0x123:0x7FF

vcan0에서 ID 0x123 또는 ID 0x456의 메시지 만 표시 :

candump vcan0,0x123:0x7FF,0x456:0x7FF

cansend
cansend는 단일 CAN 프레임을 버스로 보낸다. 전송할 장치, 식별자 및 데이터 바이트를 지정해야 한다. 예를 들면 :

cansend can0 123#1122334455667788

can0 인터페이스에서 식별자 0x123 및 데이터 바이트 [0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88]로 메시지를 보낸다.

 

예제 1 :

필터링 없이 모든 데이터를 수신, ID 0x100 으로 전송

$ candump  -c -c -ta vcan0 &
[1] 323
$ cansend vcan0 100#0123456789ABCDEF
 (1642643107.363888)  vcan0  100   [8]  01 23 45 67 89 AB CD EF

 

예제 2 :

CAN ID 0x123의 메세지 만 표시

$ candump -c -c -ta vcan0,0x123:0x7FF &
[1] 326
$ cansend vcan0 100#0123456789ABCDEF
$ cansend vcan0 123#0123456789ABCDEF
 (1642664994.429606)  vcan0  123   [8]  01 23 45 67 89 AB CD EF

 

기타 유용한 도구

cansniffer
cansniffer는 현재 버스에서 변경되지 않는 데이터가 있는 프레임을 필터링 한다. 이것은 리버스 엔지니어링 CAN 버스 시스템에 매우 유용하다. 자세한 사용 정보는 cansniffer 를 실행해보자.

cangen
cangen은 임의의 CAN 데이터를 생성 할 수 있으며 이는 테스트에 유용 할 수 있다. 자세한 내용은 cangen을 실행하여 자세한 사용 정보를 확인한다.

 

Reference:

https://www.kernel.org/doc/html/latest/networking/can.html

번호 제목 글쓴이 날짜 조회 수
25 Wayland에 대한 간단한 소개 file makersweb 2017.12.29 4268
24 NFS를 통해 파일시스템 공유 makersweb 2018.03.05 1812
23 Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 file makersweb 2018.03.07 7988
22 tslib 크로스 컴파일과 터치스크린 보정 makersweb 2018.08.02 2967
21 libblkid - USB Storage의 정보 가져오기 makersweb 2018.10.18 1333
20 리눅스 컴파일러 최신으로 업데이트 linux 2018.12.26 2629
19 PATH에 새로운 경로 추가 makersweb 2019.09.19 1160
18 플랫폼 디바이스 드라이버 개발 시 많이 사용되는 커널 API 및 매크로 makersweb 2020.01.28 5987
17 initramfs (initial ram file system: 초기 램 파일 시스템) makersweb 2020.02.25 3075
16 64비트 리눅스에서 32비트 응용프로그램을 실행하려면 makersweb 2020.02.29 2902
15 Weston 의 설명 및 관련 컴포넌트 makersweb 2020.06.03 3872
14 Wayland 의 주요 객체들 makersweb 2020.06.04 2104
13 Wayland 의 Client Application 프로그래밍 기본 루틴 makersweb 2020.06.04 2902
12 wayland-scanner 를 통해 Wayland 프로토콜 코드생성 makersweb 2020.06.08 2179
11 리눅스 오디오 스택과 아키텍처 file makersweb 2020.09.02 4127
10 dbus-broker를 기본 DBus 구현으로 설정 makersweb 2021.01.20 2585
» SocketCAN 유틸 사용방법 file makersweb 2022.02.05 10625
8 ifconfig 는 대부분 ip 명령으로 대체 makersweb 2022.02.12 2923
7 D-Bus ObjectManager file makersweb 2022.02.12 1838
6 리눅스에서 네트워크 구성 makersweb 2022.06.11 4234