pythonでDoIP ~③DoIPプロトコル通信フォーマット概要~

DoIP,DoIP,python

今回はDoIP通信プロトコルについて解説したいと思います。

TCP/UDPでDoIP通信を実施するために必要最低限の通信内容のみ取り上げているため、詳細については実際に規格(ISO13400)を確認してください。

前提条件

DoIPでは、診断機が直接DoIP通信を実施する対象としてGW(ゲートウェイ)が存在します。

また、ゲートウェイによるルーティング処理を介して車両内の様々なECU(エンジンコントロールユニット: engine control unit)との診断通信を想定しております。

ルーティングにおける通信プロトコルは任意(UDS、DoIP、そのほか独自プロトコル等)とされています。

今回このルーティング処理は対象外とし、診断機とゲートウェイ間のDoIP通信のみを想定した構成とます。

またDoIPサーバであるゲートウェイは、通信前にDHCPによってIPアドレスを取得し、取得したIPアドレスをマルチキャストで通知する必要があるのですが、ここら辺の動きも対象外とします。

ポート番号

サーバの待ち受けポート番号は13400を指定します。

規格番号(ISO13400)と使用するポート番号が同じというのは分かりやすいですね。

プロトコル役割ポート番号
UDPクライアント任意
UDPサーバ13400
TCPクライアント任意
TCPサーバ13400
使用ポート番号

DoIPクライアントは、同時に複数のDoIPサーバと通信することを想定しているため、クライアント側のポート番号は動的に設定されます。

通信フォーマット

DoIPヘッダ構造

項目位置サイズ説明設定値
プロトコルバージョン01DoIPプロトコルバージョン0x02*
逆プロトコルバージョン11DoIPプロトコルバージョンのXOR0xFD
ペイロードタイプ22相手へ通知するメッセージ種別任意
ペイロード長44ペイロードのサイズ任意
ペイロード8任意ペイロードタイプに応じた値任意

*プロトコルバージョンについては0x02(DoIP ISO 13400-2:2012)を今回指定しています。

DoIPペイロードタイプの概要

コマンド名ペイロードタイププロトコル説明
Generic DoIP header negative acknowledge0x0000UDP/TCPDoIPヘッダーで検出された特定のエラーを示すか、サポートされていないペイロードまたはメモリ過負荷状態を示す。
Vehicle identification request message0x0001UDP車両情報を要求する。
Vehicle identification request message with EID0x0002UDPEID(MACアドレス)とともに車両情報を要求する。
Vehicle identification request message with VIN0x0003UDPVIN(ISO 3779で指定されている車両の識別番号)とともに車両情報を要求する。
Vehicle announcement message0x0004UDP有効なIPアドレスの構成直後に自発的に車両情報を提供する。
vehicle identification response message0x0004UDP要求に対して車両情報を応答する。
DoIP entity status request0x4001UDP該当機器のDoIP通信における通信対応ステータスを確認する。
(同時接続可能なソケット数、現在確立中のソケット数等)
DoIP entity status response0x4002UDP上記確認に対するレスポンス。
Diagnostic power mode information request0x4003UDP車両の診断を実行する準備が出来ているかを確認する。
Diagnostic power mode information response0x4004UDP上記確認に対するレスポンス。
Routing activation request0x0005TCPルーティングのアクティベーション要求。
本要求でアクティベートを実施したのちDiagnostic messageにてデータのルーティングが開始できる。
Routing activation response0x0006TCPルーティングのアクティベーション要求に対する応答。
Alive check request0x0007TCPコネクション確立済みのTCPソケットが、まだ有効かどうかを確認する。
Alive check response0x0008TCP生存チェック要求に対する応答。
Diagnostic message0x8001TCP診断メッセージ。
Diagnostic message positive acknowledgement0x8002TCP診断メッセージに対するポジティブ応答。
Diagnostic message negative acknowledgement0x8003TCP診断メッセージに対するネガティブ応答。

DoIP通信におけるUDPメッセージ

主に以下役割を持っています。

DoIPサーバ(車両内ゲートウェイ)が自身の存在を、DoIPクライアント(診断機)へ通知する。

DoIPクライアント(診断機)が、DoIPサーバ(車両内ゲートウェイ)の存在またはDoIP通信状態を確認する。

UDPの役割としてはあくまでも事前確認のみとなり、実際のUDS相当の診断通信はTCPで実施します。

UDPコマンド

Generic DoIP header negative acknowledge

