CANバス解析のハマりどころ
整備手帳にも多少書いているように、CANバスの解析を行っています。CANバス解析の情報は少ないので、私がハマったところをまとめておきます。TCP/IPのパケットキャプチャぐらいは当たり前にやったことがある、という人が想定読者です。
◆解析に用いる環境
まず環境ですが、大いに参考にしているCar Hacker's Handbookの解説がLinux上のツールを中心にしていることと、自分自身、20世紀からUNIXおよびLinuxを使っていて(カーネルがバージョン1になる前です)慣れていることから、Ubuntu系の環境を使っています。
CANバスアダプタは、パーツ紹介に書いたusb2canを使っています。安価なのにSocketCAN対応していて便利です。
https://minkara.carview.co.jp/userid/2898510/car/2508605/8995638/parts.aspx
車両からのCANバス取り出しケーブルは、下記パーツを購入して、反対側にDSUB 9ピンコネクタを接続しただけです。
http://www.to-fit.co.jp/obd2.html
Kayak, can-utils(canplayer, cansniffer等)は自分でビルドしています。cantoolsは、pip3でインストールしただけです。kcdファイルの編集には、適当なテキストエディタを使っています。
◆ハマった点
自分がハマったのは、以下の点です。
1. VirtualBoxのUSBの不安定さ
当初、WindowsをホストOSとしたVirtualBox内の仮想マシンに、Ubuntuをインストールして、そこにusb2canをVirtualBox経由で接続していました。この構成で、実車に流れるCANパケットのログをところまで特に問題なく動作していたのですが、そのログをICテストベンチに対して流そうとしたところ、途中で止まったり、ドライバが謎のエラーを吐いたりして困りました。
ドライバのソースなども追いかけたのですが原因が分からず、あまり使っていないパソコンに直接Ubuntuをインストールして、ハード的に直接usb2canを接続するようにしたら、特に問題が発生しなくなったので、VirtualBoxのUSB機能が高負荷時には不安定になるようです。
2. SocketCANのデフォルトの送信バッファの小ささ
実車のCANログをcanplayerでテストベンチに流していると、結構な頻度で、sendto: No buffer space available というエラーが出ます。送信バッファのサイズが小さすぎるようです。下記のコマンドで、送信バッファを大きくすれば解消します。
$ sudo ifconfig can0 txqueuelen 1000
3. bit numberingの不統一
CANの生パケットは8バイトです(これより短くても良いが、説明を簡単にするため、以下8バイトで統一。マツダ車はすべて8バイト)。この8バイトに、色々な情報を詰め込む都合上、CANのデータはほとんどビット単位で語られます。たとえば、「第19ビットが左ウィンカー、第13ビットからの12ビットが回転数」のような感じです。
しかしながら、ビット番号の付け方が、統一されていません。
最終的に自分が使っているcantoolsでは、下記のようになっています(cantoolsのドキュメントより)。思わず「どうしてこうなった…」とつぶやきたくなる規約ですね。
しかし、当初使っていたKayakというツールでは、ビット番号はcantoolsと同じであることは実車のログとICテストベンチで確認できたのですが、長さを数える方向がよく分かりません(kcdファイルを色々書き換えて試したのですが)。Kayakを自分でビルドする際に、何かミスしている可能性もありますが…。
さらに、マツダのSkyActiv世代のCANバスのメッセージを解析した情報を見付けたのですが、これはビット番号が左から0から順に63まで増えて行き、長さは右から左に数えられています。気が向いたら、この方に何のツールで使ったkcdなのか聞いてみたいと思っていますが、とりあえず、自分が扱いたいメッセージについてoffsetを手で変換して使っています。
https://github.com/majbthrd/MazdaCANbus/blob/master/skyactiv.kcd
◆最終的な解析の流れ
最終的には、以下のような流れで解析しています。
- 実車に対してcandumpを実行して採集したログを、canplayerでICテストベンチに対して流してみる
- cansnifferで16進表示したり2進表示したりしながら、ICの表示と見比べて、欲しい情報がどのあたりにあるかを予想する
- その情報だけをcangenで、ICテストベンチに対して流してみて、動作を比較する
- KCDファイルを更新して、実車のログをcantools decodeでデコードしながらICに流して、ICの表示と一致することを確認する。
なお、cantoolsはPythonで書かれているのですが、decodeの処理をちょっと改造して、kcdファイルに記述されているIDのみを表示するようにしています。
ブログ一覧 | 日記
Posted at
2018/06/08 01:07:23