SocketCAN은 Linux용 CAN 프로토콜(Controller Area Network)의 구현이다. 다른 네트워크 장치와 유사한 방식으로 다른 CAN 버스 장치와 커뮤니케이션 할 수 있는 인터페이스를 제공한다. 즉 네트워크 소켓 프로그래밍 인터페이스를 통해서 CAN 버스에 접근하는 애플리케이션을 개발할 수 있다. 또한 CAN 드라이버 및 네트워킹 도구 모음등을 제공한다. 이 글에서는 SocketCAN 관련 유틸에 대한 간단한 사용방법을 소개한다.
먼저 SocketCAN에서 제공하는 CAN 인터페이스 유형을 알아보자. 다음과 같은 것들이 있다.
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 장치를 활성화하면 된다.
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 장치 또는 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을 실행하여 자세한 사용 정보를 확인한다.