DoIPヘッダーで検出された特定のエラーを示すか、サポートされていないペイロードまたはメモリ過負荷状態を示す。

項目位置サイズ説明
NACKコード01DoIPヘッダーで検出された特定のエラーを示すか、
サポートされていないペイロードまたはメモリ負荷状態を示す。
ペイロードフォーマット
説明アクション
0x00不正パターン検出ソケットを閉じる
0x01不正ペイロードタイプDoIPメッセージを破棄
0x02メッセージサイズが大きすぎるDoIPメッセージを破棄
0x03メモリ不足DoIPメッセージを破棄
0x04無効なペイロード長DoIPメッセージを破棄
NACKコード

Vehicle identification request message

車両情報を要求する。

ペイロードなし。(ペイロード長=0)

Vehicle identification request message with EID

EID(MACアドレス)とともに車両情報を要求する。

受信側(DoIPサーバ)は本メッセージペイロードのEIDと自身のEIDが一致した場合にのみvehicle identification response messageを応答する。

項目位置サイズ説明
EID06車両情報要求メッセージに応答してほしいDoIPサーバの一意のID(MACアドレスなど)。
ペイロードフォーマット

Vehicle identification request message with VIN

VIN(ISO 3779で指定されている車両の識別番号)とともに車両情報を要求する。

受信側(DoIPサーバ)は本メッセージペイロードのVINと自身のEIDが一致した場合にのみvehicle identification response messageを応答する。

項目位置サイズ説明
VIN017車両情報要求メッセージに応答してほしいDoIPサーバの一意のVIN(ISO 3779で指定されている車両の識別番号)。
ペイロードフォーマット

Vehicle announcement message/vehicle identification response message

Vehicle announcement messageは、有効なIPアドレスの構成直後に自発的に車両情報をマルチキャストで提供する。

DoIPではDHCPによる動的なIPアドレスの取得が規定されているため、このようにDoIPサーバは自身のIPアドレスを教えてあげる必要があります。

vehicle identification response messageは、DoIPクライアントからの要求に応じて車両情報をユニキャストで応答する。

どちらもペイロード内容は同一となる。

項目位置サイズ説明
VIN17ISO 3779で指定されている車両の車両識別番号(VIN)
論理アドレス172応答するDoIPサーバに割り当てられる論理アドレス
EID196応答するDoIPサーバに割り当てられる一意のID(MACアドレスなど)
GID256同じ車両内のDoIPサーバのグループを一意に識別する値
アクションコード311今回は0x00(アクション不要)固定
VIN / GID同期状態321今回は0x00(同期済み)固定
ペイロードフォーマット

アクションコードとVIN / GID同期状態の対応はオプション(対応してもしなくてもよい)ということなので今回はデフォルト値を設定します。

DoIP entity status request

該当機器のDoIP通信における通信対応ステータスを確認する。(同時接続可能なソケット数、現在確立中のソケット数等)

ペイロードなし。(ペイロード長=0)

DoIP entity status response

DoIP entity status requestに対するレスポンス。

項目位置サイズ説明
ノードタイプ1対象のDoIPクライアントの種別。
同時接続可能ソケット数11対象のDoIPクライアントが現在確立可能なTCPソケット数
同時接続中のソケット数21対象のDoIPクライアントが現在確立しているTCPソケット数
扱える最大データ長34対象のDoIPクライアントが処理可能なデータ最大長。
ペイロードフォーマット
説明
0x00ゲートウェイ
0x01ゲートウェイ以外
ノードタイプ

Diagnostic power mode information request

車両の診断を実行する準備が出来ているかを確認する。

ペイロードなし。(ペイロード長=0)

Diagnostic power mode information response

Diagnostic power mode information requestに対するレスポンス。

項目位置サイズ説明
診断状態01診断が可能かどうかの状態。
ペイロードフォーマット
説明
0x00準備が出来ていない
0x01準備完了
0x02未サポート
モード

DoIP通信におけるTCPメッセージ

DoIPにぉける車両診断情報のやり取りは、TCPコマンドを介して行われます。

また、事前にアクティベーションといって、TCPコネクション確立後、DoIPプロトコルにおける診断通信実施のための論理的なコネクションを確立させる必要があります。

アクティベーション成功後、DoIPコマンドのDiagnostic messageを介してUDSなどの診断メッセージのやり取りが可能となります。

Routing activation request

本要求でアクティベートが完了したのち、Diagnostic messageにて診断通信が開始できる。

