このページでは

SocketCANプラグインの使用

SocketCANプラグインは、CANデバイスにアクセスするためのLinuxソケットAPIをカプセル化したものです。このAPIは、フォルクスワーゲン・リサーチがLinuxカーネルに寄贈した、オープンソースのCANドライバとネットワークスタックのセットです。

このプラグインを使用するには、SocketCANをサポートするLinuxカーネルと、使用するCANハードウェア用のSocketCANデバイスドライバが必要です。

SocketCAN の使用方法

すべてのネットワークインターフェース(設定済みのもの以外も含む)を一覧表示するには、ifconfig -a というコマンドを使用できます。

SocketCAN を使用するには、対応する Linux カーネルモジュールをロードし、ネットワークインターフェースを設定する必要があります。

実際のCANハードウェアの設定

このセクションでは、デバイスドライバがすでに読み込まれていることを前提としています(通常、CANハードウェアを接続すると自動的に読み込まれます)。

デフォルト設定

デバイス can0 のビットレートを 250 kBit/s に設定するには:

sudo ip link set up can0 type can bitrate 250000

「バスオフ」エラー発生後、100ミリ秒経過後に自動的に回復させるには、次のコマンドを使用できます:

sudo ip link set up can0 type can bitrate 250000 restart-ms 100

CAN 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 vcan0

CANバスデバイスの作成

まず、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 インターフェースは、Linux システム上の通常のネットワークインターフェースと同様に動作し、`ifconfig` を使用して検出できます。また、`availableDevices()` メソッドは、現在利用可能なデバイスのリストを返します。

これで、デバイスが CAN フレームの読み書きに対応するようになりました:

QCanBusFrame frame;
frame.setFrameId(8);
QByteArray payload("A36E");
frame.setPayload(payload);
device->writeFrame(frame);

読み取りは、readFrame() メソッドを使用して行うことができます。framesReceived() シグナルは、読み取り可能な新しいフレームが少なくとも 1 つ利用可能になったときに発せられます:

QCanBusFrame frame = device->readFrame();

SocketCANは、setConfigurationParameter()を通じて制御可能な以下の設定をサポートしています:

設定パラメータのキー説明
QCanBusDevice::LoopbackKeyマルチユーザー環境のニーズに対応するため、ローカルループバックはデフォルトで有効になっています。これは、CANバス上でCANフレームが送信されるたびに、そのフレームのローカルエコーが、このCANデバイスに接続されているすべてのアプリケーションに送信されることを意味します。このオプションが有効になっている場合、受信されたフレームにはQCanBusFrame::hasLocalEcho()が設定されます
QCanBusDevice::ReceiveOwnKeyデフォルトでは、CANフレームを送信したのと同じソケットでのCANフレームの受信は無効になっています。このオプションを有効にすると、CANバスに送信されたすべてのCANフレームが直ちに受信バッファに現れます。これは、送信が成功したかどうかを確認するために使用できます。このオプションが有効になっている場合、受信されたフレームにはQCanBusFrame::hasLocalEcho()が付与されます
QCanBusDevice::ErrorFilterKeyCANインターフェースドライバは、いわゆるエラーメッセージフレームを生成することができ、これらはオプションで他のCANフレームと同様にユーザーアプリケーションに渡すことができます。発生しうるエラーはさまざまなエラークラスに分類されており、適切なエラーマスクを使用してフィルタリングすることができます。エラーマスクの値はlinux/can/error.h で定義されています。
QCanBusDevice::RawFilterKeyこの設定には、QCanBusDevice::Filter 型のフィルタを複数含めることができます。デフォルトでは、接続はすべての CAN バスメッセージを受け入れるように設定されています。
QCanBusDevice::BitRateKeyCANバス接続のビットレートを指定します。 以下のビットレートがサポートされています:5000、10000、20000、33000、47000、50000、83000、95000、100000、 125000、250000、500000、800000、1000000。 この設定パラメータは、QCanBusDevice が接続されていない間のみ調整できることに注意してください。この設定パラメータを設定するには、実行時にライブラリ libsocketcan が必要です http://www.pengutronix.de/software/libsocketcan 通常、CANバスのビットレートを設定するにはroot権限が必要です。
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は、以下の追加機能をサポートしています:

© 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.