ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

自分の車の診断アプリ作ってみた

※こちらの記事は2021年2月15日公開note版「ラック・セキュリティごった煮ブログ」と同じ内容です

 

デジタルペンテスト部の宮崎です。
セキュリティ業界では「診断」という言葉がよく聞かれますが、実は自動車にも診断機能があるのをご存知でしょうか?
車が自分自身の状態をチェックして、異常があれば人間に知らせてくれるとても便利な機能です。
本来この機能は整備士向けのもので、診断情報を読み出すには数十万円する専用の機器が必要なのですが、今回は近所のビックカメラで買った中古のAndroid端末と、amazonで買った千円のドングルで診断アプリを自作してみたお話しをしたいと思います。

OBDとは

ELM327

写真はELM327と呼ばれるドングルです。こいつをDLCに差し込むことで自動車の診断情報がBluetoothで読み出せます。
Amazonで千円ほどで売っています。



通信確認

 

まずはELM327が正しく通信が行えるかをノートPCを使って確認します。
ELM327とペアリングするとCOMポートとして認識されます。ターミナルソフトを立ち上げて画像のようなデータが表示されていればOKです。
データが文字化けもせず表示されていることから、通信は正常に行われていることがわかります。

 

メッセージフォーマット

 

診断情報のメッセージフォーマットの一例を載せています。
なにやらわけのわからない16進数が並んでいるように見えますが、眺めていると規則性が分かってきます。
1行あたりのバイトサイズは5バイト、7バイト、8バイトであること。
バイトサイズに応じて行頭が81、83、84と変化していること。
などなど簡単な規則性があることがお分かりいただけるかと思います。

プロトコル

 

規則性があるということは。その通り、診断情報のメッセージフォーマットはプロトコルとして定義されています。
プロトコルにはいくつか種類があって、その車がどのプロトコルを採用しているかは車種やメーカーによりけりです。
画像はELM327がサポートしているプロトコルの一覧です。
現在はISO 15765-4 CANが主流ですが、わたしの車はISO 14230-4 KWPということがわかりました。
特定の仕方は、プロトコルは0からCの13種類しかないので総当たりで初期化を実行し、正しく応答が返ればOKというやり方です。

 

勉強

どのプロトコルが採用さているかが判明したので、次はプロトコルそのものを勉強をします。
親切にもELM327のデータシートには、それぞれのプロトコルにおけるメッセージフォーマットの解説が記載されています。
KWP2000の場合、ヘッダが3バイト、データが7バイト以下、そしてチェックサムという形式です。
非常にシンプルですね。これなら勉強が嫌いなわたしでも真面目に調べようかなという気持ちになれます。

Android

早速アプリを作ってみました。いきなり完成画像です。
開発日数1週間。
DIAGNOSISというボタンをタップすると診断情報を表示してくれます。
プログラムの詳しい説明や開発過程を記載すると紙面が足りないので割愛します。
ソースコードが欲しい方がいましたら宮崎まで連絡ください。

DTC

DIAGNOSISを実行すると、出ました。無事にDTCが取得できてしまいました。
DTCというのはDiagnostic Trouble Codeの略で、異常の内容に応じて割り当てられたトラブルコードのことです。
当然のことながら、どこにも不具合のない車両であればDTCは発生しません。
さすが、ヤフオクで買った中古車両。ばっちりDTCが発生していました。
私の車には、EFI/AT/ABS/AIRBAG/ROOFの5つのECUが搭載されているのですが、そのうちABSとROOFのECUで異常を検知しています。
ABSのECUからはC1238とC1239、ROOFのECUからはB2595というDTCが取得できました。
それぞれChassis系とBody系に異常があるということです。
ABSに異常となると人命に関わるので、もう少し暖かくなったら修理しようと思います。

ブースト圧

OBDはもともと自動車の異常を人間に知らせるために出来た規格ですが、実は診断情報だけではなく車のさまざまな情報を読み出せます。
たとえば、エンジンの回転数であったり速度であったり水温や走行距離、はては現在地の高度などなど、本当にさまざまな情報です。
もともとアプリを作ろうと思ったきっかけは、診断情報も読み出したいけどブースト圧を知りたいなと思ったからです。
専用のかっこいいブースト計も販売されているのですが、アプリで読み出せるならメーターを後付けする手間もないし便利だろうなと。
というわけで自作アプリに機能を追加し、水温・ブースト圧・エンジンの回転数・車速を取得できるようにしました。
左がアイドリング状態、右が少しだけアクセルを踏んだときの画像です。
回転数(Revs)に応じて、吸気管絶対圧力(Boost)の値が変化していることがわかります。
アイドリング状態からアクセルを踏んだだけなので負圧の状態ですが、実際に走行させてターボがかかれば正圧となり値が大きくなるはずです。

 

おわりに

OBDの機能を使って自動車のさまざまな情報が取得できることがお伝えできましたでしょうか?私はダイハツ コペン(L880K)という車に乗っているのですが、この車種の診断情報を取得できるAndroidアプリは私の知る限り存在しません。アプリが欲しいという方は宮崎まで連絡ください。