01 概述
所謂的DoIP其實(shí)就是基于以太網(wǎng)的通訊協(xié)議對(duì)UDS協(xié)議的數(shù)據(jù)進(jìn)行傳輸,即Diagnostic communication over Internet Protocol。其本身也是一種協(xié)議,規(guī)范于ISO13400標(biāo)準(zhǔn)。由于DoIP可以傳輸大量數(shù)據(jù),以及響應(yīng)速度快,且可以通過(guò)以太網(wǎng)進(jìn)行遠(yuǎn)程診斷,因此DoIP逐步成為代替?zhèn)鹘y(tǒng)的CAN等總線方式,成為車載網(wǎng)絡(luò)診斷的必然趨勢(shì)。
DoIP在車載領(lǐng)域的應(yīng)用首先汽車系統(tǒng)的整體框架要能夠支持DoIP,正因?yàn)檐囕d以太網(wǎng)的快速發(fā)展,相較于傳統(tǒng)的車載系統(tǒng),目前的車載系統(tǒng)的整體框架都會(huì)加入一層DoIP協(xié)議層,在TCP/IP之上。并且為了更好的配合OBD診斷,遠(yuǎn)程診斷,F(xiàn)OTA等等技術(shù),對(duì)整體的車載架構(gòu)進(jìn)行了調(diào)整,利用swich將MPU,MCU,其它以太網(wǎng)ECU統(tǒng)統(tǒng)通過(guò)以太網(wǎng)進(jìn)行連接,并對(duì)外網(wǎng)與內(nèi)網(wǎng)進(jìn)行隔離。
當(dāng)然,DoIP并不僅僅只是UDS的載體,雖然在ISO13400標(biāo)準(zhǔn)中內(nèi)容不多,但是它也有自己的一些邏輯,不可能說(shuō)在TCP/IP之上加了一層封裝就完成了自己的任務(wù),這樣的話安全性就沒(méi)有保證了,畢竟車載以太網(wǎng)通過(guò)網(wǎng)絡(luò)能夠?qū)④噧?nèi)與車外進(jìn)行網(wǎng)絡(luò)的連接,而DoIP又是診斷的入口,這個(gè)門口如果不好好看住,會(huì)存在安全性的問(wèn)題的。
簡(jiǎn)單的說(shuō),DoIP能夠進(jìn)行車輛發(fā)現(xiàn),狀態(tài)查詢,路由激活(含安全認(rèn)證),診斷數(shù)據(jù)收發(fā),這些內(nèi)容將在后續(xù)進(jìn)行詳細(xì)的展開(kāi)。
有了DoIP,那么UDS的數(shù)據(jù)傳輸就可以搭載在DoIP之上,并在DoIP前序邏輯都OK的情況下,進(jìn)行UDS的傳輸。當(dāng)然DoIP之上也可以不搭載UDS數(shù)據(jù),這屬于客戶定制,能夠滿足以太網(wǎng)傳輸?shù)囊恍┢渌厥庑枨蟆?/p>
02 DoIP的網(wǎng)絡(luò)拓?fù)?/p>
在ISO13400-2中有如下一張圖,比較具有代表性,我們本文主要就根據(jù)此網(wǎng)絡(luò)拓?fù)鋱D來(lái)介紹DoIP的網(wǎng)絡(luò)拓?fù)?/p>
從圖中不難看出,整車的網(wǎng)絡(luò)拓?fù)浔环譃榱藘蓚€(gè)部分,即內(nèi)部網(wǎng)絡(luò)和外部網(wǎng)絡(luò),圖中的network node可以默認(rèn)為支持以太網(wǎng)連接的某個(gè)節(jié)點(diǎn),如,雷達(dá),攝像頭等,但是不支持DoIP協(xié)議,不過(guò)大家可以對(duì)名稱中含有DoIP前綴的節(jié)點(diǎn)進(jìn)行網(wǎng)絡(luò)分析。從圖中我們很容易看出DoIP的網(wǎng)絡(luò)拓?fù)溆幸韵聨讉€(gè)角色組成,
1.External test equipment
此部分為外部測(cè)試設(shè)備,通常為OBD診斷儀或者其他診斷客戶端
2. DoIP edge node gateway
此部分和DoIP gateway有什么區(qū)別?其實(shí)沒(méi)什么區(qū)別,唯一的區(qū)別就是多了個(gè)使能線的判斷,從圖中可以看出External test equipment和DoIP edge node gateway之間有一條線叫做Activation line。那么這條線的功能就是對(duì)協(xié)議棧進(jìn)行使能作用的,當(dāng)然External test equipment和DoIP edge node gateway之間不只是Activation line相連的,這個(gè)圖只是功能示意圖,少了很多細(xì)節(jié),其實(shí)是通過(guò)標(biāo)準(zhǔn)的OBD-II接頭相連的,其中一個(gè)針腳就是Activation line。具體可以看ISO 13400-4的介紹。
回過(guò)來(lái),這個(gè)角色的作用是什么?
首先它是個(gè)gateway,作為一個(gè)網(wǎng)關(guān)它的子網(wǎng)內(nèi)掛載著若干ECU,與DoIP gateway一樣
其次它是車內(nèi)網(wǎng)與車外網(wǎng)交互的一個(gè)入口,具有控制著DoIP協(xié)議棧是否工作的一個(gè)開(kāi)關(guān)功能。
該角色可以同時(shí)支持Server端和Client端,Server好理解,測(cè)試設(shè)備可以診斷該網(wǎng)關(guān)下的某個(gè)ECU節(jié)點(diǎn)。那么Client端是怎么回事呢?想象一下,如果DoIP edge node gateway作為入口,那么怎樣和內(nèi)部其它子網(wǎng)的DoIP ECU進(jìn)行交互呢?當(dāng)然是由DoIP edge node gateway進(jìn)行轉(zhuǎn)發(fā)。這只是其中一個(gè)應(yīng)用場(chǎng)景,當(dāng)進(jìn)行轉(zhuǎn)發(fā)的時(shí)候會(huì)進(jìn)行身份切換,即由Server端切換到Client端。另外一個(gè)場(chǎng)景是OTA升級(jí),DoIP edge node gateway的應(yīng)用層可以跑一個(gè)OTA客戶端程序,進(jìn)行對(duì)內(nèi)網(wǎng)ECU的診斷及刷寫(xiě),此時(shí)就是一個(gè)Client身份。
3. DoIP gateway
DoIP gateway與角色二 DoIP edge node gateway區(qū)別不是很大。實(shí)際的應(yīng)用場(chǎng)景通常會(huì)讓MCU充當(dāng)這個(gè)角色,而MPU充當(dāng)DoIP edge node gateway的角色,也有反過(guò)來(lái)的情況,那么該角色通常單單的跑Server端程序。
4. DoIP node
該角色很好理解,對(duì)支持以太網(wǎng)連接的同時(shí)支持DoIP協(xié)議的ECU認(rèn)為是DoIP node。
該角色通常單單的跑Server端程序。
整個(gè)車輛網(wǎng)絡(luò)由四個(gè)角色組成,外部測(cè)試設(shè)備作為客戶端,對(duì)車內(nèi)網(wǎng)的各個(gè)支持DoIP協(xié)議棧的ECU進(jìn)行診斷。(部分CAN ECU通常掛載在MCU上,由MCU進(jìn)行DoIP轉(zhuǎn)DoCAN的路由)車外網(wǎng)的外部測(cè)試設(shè)備通過(guò)OBD-II與車內(nèi)網(wǎng)的edge gateway進(jìn)行通信,edge gateway用來(lái)使能車內(nèi)網(wǎng)的DoIP功能。在路由打通后,發(fā)送的診斷數(shù)據(jù)根據(jù)目的地址的不同分別流向車內(nèi)網(wǎng)的不同ECU。
03 DoIP的接收方式和協(xié)議格式
3.1 端口
從DoIP名字可以看出,該協(xié)議是在TCP/IP之上的,那么要想接收DoIP協(xié)議的報(bào)文,協(xié)議書(shū)規(guī)定需要監(jiān)聽(tīng)一個(gè)專門分配給DoIP協(xié)議棧使用的端口號(hào)即13400,UDP,TCP都要監(jiān)聽(tīng)此接受端口,而發(fā)送端口是在一個(gè)范圍內(nèi)的隨機(jī)值[49152~65535],當(dāng)然代碼中協(xié)議棧要對(duì)對(duì)端的發(fā)送端口進(jìn)行緩存,用于回送數(shù)據(jù)。
指定了端口號(hào),客戶端和服務(wù)端可以在此端口上進(jìn)行收發(fā)數(shù)據(jù)。那么對(duì)該端口收到的數(shù)據(jù)是否真的是DoIP報(bào)文,就行對(duì)該網(wǎng)絡(luò)報(bào)文進(jìn)行解析。(有可能是網(wǎng)絡(luò)攻擊,有可能是其它應(yīng)用恰好使用了該端口號(hào))
對(duì)收到的報(bào)文進(jìn)行解析,就涉及到DoIP協(xié)議的構(gòu)成,只有符合該寫(xiě)一點(diǎn)規(guī)范才認(rèn)為是合法有效的DoIP報(bào)文。
3.2 協(xié)議格式
DoIP報(bào)文由協(xié)議頭(header)+ 負(fù)載(payload)組成
協(xié)議頭[8 byte]由下面四個(gè)字段組成
Protocol version [1 byte]
Inverse protocol version [1 byte]
Payload type [2 byte]
Payload length [4 byte]
負(fù)載[N byte] 根據(jù)實(shí)際的payload type,負(fù)載數(shù)據(jù)會(huì)不同
3.3Protocol version與Inverse protocol version
通常Protocol version為0x02,目前0x02以上的值目前是reserved狀態(tài)
Inverse protocol version是Protocol version的取反的值,此例0x02去反后為0xFD
協(xié)議書(shū)上特別說(shuō)明了Protocol version可以為0xFF,設(shè)這個(gè)值的作用是,當(dāng)客戶端和服務(wù)端的協(xié)議版本不匹配,可以設(shè)置此值繞過(guò)協(xié)議頭版本不匹配而拒絕請(qǐng)求的case。
3.4 Payload type
payload type可以代表DoIP協(xié)議棧所能支持的功能,列舉如下(特意分開(kāi)了Server支持的type及Client支持的type)
DoIP SERVER
DoIP Client
如上分開(kāi)描述,是因?yàn)樵诖a實(shí)現(xiàn)上,可以將邏輯拆分。
即Server端只關(guān)心自己支持的payload type,客戶端只關(guān)心自己支持的payload type,不支持的可以忽視掉。有利于模塊拆分及組合,有利于實(shí)現(xiàn)上一節(jié)所講個(gè)各個(gè)角色,將來(lái)通過(guò)配置文件的配置,來(lái)表示不同的角色。
3.5 Payload length
payload length這里分配了4字節(jié),也就是所DoIP報(bào)文最大傳輸4 GB /4294967295 bytes,即0xFFFFFFFF。它只是個(gè)允許的范圍,通常來(lái)說(shuō)通過(guò)DoIP進(jìn)行診斷也就幾字節(jié)到幾十字節(jié),而升級(jí)通常ECU的升級(jí)包也就幾MB。所以4 GB只是個(gè)理論上限。
該值可以做長(zhǎng)度的有效性驗(yàn)證,因?yàn)槌嗽\斷數(shù)據(jù),其它payload type都是有固定長(zhǎng)度的。
還可以做什么?其實(shí)做開(kāi)發(fā)時(shí)還要考慮遇到如下情況該怎么處理
1. 數(shù)據(jù)粘連
2. 數(shù)據(jù)截?cái)?/p>
3. 異常的超大size
4. 超過(guò)協(xié)議棧可以處理size
3.6 Payload
這里的負(fù)載是指的是DoIP協(xié)議的負(fù)載,當(dāng)然當(dāng)Payload type為診斷類型時(shí),其負(fù)載除了DoIP自身的內(nèi)容,
還包含了UDS數(shù)據(jù),供上層UDS模塊進(jìn)行進(jìn)一步的解析。
因?yàn)槊總€(gè)Payload type負(fù)載都不同,這里不做解釋,在后續(xù)功能章節(jié),進(jìn)行詳細(xì)的介紹
04?DoIP診斷啟動(dòng)與使用
4.1 連接建立
DoIP實(shí)體內(nèi)管理著一個(gè)DoIP connection table ,用來(lái)記錄和維護(hù)診斷通信的邏輯連接。上圖就是這個(gè)表中的一個(gè)元素,即一個(gè)邏輯連接的狀態(tài)機(jī)。上圖中的方框就是連接所處的狀態(tài),[Step]是狀態(tài)之間跳轉(zhuǎn)時(shí)發(fā)生的事情。
[Step1] 當(dāng)一個(gè)新的套接字建立,邏輯連接的狀態(tài)就從“l(fā)isten”跳轉(zhuǎn)到“socket initialized”,同時(shí)啟動(dòng)一個(gè)定時(shí)器, initial inactivity timer。
[Step2] 當(dāng)DoIP實(shí)體接收到tester發(fā)來(lái)的一個(gè)routing activation信息后,邏輯連接的狀態(tài)就從“socket initialized”跳轉(zhuǎn)到“Registered [Pending for Authentication]” ,此時(shí) initial inactivity timer被停止,啟動(dòng)一個(gè)名為general inactivity timer的定時(shí)器。
[Step3] 在完成Authentication之后,邏輯連接的狀態(tài)就從“Registered [Pending for Authentication]”跳轉(zhuǎn)到“Registered [Pending for Confrmation]” 。
[Step4] 在完成Confrmation之后,邏輯連接的狀態(tài)就從“Registered [Pending for Confrmation]”跳轉(zhuǎn)到“Registered [Routing Active] ” 。
[Step5] 如果initial timer 或general inactivity timer 過(guò)期后仍沒(méi)收到后續(xù)請(qǐng)求,或者authentication 和 confrmation 被拒絕了,又或者外部測(cè)試設(shè)備對(duì)alive check 消息沒(méi)有響應(yīng),則邏輯連接進(jìn)入“Finalize”狀態(tài)。
[Step6]進(jìn)入Finalize后,此時(shí)TCP套接字將被關(guān)閉,并重新回到“l(fā)isten”狀態(tài)。
4.2 車輛發(fā)現(xiàn)
當(dāng)DoIP實(shí)體和外部測(cè)試設(shè)備都連接到一個(gè)網(wǎng)絡(luò)中時(shí),它們會(huì)利用DHCP協(xié)議獲得一個(gè)屬于自己的IP地址。在網(wǎng)絡(luò)中,路由器作為DHCP server,為新加入到該網(wǎng)絡(luò)中的設(shè)備分配IP地址。在獲取IP地址之后,有兩種車輛發(fā)現(xiàn)的方法,如上圖所示。一種方法是車輛主動(dòng)上報(bào)自己的信息3次。如果測(cè)試設(shè)備沒(méi)有收到車輛主動(dòng)上報(bào)的信息,則會(huì)發(fā)送一個(gè)identification request,如果網(wǎng)絡(luò)中有車輛的話,車輛對(duì)這個(gè)請(qǐng)求進(jìn)行響應(yīng),測(cè)試設(shè)備便發(fā)現(xiàn)了被測(cè)車輛。
4.3 會(huì)話建立
在診斷儀發(fā)現(xiàn)車輛之后,會(huì)把車輛添加到自己的車輛列表中。當(dāng)用戶選擇這個(gè)列表中的某輛車,如果連接建立成功,用戶就可以對(duì)車輛進(jìn)行診斷了。
接下來(lái)用戶給汽車發(fā)出診斷信息,網(wǎng)關(guān)會(huì)根據(jù)信息接收對(duì)象把診斷信息轉(zhuǎn)發(fā)給網(wǎng)絡(luò)中相關(guān)的ECU,當(dāng)?shù)玫紼CU 的響應(yīng)之后,網(wǎng)關(guān)再把最終的響應(yīng)發(fā)送給診斷儀。當(dāng)用戶選擇退出時(shí),用于DoIP通信的這個(gè)套接字就被關(guān)閉了。
下圖是一個(gè)DoIP數(shù)據(jù)完整結(jié)構(gòu)的數(shù)據(jù)舉例:
DoIP數(shù)據(jù)完整結(jié)構(gòu)舉例
byte 0:ISO13400 版本
byte 1:ISO13400 版本逐比特取反
byte 2~3:數(shù)據(jù)類型,0x8001,表明這是一個(gè)診斷信息的數(shù)據(jù)包
byte 4~7:數(shù)據(jù)長(zhǎng)度,在這個(gè)例子中的值是7,表示后面有7個(gè)字節(jié)的數(shù)據(jù)
byte 8~9:源地址
byte 10~11:目的地址
byte 12~13:具體的診斷命令,SID是22,表示讀取,DID是0xF8 10
這個(gè)數(shù)據(jù)段作為SDU傳遞給下層協(xié)議,逐層封裝成為完整的以太網(wǎng)幀發(fā)送出去。
審核編輯 :李倩
?
評(píng)論
查看更多