DoIP(二)——报文类型
我們上一篇文章提到,DoIP報頭中有兩字節的數據類型(Payload Type),代表DoIP報文類型,本文就來詳細介紹一下每一種報文類型。
標準中對報文類型的定義如下:
數據類型分為三部分,標綠的是節點管理報文,標黃的是狀態信息獲取報文,標藍的是診斷報文。
1. 節點管理報文
節點管理報文的作用主要是獲取DoIP節點的信息、建立連接、保持連接等。
① 0x0000:Generic DoIP header negative acknowledge
當DoIP節點收到的DoIP報文的報頭不符合規則時,返回該數據類型的報文。該報文的數據部分只包含1字節的否定響應碼(Generic DoIP header NACK code),用來指示錯誤原因,定義如下:
上表中,Required action表示DoIP節點在發送完該否定響應報文后應該采取的動作,是忽略該報文還是關閉套接字。
該報文可使用上文所述的三種端口類型作為目的端口,具體使用哪種取決于DoIP請求使用的哪種端口。
② 0x0001:Vehicle identification request message
該類型報文可以用來請求網絡中DoIP節點的車輛信息,診斷設備用UDP報文向網絡中發送該報文,來獲取被診斷節點的VIN、GID、EID、邏輯地址等信息。
該報文中只包含DoIP報頭,沒有數據。
該報文的目的端口為UDP_DISCOVERY。
③ 0x0002:Vehicle identification request message with EID
該類型報文的作用和上面的一樣,只是在請求報文的數據中搭載了6字節EID,可請求指定EID的DoIP節點的其它車輛信息,用于被診斷節點的EID已知的情況。
EID是DoIP節點的唯一識別標識符,一般會被設置為該節點的MAC地址。
該報文的目的端口為UDP_DISCOVERY。
④ 0x0003:Vehicle identification request message with VIN
該類型報文原理同上,只是在報文數據中搭載的不是EID,而是17字節的VIN,用于DoIP節點的VIN已知的情況下,請求指定VIN的DoIP節點的其它信息。
該報文的目的端口為UDP_DISCOVERY。
⑤ 0x0004:Vehicle announcement/Vehicle identification response message
從名稱中可以看出,該類型的報文有兩種用途,第一個用途是以上三種報文的響應報文(Vehicle identification response message),當診斷節點發送了以上三種車輛信息請求報文后,符合條件的DoIP節點將會返回該響應報文,報文數據部分的格式如下:
報文數據共33字節,包含:
- 17字節的VIN
- 2字節邏輯地址,該邏輯地址用于診斷,后文詳述
- 6字節EID
- 6字節GID:同一輛車上多個DoIP節點可以編為一組,用GID來標識這一組的DoIP節點。
- 1字節Further action required:該字節用來表示在數據傳輸過程中是否需要額外的操作,如是否啟用安全機制,定義如下:
- 1字節VIN/GID sync. status:該字節用來表示車內的DoIP節點是否已經完成了VIN或GID的同步(如何同步后文詳述)。定義如下;
作為車輛信息響應報文使用時,該報文的目的端口為UDP_TEST_EQUIPMENT_REQUEST。
該報文的第二個用途是作為車輛聲明報文(Vehicle announcement),標準規定,當一個DoIP節點成功獲取到IP地址后,應在500ms內發送3條車輛聲明報文,向網絡中的所有DoIP節點廣播自己的車輛信息,這時數據部分的定義和上面相同,發送時使用UDP,IP地址設置為255.255.255.255。實際應用過程中發送時間和發送報文數目可能會根據實際情況有所調整。
作為車輛聲明報文使用時,該報文的目的端口為UDP_DISCOVERY。
⑥ 0x0005:Routing activation request
在車輛發現階段結束后,外部診斷設備已確定對哪個DoIP節點進行診斷,也獲取了必要的信息,這時就需要發送路由激活請求報文,在診斷設備和被診斷的DoIP節點間建立起TCP連接,以便于發送診斷數據(診斷報文都是用TCP來發送的)。
路由激活請求報文由外部診斷設備發送,目的端口為TCP_DATA,源端口可動態定義。報文的數據格式如下:
數據共11字節,包含以下內容:
-
源地址(SourceAddress):外部診斷設備的邏輯地址,與診斷通信中的邏輯地址相同。這個邏輯地址用于對某個特定的DoIP節點進行尋址,與UDSonCAN中的CAN ID是類似的概念,是在網絡架構設計階段就分配好的。標準中的范圍劃分如下圖所示,其中紅色框內的范圍用于診斷設備的邏輯地址,0x0E00-0x0E7F用于OBD診斷,0x0E80-0x0EFF用于增強型診斷。藍色框內的邏輯地址用于DoIP節點,與UDSonCAN類似,節點的邏輯地址有兩個,一個是物理邏輯地址,在0x0001-0x0DFF或0x1000-0x7FFF范圍內,另一個是功能尋址,是0xE000。
-
激活類型(activation type):用于診斷設備通知被診斷DoIP節點進入哪種類型的診斷狀態。定義如下:
-
剩余字節為保留或自定義字段,一般沒有作用。
⑦ 0x0006:Routing activation response
DoIP節點收到診斷設備的路由激活請求報文后,建立TCP連接,并返回該路由激活響應報文,源端口為TCP_DATA,目的端口為診斷設備動態定義的端口。路由激活響應報文的數據格式如下:
響應中的參數定義如下:
- 診斷設備邏輯地址(Logical address of the external test equipment):就是路由激活請求報文中的診斷設備邏輯地址。
- DoIP節點邏輯地址(Logical address of the responding DoIP entity):也就是我們上文說的DoIP節點物理邏輯地址。
- 路由激活響應碼(Routing activation response code):1字節,用來表示TCP連接建立是否成功,以及不成功的原因。定義如下表所示,Required Action欄展示了DoIP節點在返回響應后應該采取的操作。
- 其余字段為預留或自定義字段,不常用。
⑧ 0x0007:Alive check request
診斷儀在線檢查報文,用于DoIP節點檢查診斷設備是否還處于連接狀態。該報文由DoIP節點在與診斷設備建立了TCP連接后用TCP_DATA端口發送,不攜帶DoIP數據,報文中只有DoIP報頭。
⑨ 0x0008:Alive check response
診斷設備在收到DoIP節點發送的診斷儀在線檢查請求報文后,發送該響應報文,數據中攜帶兩字節的診斷設備邏輯地址:
此外,診斷設備也可以在沒有收到請求報文的情況下向DoIP節點發送該響應報文,以通知DoIP節點診斷設備仍然在線。
2. 狀態信息獲取報文
① 0x4001:DoIP entity status request
該報文可以被診斷設備用來請求DoIP節點的狀態,報文數據段沒有數據。
② 0x4002:DoIP entity status response
該報文是上一個報文的響應報文,DoIP節點用該響應報文來向診斷設備發送狀態信息。報文的數據段定義如下:
③ 0x4003:Diagnostic power mode information request
該報文可以被診斷設備用來請求DoIP節點的電源模式信息,報文數據段沒有數據。
④ 0x4004:Diagnostic power mode information response
該報文是上一個報文的響應報文,DoIP節點用該響應報文來向診斷設備發送電源模式信息,來告知診斷設備當前節點是否允許進行診斷。報文的數據段定義如下:
3. 診斷報文
診斷報文有三個: 0x8001-0x8003:Diagnostic Message and Positive/Negetive Acknowledgment
我們先把三個放在一起看。DoIP診斷通信流程和CAN不一樣,CAN是一條診斷請求對應一條診斷響應,但DoIP遵循如下流程:
診斷設備發送一條診斷請求(0x8001-Diagnostic Message),該請求中搭載了UDS診斷數據,DoIP節點收到后先對DoIP報頭、診斷數據長度等做判斷,先返回一個DoIP層的響應,如果各個條件都滿足,則返回肯定響應(0x8002-Diagnostic message positive acknowledgment),否則返回否定響應(0x8003-Diagnostic message negative acknowledgment)。
當DoIP節點返回肯定響應后,再將診斷請求報文中搭載的UDS診斷信息上報給UDS應用程序進行處理,處理完成后,不論是UDS肯定響應還是UDS否定響應,都用診斷報文(0x8001-Diagnostic Message)將UDS診斷響應數據發送給診斷設備。至此一次診斷數據交互才完成。
流程示意圖如下圖所示:
我們再分別來看一下三種診斷報文的數據段定義。
① 診斷報文(0x8001-Diagnostic Message)
包含兩字節診斷報文發送方源邏輯地址,和兩字節接收方目的邏輯地址,以及UDS診斷數據。UDS診斷數據可以是UDS請求,也可以是UDS肯定響應和否定響應。
以下是一條包含UDS診斷請求數據的DoIP診斷報文示例:
② 診斷肯定響應報文(0x8002-Diagnostic message positive acknowledgment)
同樣包含發送方和接收方的邏輯地址,還有一字節響應碼,以及診斷請求報文中的診斷數據,以便于分析原因。響應碼應置為0x00,具體定義如下:
③ 診斷否定響應報文(0x8003-Diagnostic message negative acknowledgment)
與肯定響應報文的區別就是響應碼變成了否定響應碼,用來指示否定響應的原因,定義如下:
總結
以上是生活随笔為你收集整理的DoIP(二)——报文类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 77.组合求和
- 下一篇: 各种证书