SocketCAN과 can-utils


2016-12-09 14:56:32



CAN통신 환경을 실제로 접하려면 자동차의 OBD포트에 별도의 단말을 연결하고 그 단말과 PC를 연결해야 합니다. 즉 테스트를 해보려면 자동차에 올라타서 선을 직접 연결하고서야 비로소 테스트 환경이 갖춰집니다. 그러나 테스트를 진행할 때마다 매번 자동차에 가서 작업을 하는 것은 귀찮고 피곤한 일입니다.

그래서 우리는 SocketCAN이라는 리눅스용 CAN드라이버를 이용하여 리눅스에서 가상으로 CAN통신 환경을 접해볼 것입니다. 비유하자면, 우리가 윈도우 운영체제에서 리눅스 운영체제를 사용해야 할 경우 VMware와 같은 가상머신을 이용하여 리눅스를 구동하는 것처럼 말입니다.

SocketCAN은 Volkswagen Group Research社가 리눅스 커널에 제공한 오픈 소스 CAN드라이버입니다. 리눅스 커널 버전 2.6.25 이상에서 지원됩니다. SocketCAN은 버클리 소켓 API와 리눅스 네트워크 스택을 사용하며, CAN드라이버를 네트워크 인터페이스로 구현하고 있습니다. TCP/IP 프로토콜과 유사하게 구현되어 있으므로 기존 네트워크 프로그래밍과 비슷하게 사용할 수 있습니다.

SocketCAN은 네트워크 레이어 상에 구현된 커널 영역에 소켓 인터페이스를 제공합니다. 이로 인해 커널은 CAN드라이버를 핸들링 할 수 있고, 기존 네트워킹 하드웨어와 맞물려 공통 인터페이스 및 사용자 영역 유틸리티를 제공할 수 있습니다.

%ea%b7%b8%eb%a6%bc1
[그림 1] SocketCAN layout (left) and traditional CAN software (right)


* 실습 환경 *
 - Virtual Machine: VMware Workstation 10
 - OS: Ubuntu 16.10 64bit
 - Kernel Version: 4.8.0.22

can-utils 패키지는 CAN드라이버(SocketCAN)와 상호작용하기 위한 여러 유저영역 툴을 제공합니다.
아래와 같이 git을 이용하여 다운로드받을 수 있습니다.

$ sudo git clone https://github.com/linux-can/can-utils

'can-utils'에 복제합니다...
remote: Counting objects: 1260, done.
remote: Total 1260 (delta 0), reused 0 (delta 0), pack-reused 1260
오브젝트를 받는 중: 100% (1260/1260), 368.45 KiB | 139.00 KiB/s, 완료.
델타를 알아내는 중: 100% (815/815), 완료.
연결을 확인하는 중입니다... 완료.

git을 이용하여 can-utils 패키지를 다운로드받았으니 패키지 내의 소스코드들을 모두 컴파일하여 실행파일로 만듭니다.

$ cd can-utils
$ ./autogen.sh

----------
autoreconf
----------

./autogen.sh: 줄 20: autoreconf: 명령어를 찾을 수 없음

autoreconf 명령어를 찾을 수 없어 쉘 스크립트를 실행할 수 없는 에러가 발생합니다.
apt-get을 이용하여 autoreconf 명령어를 설치한 후 다시 autogen 스크립트를 실행합니다.

$ sudo apt-get install dh-autoreconf
$ sudo ./autogen.sh

----------
autoreconf
----------

libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'config/autoconf'.
libtoolize: copying file 'config/autoconf/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'config/m4'.
libtoolize: copying file 'config/m4/libtool.m4'
libtoolize: copying file 'config/m4/ltoptions.m4'
libtoolize: copying file 'config/m4/ltsugar.m4'
libtoolize: copying file 'config/m4/ltversion.m4'
libtoolize: copying file 'config/m4/lt~obsolete.m4'
libtoolize: Consider adding '-I config/m4' to ACLOCAL_AMFLAGS in Makefile.am.
configure.ac:19: installing 'config/autoconf/compile'
configure.ac:9: installing 'config/autoconf/config.guess'
configure.ac:9: installing 'config/autoconf/config.sub'
configure.ac:22: installing 'config/autoconf/install-sh'
configure.ac:22: installing 'config/autoconf/missing'
GNUmakefile.am: installing 'config/autoconf/depcomp'

--------
Finished
--------

$ ls

%ea%b7%b8%eb%a6%bc2
[그림 2] configure 파일 생성 화면



$ sudo ./configure
$ sudo make
$ sudo make install
$ ls

%ea%b7%b8%eb%a6%bc3
[그림 3] can-utils 패키지 설치 완료 화면



이렇게 해서 can-utils 패키지를 설치 완료하였습니다.
마지막으로 can-utils 패키지에 포함된 주요 툴들의 기능을 간단히 살펴보겠습니다.

기능
asc2log ASCII CAN 덤프 파일을 표준 SocketCAN 로그 파일 형식으로 만든다.
candump CAN네트워크 상의 CAN패킷을 덤프한다.
cangen CAN패킷을 생성한다.
canplayer 표준 SocketCAN compact 형식에 맞게 저장된 패킷들을 리플레이한다.
cansend 하나의 CAN패킷을 네트워크 상에 전송한다.
cansniffer ID별로 패킷을 그룹화하고 변경된 바이트를 강조하여 표시한다.
slcan_attach 시리얼 CAN디바이스를 attach한다.
slcand 시리얼 CAN디바이스를 핸들링하는 데몬이다.
[표] can-utils 주요 툴 기능



#SocketCAN #CAN드라이버 #리눅스CAN #can-utils

10 thoughts on “SocketCAN과 can-utils

  1. I like the helpful info you provide in your articles.

    I’ll bookmark your blog and check again here regularly.
    I’m quite certain I’ll learn lots of new stuff right here!

    Best of luck for the next!

  2. Hi there very cool web site!! Man .. Excellent ..
    Wonderful .. I’ll bookmark your blog and take the feeds additionally?
    I’m glad to seek out a lot of helpful information here within the post, we need develop more techniques in this
    regard, thank you for sharing. . . . . .

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.