LoginSignup
9
10

More than 3 years have passed since last update.

【Smart Device Link】車からの情報を取得してみる

Last updated at Posted at 2018-12-30

車の情報を取得する処理を説明していきたいと思います。
今回は、こちらのGithub:SDLのサンプルをベースにしています。

車から取れるデータ

SDLが対応している車両データは以下の通りです。
ただし、取得可能な情報は利用するSDL機器に依存します。

値は、OnVehicleDataで取得可能です。

車両データ メソッド 説明
GPS getGps GPSData 緯度、経度、速度などのGPSデータ
速度 getSpeed Double 車速(KPH)
RPM getRpm Integer エンジンの毎分回転数
燃料レベル getFuelLevel Double タンク内の燃料レベル(パーセント)
燃料レベル状態 getFuelLevel_State ComponentVolumeStatus 燃料レベルの状態
燃料範囲 getFuelRange List< FuelRange > 燃料レベルと消費量に基づいて車両が走行できるkmの推定範囲
インスタント燃費 getInstantFuelConsumption Double マイクロリットルでの瞬間的な燃料消費量
外気温 getExternalTemperature Double 摂氏温度での外部温度
VIN getVin String 車両識別番号
PRNDL getPrndl PRNDL 選択されたギア
タイヤ空気圧 getTirePressure TireStatus 車両の各ホイールのタイヤ状態
オドメーター getOdometer Integer 走行距離計(Km)
ベルト状態 getBeltStatus BeltStatus 各シートベルトの状態
ボディ情報 getBodyInformation BodyInformation 各車体の状態(ドアや、点火ステータスなど)
デバイスステータス getDeviceStatus DeviceStatus スマートフォンデバイスに関する情報
運転者ブレーキ getDriverBraking VehicleDataEventStatus ブレーキペダルの状態
ワイパー状態 getWiperStatus WiperStatus ワイパーの状態
ヘッドランプの状態 getHeadLampStatus HeadLampStatus ヘッドランプの状態
エンジントルク getEngineTorque Double ディーゼル以外のエンジンのトルク値(Nm)
エンジンオイルの寿命 getEngineOilLife Float エンジンの残存オイル寿命の推定割合
アクセルペダル位置 getAccPedalPosition Double アクセルペダルの位置(パーセント)
ハンドル角 getSteeringWheelAngle Double ステアリングホイールの現在の角度(度)
Eコール情報 getECallInfo ECallInfo 緊急通報の状況に関する情報
エアバッグの状態 getAirbagStatus AirbagStatus 車両内の各エアバッグの状態
緊急イベント getEmergencyEvent EmergencyEvent 緊急の状況
クラスタモードの状態 getClusterModeStatus ClusterModeStatus 電力モードがアクティブかどうか
My Key getMyKey MyKey 緊急911などの情報
ウインカー getTurnSignal TurnSignal 方向指示器の状態
電子パーキングブレーキの状態 getElectronicParkBrakeStatus ElectronicParkBrakeStatus パークブレーキのステータス

vehicle-data

車から情報を取得する

車からの情報を取得する方法として、1度だけ取得する方法と、
状態が変更された時に、イベントとして取得する方法があります。
また、車両データを取得するには、HMIの状態が、FULLLIMITEDbackgroundsである必要があります。

利用可能な情報を確認する

どのデータを公開するかは、各自動車メーカーが決定するため、
実際に使用するデータが利用可能か確認する必要があります。

PermissionManager.isPermissionParameterAllowedを使用すると、
使用したいデータが許可されているかを確認することができます。

java
boolean allowed = sdlManager.getPermissionManager().isPermissionParameterAllowed(FunctionID.GET_VEHICLE_DATA, GetVehicleData.KEY_RPM);

複数の項目をまとめてチェックしたい場合は、以下のような感じで確認する事も可能です。

SdlService.java
List<PermissionElement> permissionElements = new ArrayList<>();

//チェックを行う項目
List<String> keys = new ArrayList<>();
keys.add(GetVehicleData.KEY_RPM);
keys.add(GetVehicleData.KEY_SPEED);
keys.add(GetVehicleData.KEY_PRNDL);
permissionElements.add(new PermissionElement(FunctionID.GET_VEHICLE_DATA, keys));

Map<FunctionID, PermissionStatus> status = sdlManager.getPermissionManager().getStatusOfPermissions(permissionElements);

//すべてが許可されているかどうか
Log.i("Permission", "Allowed:" + status.get(FunctionID.GET_VEHICLE_DATA).getIsRPCAllowed());

//各項目ごとも可能
Log.i("Permission", "KEY_RPM Allowed:" + status.get(FunctionID.GET_VEHICLE_DATA).getAllowedParameters().get(GetVehicleData.KEY_RPM));