項目位置サイズ説明
送信元ロジカルアドレス
(SA)
2DoIPクライアント(診断機)の識別子
アクティベーションタイプ21アクティベート時に必要な認証方式
リザーブ34“0x00000000″固定
メーカ用設定領域74メーカが独自の用途のために使用可能
(オプションのため、本領域を使用しなくともよい)
ペイロードフォーマット
説明
0x00認証不要
0x01WWH-OBD
0xE0メーカ固有の認証
0xE1~FF追加のメーカ固有の認証種別として使用が可能
アクティベーションタイプ

Routing activation response

Routing activation requestに対するレスポンス。

項目位置サイズ説明
送信元ロジカルアドレス
(SA)
2DoIPクライアント(診断機)の識別子
ターゲットロジカルアドレス
(TA)
22DoIPサーバ(ゲートウェイ)の識別子
応答コード41アクティベーション要求に対する応答
リザーブ54“0x00000000″固定
メーカ用設定領域94メーカが独自の用途のために使用可能
(オプションのため、本領域を使用しなくともよい)
ペイロードフォーマット
説明
0x00送信元ロジカルアドレス(SA)が不正
0x01アクティベーション不可
0x02同一TCPソケットで、異なるSAによるアクティベーション実施済み
0x03別のTCPソケットで、同一のSAによるアクティベーション実施済み
0x04認証(オプション)未実施のためアクティベーション不可
0x05確認結果不正(オプション)のためアクティベーション不可
0x06サポートしていないアクティベーションタイプ
0x10アクティベーション成功
0x11アクティベーション成功(ゲートウェイ以外の車両内ECUがルーティング対象)
アクティベーションタイプ

Alive check request

該当TCPソケットのアクティベートが有効かかどうかを確認する。

ペイロードなし。(ペイロード長=0)

Alive checkによる確認は、DoIPクライアント(診断機)→ DoIPサーバ(ゲートウェイ)だけでなく、下記両方で扱う。

DoIPクライアント(診断機)→ DoIPサーバ(ゲートウェイ)

DoIPサーバ(ゲートウェイ)→ DoIPクライアント(診断機)

Alive check response

Alive check requestに対するレスポンス。

有効なDoIPコネクションが存在する場合は自身のロジカルアドレスを応答する。

項目位置サイズ説明
送信元ロジカルアドレス02応答を送信している機器の識別子
ペイロードフォーマット

Diagnostic message

診断メッセージ。

本コマンドは下記両方で扱う。

DoIPクライアント(診断機)→ DoIPサーバ(ゲートウェイ)

DoIPサーバ(ゲートウェイ)→ DoIPクライアント(診断機)

項目位置サイズ説明
送信元ロジカルアドレス
(SA)
2送信元機器の識別子
ターゲットロジカルアドレス
(TA)
22送信先機器の識別子
ユーザデータ
(UID)
4任意実際の診断データ
ペイロードフォーマット

Diagnostic message positive acknowledgement

Diagnostic messageに対するポジティブ応答。

項目位置サイズ説明
送信元ロジカルアドレス
(SA)
2送信元機器の識別子
ターゲットロジカルアドレス
(TA)
22送信先機器の識別子
ACKコード41Diagnostic messageの確認コード
0x00固定
取得した診断メッセージのコピー5任意Diagnostic messageで受信した診断メッセージのコピー
オプションのため必須ではない
ペイロードフォーマット

Diagnostic message negative acknowledgement

Diagnostic messageに対するネガティブ応答。

項目位置サイズ説明
送信元ロジカルアドレス
(SA)
2送信元機器の識別子
ターゲットロジカルアドレス
(TA)
22送信先機器の識別子
NACKコード41Diagnostic messageの確認コード
取得した診断メッセージのコピー5任意Diagnostic messageで受信した診断メッセージのコピー
オプションのため必須ではない
ペイロードフォーマット
説明
0x02SA不正
0x03TA不正
0x04メッセージ長が大きすぎる
0x05メモリ不足
0x06ターゲット接続失敗
0x07ネットワークエラー
0x08TCPエラー
アクティベーションタイプ

最後に

DoIPプロトコルの解説はここまでとします。

タイムアウトなど、今回紹介しきれなかった要素は多々あるため気になる方は一度規格をご確認ください。

次回からはいよいよ本格的な実装に移ろうと思います。

DoIP,DoIP,pythonDoIP,python