pythonでDoIP ~③DoIPプロトコル通信フォーマット概要~
今回はDoIP通信プロトコルについて解説したいと思います。
TCP/UDPでDoIP通信を実施するために必要最低限の通信内容のみ取り上げているため、詳細については実際に規格(ISO13400)を確認してください。
- 1. 前提条件
- 2. ポート番号
- 3. 通信フォーマット
- 4. DoIP通信におけるUDPメッセージ
- 5. UDPコマンド
- 5.1. Generic DoIP header negative acknowledge
- 5.2. Vehicle identification request message
- 5.3. Vehicle identification request message with EID
- 5.4. Vehicle identification request message with VIN
- 5.5. Vehicle announcement message/vehicle identification response message
- 5.6. DoIP entity status request
- 5.7. DoIP entity status response
- 5.8. Diagnostic power mode information request
- 5.9. Diagnostic power mode information response
- 6. DoIP通信におけるTCPメッセージ
- 7. 最後に
前提条件
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ヘッダ構造
項目 | 位置 | サイズ | 説明 | 設定値 |
---|---|---|---|---|
プロトコルバージョン | 0 | 1 | DoIPプロトコルバージョン | 0x02* |
逆プロトコルバージョン | 1 | 1 | DoIPプロトコルバージョンのXOR | 0xFD |
ペイロードタイプ | 2 | 2 | 相手へ通知するメッセージ種別 | 任意 |
ペイロード長 | 4 | 4 | ペイロードのサイズ | 任意 |
ペイロード | 8 | 任意 | ペイロードタイプに応じた値 | 任意 |
*プロトコルバージョンについては0x02(DoIP ISO 13400-2:2012)を今回指定しています。
DoIPペイロードタイプの概要
コマンド名 | ペイロードタイプ | プロトコル | 説明 |
---|---|---|---|
Generic DoIP header negative acknowledge | 0x0000 | UDP/TCP | DoIPヘッダーで検出された特定のエラーを示すか、サポートされていないペイロードまたはメモリ過負荷状態を示す。 |
Vehicle identification request message | 0x0001 | UDP | 車両情報を要求する。 |
Vehicle identification request message with EID | 0x0002 | UDP | EID(MACアドレス)とともに車両情報を要求する。 |
Vehicle identification request message with VIN | 0x0003 | UDP | VIN(ISO 3779で指定されている車両の識別番号)とともに車両情報を要求する。 |
Vehicle announcement message | 0x0004 | UDP | 有効なIPアドレスの構成直後に自発的に車両情報を提供する。 |
vehicle identification response message | 0x0004 | UDP | 要求に対して車両情報を応答する。 |
DoIP entity status request | 0x4001 | UDP | 該当機器のDoIP通信における通信対応ステータスを確認する。 (同時接続可能なソケット数、現在確立中のソケット数等) |
DoIP entity status response | 0x4002 | UDP | 上記確認に対するレスポンス。 |
Diagnostic power mode information request | 0x4003 | UDP | 車両の診断を実行する準備が出来ているかを確認する。 |
Diagnostic power mode information response | 0x4004 | UDP | 上記確認に対するレスポンス。 |
Routing activation request | 0x0005 | TCP | ルーティングのアクティベーション要求。 本要求でアクティベートを実施したのちDiagnostic messageにてデータのルーティングが開始できる。 |
Routing activation response | 0x0006 | TCP | ルーティングのアクティベーション要求に対する応答。 |
Alive check request | 0x0007 | TCP | コネクション確立済みのTCPソケットが、まだ有効かどうかを確認する。 |
Alive check response | 0x0008 | TCP | 生存チェック要求に対する応答。 |
Diagnostic message | 0x8001 | TCP | 診断メッセージ。 |
Diagnostic message positive acknowledgement | 0x8002 | TCP | 診断メッセージに対するポジティブ応答。 |
Diagnostic message negative acknowledgement | 0x8003 | TCP | 診断メッセージに対するネガティブ応答。 |
DoIP通信におけるUDPメッセージ
主に以下役割を持っています。
DoIPサーバ(車両内ゲートウェイ)が自身の存在を、DoIPクライアント(診断機)へ通知する。
DoIPクライアント(診断機)が、DoIPサーバ(車両内ゲートウェイ)の存在またはDoIP通信状態を確認する。
UDPの役割としてはあくまでも事前確認のみとなり、実際のUDS相当の診断通信はTCPで実施します。
UDPコマンド
Generic DoIP header negative acknowledge
DoIPヘッダーで検出された特定のエラーを示すか、サポートされていないペイロードまたはメモリ過負荷状態を示す。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
NACKコード | 0 | 1 | DoIPヘッダーで検出された特定のエラーを示すか、 サポートされていないペイロードまたはメモリ負荷状態を示す。 |
値 | 説明 | アクション |
---|---|---|
0x00 | 不正パターン検出 | ソケットを閉じる |
0x01 | 不正ペイロードタイプ | DoIPメッセージを破棄 |
0x02 | メッセージサイズが大きすぎる | DoIPメッセージを破棄 |
0x03 | メモリ不足 | DoIPメッセージを破棄 |
0x04 | 無効なペイロード長 | DoIPメッセージを破棄 |
Vehicle identification request message
車両情報を要求する。
ペイロードなし。(ペイロード長=0)
Vehicle identification request message with EID
EID(MACアドレス)とともに車両情報を要求する。
受信側(DoIPサーバ)は本メッセージペイロードのEIDと自身のEIDが一致した場合にのみvehicle identification response messageを応答する。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
EID | 0 | 6 | 車両情報要求メッセージに応答してほしいDoIPサーバの一意のID(MACアドレスなど)。 |
Vehicle identification request message with VIN
VIN(ISO 3779で指定されている車両の識別番号)とともに車両情報を要求する。
受信側(DoIPサーバ)は本メッセージペイロードのVINと自身のEIDが一致した場合にのみvehicle identification response messageを応答する。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
VIN | 0 | 17 | 車両情報要求メッセージに応答してほしい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クライアントからの要求に応じて車両情報をユニキャストで応答する。
どちらもペイロード内容は同一となる。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
VIN | 0 | 17 | ISO 3779で指定されている車両の車両識別番号(VIN) |
論理アドレス | 17 | 2 | 応答するDoIPサーバに割り当てられる論理アドレス |
EID | 19 | 6 | 応答するDoIPサーバに割り当てられる一意のID(MACアドレスなど) |
GID | 25 | 6 | 同じ車両内のDoIPサーバのグループを一意に識別する値 |
アクションコード | 31 | 1 | 今回は0x00(アクション不要)固定 |
VIN / GID同期状態 | 32 | 1 | 今回は0x00(同期済み)固定 |
アクションコードとVIN / GID同期状態の対応はオプション(対応してもしなくてもよい)ということなので今回はデフォルト値を設定します。
DoIP entity status request
該当機器のDoIP通信における通信対応ステータスを確認する。(同時接続可能なソケット数、現在確立中のソケット数等)
ペイロードなし。(ペイロード長=0)
DoIP entity status response
DoIP entity status requestに対するレスポンス。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
ノードタイプ | 0 | 1 | 対象のDoIPクライアントの種別。 |
同時接続可能ソケット数 | 1 | 1 | 対象のDoIPクライアントが現在確立可能なTCPソケット数 |
同時接続中のソケット数 | 2 | 1 | 対象のDoIPクライアントが現在確立しているTCPソケット数 |
扱える最大データ長 | 3 | 4 | 対象のDoIPクライアントが処理可能なデータ最大長。 |
値 | 説明 |
---|---|
0x00 | ゲートウェイ |
0x01 | ゲートウェイ以外 |
Diagnostic power mode information request
車両の診断を実行する準備が出来ているかを確認する。
ペイロードなし。(ペイロード長=0)
Diagnostic power mode information response
Diagnostic power mode information requestに対するレスポンス。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
診断状態 | 0 | 1 | 診断が可能かどうかの状態。 |
値 | 説明 |
---|---|
0x00 | 準備が出来ていない |
0x01 | 準備完了 |
0x02 | 未サポート |
DoIP通信におけるTCPメッセージ
DoIPにぉける車両診断情報のやり取りは、TCPコマンドを介して行われます。
また、事前にアクティベーションといって、TCPコネクション確立後、DoIPプロトコルにおける診断通信実施のための論理的なコネクションを確立させる必要があります。
アクティベーション成功後、DoIPコマンドのDiagnostic messageを介してUDSなどの診断メッセージのやり取りが可能となります。
Routing activation request
本要求でアクティベートが完了したのち、Diagnostic messageにて診断通信が開始できる。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
送信元ロジカルアドレス (SA) | 0 | 2 | DoIPクライアント(診断機)の識別子 |
アクティベーションタイプ | 2 | 1 | アクティベート時に必要な認証方式 |
リザーブ | 3 | 4 | “0x00000000″固定 |
メーカ用設定領域 | 7 | 4 | メーカが独自の用途のために使用可能 (オプションのため、本領域を使用しなくともよい) |
値 | 説明 |
---|---|
0x00 | 認証不要 |
0x01 | WWH-OBD |
0xE0 | メーカ固有の認証 |
0xE1~FF | 追加のメーカ固有の認証種別として使用が可能 |
Routing activation response
Routing activation requestに対するレスポンス。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
送信元ロジカルアドレス (SA) | 0 | 2 | DoIPクライアント(診断機)の識別子 |
ターゲットロジカルアドレス (TA) | 2 | 2 | DoIPサーバ(ゲートウェイ)の識別子 |
応答コード | 4 | 1 | アクティベーション要求に対する応答 |
リザーブ | 5 | 4 | “0x00000000″固定 |
メーカ用設定領域 | 9 | 4 | メーカが独自の用途のために使用可能 (オプションのため、本領域を使用しなくともよい) |
値 | 説明 |
---|---|
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コネクションが存在する場合は自身のロジカルアドレスを応答する。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
送信元ロジカルアドレス | 0 | 2 | 応答を送信している機器の識別子 |
Diagnostic message
診断メッセージ。
本コマンドは下記両方で扱う。
DoIPクライアント(診断機)→ DoIPサーバ(ゲートウェイ)
DoIPサーバ(ゲートウェイ)→ DoIPクライアント(診断機)
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
送信元ロジカルアドレス (SA) | 0 | 2 | 送信元機器の識別子 |
ターゲットロジカルアドレス (TA) | 2 | 2 | 送信先機器の識別子 |
ユーザデータ (UID) | 4 | 任意 | 実際の診断データ |
Diagnostic message positive acknowledgement
Diagnostic messageに対するポジティブ応答。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
送信元ロジカルアドレス (SA) | 0 | 2 | 送信元機器の識別子 |
ターゲットロジカルアドレス (TA) | 2 | 2 | 送信先機器の識別子 |
ACKコード | 4 | 1 | Diagnostic messageの確認コード 0x00固定 |
取得した診断メッセージのコピー | 5 | 任意 | Diagnostic messageで受信した診断メッセージのコピー オプションのため必須ではない |
Diagnostic message negative acknowledgement
Diagnostic messageに対するネガティブ応答。
項目 | 位置 | サイズ | 説明 |
---|---|---|---|
送信元ロジカルアドレス (SA) | 0 | 2 | 送信元機器の識別子 |
ターゲットロジカルアドレス (TA) | 2 | 2 | 送信先機器の識別子 |
NACKコード | 4 | 1 | Diagnostic messageの確認コード |
取得した診断メッセージのコピー | 5 | 任意 | Diagnostic messageで受信した診断メッセージのコピー オプションのため必須ではない |
値 | 説明 |
---|---|
0x02 | SA不正 |
0x03 | TA不正 |
0x04 | メッセージ長が大きすぎる |
0x05 | メモリ不足 |
0x06 | ターゲット接続失敗 |
0x07 | ネットワークエラー |
0x08 | TCPエラー |
最後に
DoIPプロトコルの解説はここまでとします。
タイムアウトなど、今回紹介しきれなかった要素は多々あるため気になる方は一度規格をご確認ください。
次回からはいよいよ本格的な実装に移ろうと思います。