PermissionManager

一度だけ情報を取得する

GetVehicleDataSdlManager.sendRPCに登録することで、一度だけ情報を取得する事ができます。
取得したいデータは、GetVehicleData.setSpeed(true)のように指定します。

結果は、OnRPCResponseListenerRPCResponseで返却され、
指定した項目のみデータがセットされています。
※データは呼び出し時点の情報になります

SdlService.java
GetVehicleData vdRequest = new GetVehicleData();
vdRequest.setSpeed(true);
vdRequest.setOnRPCResponseListener(new OnRPCResponseListener() {
    @Override
    public void onResponse(int correlationId, RPCResponse response) {
        if(response.getSuccess()){
            Double speed = ((GetVehicleDataResponse) response).getSpeed();
        }else{
            Log.i("SdlService", "GetVehicleData was rejected.");
        }
    }
});
sdlManager.sendRPC(vdRequest);
定期的に情報を取得する

データが更新されたタイミングで取得する事ができます。
※更新タイミングは1秒ごとのようです。

・定期取得の設定
まず、定期受信のためSubscribeVehicleDataSdlManager.sendRPCに登録します。
こちらも、定期受信したい項目をSubscribeVehicleData.setSpeed(true)のように指定します。

SdlService.java
//定期受信用のデータを設定する
SubscribeVehicleData subscribeRequest = new SubscribeVehicleData();
subscribeRequest.setRpm(true);         //エンジン回転数
subscribeRequest.setPrndl(true);       //シフトレーバの状態
subscribeRequest.setOnRPCResponseListener(new OnRPCResponseListener() {
    @Override
    public void onResponse(int correlationId, RPCResponse response) {
        if (response.getSuccess()) {
            Log.i("SdlService", "Successfully subscribed to vehicle data.");
        }else {
            Log.i("SdlService", "Request to subscribe to vehicle data was rejected.");
        }
    }
});
sdlManager.sendRPC(subscribeRequest);

・データの取得
設定した項目は、OnRPCNotificationListenerで取得する事ができます。
基本的には、値が更新されたタイミングでイベントが呼び出されます。
定期受信を複数設定している場合、値の変化がない項目もあります。
変化してない項目は、nullを返すため、必ずチェックしてください。

SdlService.java
//これをすると定期的にデータが取得可能
sdlManager.addOnRPCNotificationListener(FunctionID.ON_VEHICLE_DATA, new OnRPCNotificationListener() {
    @Override
    public void onNotified(RPCNotification notification) {
        OnVehicleData onVehicleDataNotification = (OnVehicleData) notification;

        //情報に変更がない場合は、Nullが変える
        Integer rpm = onVehicleDataNotification.getRpm();
        if(rpm != null) {
        }

        PRNDL prndl = onVehicleDataNotification.getPrndl();
        if (prndl != null) {
        }
    }
});

・定期取得の解除
定期取得が不要になった場合は、必ず解除してください。
解除のためUnsubscribeVehicleDataSdlManager.sendRPCに登録します。
こちらも、解除したい項目をSubscribeVehicleData.setSpeed(true)のように指定します。

SdlService.java
UnsubscribeVehicleData unsubscribeRequest = new UnsubscribeVehicleData();
unsubscribeRequest.setRpm(true);
unsubscribeRequest.setPrndl(true);
unsubscribeRequest.setOnRPCResponseListener(new OnRPCResponseListener() {
    @Override
    public void onResponse(int correlationId, RPCResponse response) {
    if(response.getSuccess()){
        Log.i("SdlService", "Successfully unsubscribed to vehicle data.");
    }else{
        Log.i("SdlService", "Request to unsubscribe to vehicle data was rejected.");
    }
    }
});
sdlManager.sendRPC(unsubscribeRequest);
実際に動かしてみる

実際にデータの取得をやってみます。
今回は、Manticoreを使用しています。

Manticoreに接続して、右側にあるのが車両データ等を変更できる項目です。

エンジンの回転数を変更するには、RPMの項目を選択します。
バーを動かす事で、データのシュミレートができます。

動かすと、このような感じになります。
今回は、3000回転以上だと画像を変えるように処理を入れているため、
左の画像が変化します。

シフトレバーを変更するには、Prndlの項目を選択します。
コンボボックスを選ぶ事で、設定可能な一覧が表示れます。

動かすと、このような感じになります。
Prndlを変更すると、一度だけSpeedを取得する処理を入れています。
スピードそのものを変更しても、画面のデータは更新されませんが、
Prndlを変更することで、その時点のSpeedが取得されます。

最後に

SDLアプリ開発キット「SDL DEVELOPMENT TOOLS」は、定期的なデータ受信には対応していなそうです。
SDLは機種依存がキツくて、開発が大変な気がしてきました。。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10