SocketCAN 플러그인 사용
SocketCAN 플러그인은 CAN 장치에 접근하기 위한 리눅스 소켓 API를 캡슐화한 것입니다. 이 API는 폭스바겐 리서치(Volkswagen Research)가 리눅스 커널에 기여한 오픈 소스 CAN 드라이버 및 네트워킹 스택으로 구성되어 있습니다.
이 플러그인을 사용하려면 SocketCAN을 지원하는 리눅스 커널과 사용 중인 CAN 하드웨어용 SocketCAN 장치 드라이버가 필요합니다.
SocketCAN 사용법
모든 네트워크 인터페이스(구성되지 않은 인터페이스 포함)를 나열하려면 ` ifconfig -a ` 명령을 사용할 수 있습니다.
SocketCAN을 사용하려면 해당 Linux 커널 모듈을 로드하고 네트워크 인터페이스를 구성해야 합니다.
실제 CAN 하드웨어 설정
이 섹션에서는 장치 드라이버가 이미 로드되어 있다고 가정합니다(대부분의 경우 CAN 하드웨어를 연결하면 자동으로 로드됩니다).
기본 설정
장치 can0의 비트레이트를 250 kBit/s로 설정하려면:
sudo ip link set up can0 type can bitrate 250000"bus off" 오류 발생 후 100밀리초가 지나면 자동으로 복구하려면 다음 명령을 사용할 수 있습니다:
sudo ip link set up can0 type can bitrate 250000 restart-ms 100CAN FD 설정
장치 can0의 중재 비트레이트를 500 kBit/s로, 데이터 비트레이트를 4 MBit/s로 설정하려면(비트레이트 전환 플래그가 있는 프레임의 경우):
sudo ip link set can0 up type can bitrate 500000 dbitrate 4000000 fd on가상 CAN 버스 설정
참고: CAN FD를사용하려면 MTU(최대 전송 단위)를 72바이트로 설정해야 합니다.
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0 mtu 72다음에서 사용되는 명령줄 테스트 프로그램은 can-utils 패키지에서 가져온 것입니다:
# Display received CAN messages with absolute timestamps and flags
candump -ta -x vcan0
# Send a CAN FD message with flags BRS and EFI set
cansend vcan0 123##3112233445566778899aabbccddeeff
# Generate random CAN messages
cangen vcan0CAN 버스 장치 생성
먼저 QCanBus 에서 원하는 플러그인이 제공되는지 확인해야 합니다:
if (QCanBus::instance()->plugins().contains(QStringLiteral("socketcan"))) {
// plugin available
}여기서 socketcan은 플러그인 이름입니다.
다음으로, 특정 인터페이스에 대한 연결을 설정할 수 있습니다:
QString errorString;
QCanBusDevice*device = QCanBus::instance()->createDevice(
QStringLiteral("socketcan"), QStringLiteral("can0"), &errorString);
if (!device) {
// 여기 오류 처리 코드를 작성합니다
qDebug << errorString;
} else {
device->connectDevice();
}여기서 `can0 `은 활성화된 CAN 인터페이스 이름입니다. CAN 인터페이스는 리눅스 시스템에서 일반 네트워크 인터페이스와 같은 역할을 하며, ` ifconfig`을 사용하여 탐색할 수 있습니다. 또한, ` availableDevices()` 메서드는 현재 사용 가능한 장치 목록을 반환합니다.
이제 해당 장치를 통해 CAN 프레임을 읽고 쓸 수 있습니다:
QCanBusFrame frame;
frame.setFrameId(8);
QByteArray payload("A36E");
frame.setPayload(payload);
device->writeFrame(frame);읽기 작업은 readFrame() 메서드를 사용하여 수행할 수 있습니다. 읽을 수 있는 새로운 프레임이 하나 이상 있을 때 framesReceived() 신호가 발생합니다:
QCanBusFrame frame = device->readFrame();SocketCAN은 setConfigurationParameter()를 통해 제어할 수 있는 다음과 같은 구성들을 지원합니다:
| 구성 매개변수 키 | 설명 |
|---|---|
| QCanBusDevice::LoopbackKey | 다중 사용자 요구 사항을 충족하기 위해 로컬 루프백은 기본적으로 활성화되어 있습니다. 즉, CAN 버스에서 CAN 프레임이 전송될 때마다 해당 프레임의 로컬 에코가 이 CAN 장치에 연결된 모든 애플리케이션으로 전송됩니다. 이 옵션이 활성화되면, 수신된 프레임은 QCanBusFrame::hasLocalEcho()로 표시됩니다. |
| QCanBusDevice::ReceiveOwnKey | 기본적으로 CAN 프레임을 전송한 것과 동일한 소켓에서 CAN 프레임을 수신하는 기능은 비활성화되어 있습니다. 이 옵션을 활성화하면 CAN 버스로 전송된 모든 CAN 프레임이 즉시 수신 버퍼에 나타납니다. 이를 통해 전송이 성공적으로 이루어졌는지 확인할 수 있습니다. 이 옵션이 활성화되면, 이로 인해 수신된 프레임에는 QCanBusFrame::hasLocalEcho()가 표시됩니다. |
| QCanBusDevice::ErrorFilterKey | CAN 인터페이스 드라이버는 소위 오류 메시지 프레임을 생성할 수 있으며, 이 프레임은 다른 CAN 프레임과 동일한 방식으로 사용자 애플리케이션에 전달될 수 있습니다. 발생할 수 있는 오류는 여러 오류 클래스로 분류되며, 적절한 오류 마스크를 사용하여 필터링할 수 있습니다. 오류 마스크의 값은 linux/can/error.h 에 정의되어 있습니다. |
| QCanBusDevice::RawFilterKey | 이 구성에는 QCanBusDevice::Filter 유형의 필터가 여러 개 포함될 수 있습니다. 기본적으로 연결은 모든 CAN 버스 메시지를 수신하도록 구성됩니다. |
| QCanBusDevice::BitRateKey | CAN 버스 연결의 비트 전송률을 결정합니다. 다음의 비트 레이트가 지원됩니다: 5000, 10000, 20000, 33000, 47000, 50000, 83000, 95000, 100000, 125000, 250000, 500000, 800000, 1000000. 이 구성 매개변수는 QCanBusDevice 가 연결되어 있지 않은 상태에서만 조정할 수 있습니다. 이 구성 매개변수를 설정하려면 런타임 시 libsocketcan 라이브러리가 필요합니다http://www.pengutronix.de/software/libsocketcan 일반적으로 CAN 버스 비트레이트를 설정하려면 루트 권한이 필요합니다. |
| QCanBusDevice::CanFdKey | 이 구성 옵션은 CANFD 프레임을 송수신할 수 있는지 여부를 결정합니다. 기본적으로 이 옵션은 비활성화되어 있습니다. 이 옵션은 CAN 소켓의 CAN_RAW_FD_FRAMES 옵션을 제어합니다. |
| QCanBusDevice::DataBitRateKey | 이 구성은 socketcan 플러그인에서 지원되지 않습니다. 그러나 ip link 명령을 사용하여 CAN 네트워크 인터페이스를 구성할 때 데이터 전송 속도를 설정할 수 있습니다. |
| QCanBusDevice::ProtocolKey | PF_CAN 프로토콜 패밀리 내에서 다른 프로토콜을 사용할 수 있게 합니다. 이 구성 옵션의 기본값은 CAN_RAW(1)입니다. |
예를 들어:
QList<QCanBusDevice::Filter> list;
QCanBusDevice::Filter f;
// only accept odd numbered frame id of type remote request
// frame can utilize extended or base format
f.frameId = 0x1;
f.frameIdMask = 0x1;
f.format = QCanBusDevice::Filter::MatchBaseAndExtendedFormat;
f.type = QCanBusFrame::RemoteRequestFrame;
list.append(f);
device->setConfigurationParameter(QCanBusDevice::RawFilterKey, QVariant::fromValue(list));
device->setConfigurationParameter(QCanBusDevice::ErrorFilterKey,
QVariant::fromValue(QCanBusFrame::FrameErrors(QCanBusFrame::AnyError)));SocketCAN에서는 확장 프레임 형식과 유연한 데이터 전송 속도가 지원됩니다.
SocketCAN은 다음과 같은 추가 기능을 지원합니다:
- QCanBusDevice::resetController() (libsocketcan 필요)
- QCanBusDevice::busStatus() (libsocketcan 필요)
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.