SocketCANプラグインの使用

SocketCANプラグインは、CANデバイスにアクセスするためのLinuxソケットAPIをカプセル化します。このAPIは、Volkswagen Researchが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を500kBit/sのアービトレーションビットレートと4MBit/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) {
    // Error handling goes here
    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は以下の追加機能をサポートしています:

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。