CAN通信のお勉強 with Ubuntu 22.04

クルマ
この記事は約5分で読めます。

設定手順

必要パッケージのインストール

Ubuntuを入れただけだとまだいくつか足りないものがあるので、
端末を開いてインストールを試みます。

この辺は handbook にも書いてあるんですが、
執筆当時と現在でカーネルの設定が一部違うため、一部修正が必要な部分があります
(これに苦戦したので時間がかかった。。。)

CAN-utils

まずはCAN通信に必要なパッケージをインストールします。
これは本に書いてあるとおりそのまま下記を端末に打ち込めばインストールできました。

sudo apt-get install can-utils

net-tools

CAN通信のネットワークを構成したり、各ネットワークの情報を確認したりするのに
net-toolsも入れておく必要があります。Ubuntuのデフォルトだと入っていないので。
とはいえこれもインストールは難しくなく、下記のように打てばすぐにできます。

sudo apt-get install net-tools

Socketcand Daemon

後に紹介するKayakというアプリを使うために必要なデーモンらしいのですが、
これのインストールに結構苦戦しました。。

Handbook記載のリンクだとv0.4.2が最新になってますが、
当該ページの案内をもとに辿っていくと、最新版は下記にあるようです。

Tags · linux-can/socketcand
Server to access CAN sockets over ASCII protocol. Contribute to linux-can/socketcand development by creating an account ...

あとはこれをダウンロードして解凍し(右クリックメニューでやるのが楽)、
Readme に記載してあるとおりに端末を開いてコンパイルするだけ…と思いきや
./configure を試した際に下記のメッセージが出て失敗します。
(autoconfの前にautoupdateやれって言われたり、そもそもmakeとかgccをインストールしないといけなかったりというのもあるんですが、その辺の手順は端末上で教えてくれるのでここでは割愛します)

とりあえずテストに失敗したらしいのはわかるんですが要因がわからないので
一旦スルーするために

./configure –without-config

と打ち込んでから make でコンパイルを試みると、今度は下記のエラーが出て止まります。

“SIOCGSTAMP” が未定義であるというエラーなんですが、
どうやらこれはcソースに不備がある(ヘッダファイルの定義が足りていない)ようで、
state_bcm.c と state_isotp.c の両方のファイルに下記を書き足してやれば解決できます。
場所的に24行目ぐらいに付け加えるのがよいかと。

#include <linux/sockios.h>

これでコンパイルし直して一見落着…と思いきや、今度は別のエラーが出ます。

いくつかの変数が複数回定義されているというもの。
別々のcファイルの中で定義されているからローカル変数扱いじゃないの?
と思ったんですが、コンパイル時は別のファイルでも同じ変数は1回しか定義してはいけないらしく(久しく触れてなかったからこの辺のルール忘れてた)、
エラーを避けるには別々の変数として定義し直してやる必要があります。

しかし厄介なのは、定義の重複がどのファイルで起きているかわからないこと。。
仕方ないのでgrepをかけて探して見ると、下記5つのファイルに絞り込めました。

  • socketcand.c
  • socketcandcl.c
  • state_bcm.c
  • state_isotp.c
  • state_raw.c

あとはこれらのファイルを開いて、重複している変数を、
ifr -> ifr0,  tv -> tv0 のように置き換えていくだけ。
作業自体はそう大したことではないんですが、これでいいのかなあと思いながら
ソースコードを修正。
その後、再度 make をかけると無事にコンパイルが通りました。
あとは

make install

を実行すれば晴れてインストール完了です。

起動時のエラー “Error in Beacon send()”

Handbook 通りの手順で 仮想のCANネットワークとして vcan0 をセットアップしたので
(詳しくはChapter3参照)、早速 socketcand を接続しようと

socketcand -i vcan0

を実行してみたのですが、 “Error in Beacon send()” というメッセージが出て一向に進まず。
どうやらデフォルトのインターフェースが ’eth0’ になっているようで、
このPCにイーサネットの口はないのでそのせいかな?とも思ったのですが

socketcand -l vcan0

とデフォルト接続先を変更してみても特に変わらず。
困っていろいろググって見たんですが、下記のスレッドが参考になりそうでした。

socketcand not connecting to socketCAN · Issue #15 · dschanoeh/socketcand
Compiled on Fedora using all current developmental headers. Code: sudo modprobe vcan sudo ip link add dev vcan0 type vca...

どうやらKayakを使うとエラーが治まるとのこと。Kayak内で接続するからかな?
どのみちKayakを使うつもりではあるので、
ここは一旦無視してKayakのインストールを実施します。

Kayak

CANネットワークを通して信号の計測やGPS情報との紐付けなどができるアプリケーションらしいです。
紹介ページはこちらですが、実際はgithubから直接落としたほうが早そう。
まだ開発中とのことですが、2024年現在で最新版は2019のものみたいです。

Releases · dschanoeh/Kayak
Kayak is a CAN bus analysis tool based on SocketCAN - dschanoeh/Kayak

ダウンロードしてきたファイルを展開し、中に入っているBUILD.mdを読むと
インストールのためには JDK と maven2 が必要とのこと。

sudo apt install maven

を実行してmavenをインストールした後、

mvn clean install

を実行したところ、最終的に下記のエラーが。。

どうやら java のバージョンが非対応っぽいです。
下記のものをインストールすることで解決しました。

apt-get install openjdk-11-jre

上記のJavaをインストール後、再度  “mvn clean install” を実行することで
Kayakのビルドが完了します。
BUILD.mdの方にも記載がありますが、アプリは /application/target/kayak/bin の中にある
”Kayak” というファイルを実行することで起動できます。
起動するとこんな感じ。

これで最低限の準備は整いました。

次ページ:いよいよネットワークに接続

コメント