SocketCANプラグインの使用
SocketCANプラグインは、CANデバイスにアクセスするためのLinuxソケットAPIをカプセル化します。このAPIは、Volkswagen ResearchがLinuxカーネルに提供したオープンソースのCANドライバーとネットワークスタックのセットです。
このプラグインを使用するには、SocketCANをサポートするLinuxカーネルと、使用するCANハードウェア用のSocketCANデバイスドライバーが必要です。
SocketCANの使い方
すべての(未設定を含む)ネットワークインターフェースを一覧表示するには、ifconfig -a
コマンドを使用します。
SocketCANを使用するには、対応するLinuxカーネル・モジュールがロードされ、ネットワーク・インターフェースが設定されている必要がある。
実際のCANハードウェアのセットアップ
このセクションでは、デバイスドライバがすでにロードされていることを前提としています(ほとんどの場合、CANハードウェアの接続時に自動的にロードされます)。
デフォルト設定
デバイスcan0をビットレート250kBit/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はプラグイン名です。
次に、特定のインターフェースへの接続を確立する:
QStringerrorString;QCanBusDevice*デバイス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::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バスのビットレートを設定するには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は以下の追加機能をサポートしています:
- QCanBusDevice::resetController() (libsocketcan が必要)
- QCanBusDevice::busStatus() (libsocketcan が必要)
© 2025 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.