Why need the UDS Service 0x10? ECU在正常工作時會處於某一個會話模式下,上電後會自動進入預設會話模式,所以ECU啟動後我們不需要輸入0x10 01來進入該會話模式。ECU的不同會話模式間存在一定的狀態轉換關係規則(特定邏輯)。 初次接觸UDS的話,可能不太理解這個0x ...
Why need the UDS Service 0x10?
ECU在正常工作時會處於某一個會話模式下,上電後會自動進入預設會話模式,所以ECU啟動後我們不需要輸入0x10 01
來進入該會話模式。ECU的不同會話模式間存在一定的狀態轉換關係規則(特定邏輯)。
初次接觸UDS的話,可能不太理解這個0x10服務的含義和用途,我們通過一個隱喻公司的大廳和兩個私密的會議室的例子來進行類比。
例如:我們將ECU之間的通訊類比成兩個員工之間的對話。兩個人在公司的大廳隨便暢所欲言,隨意討論非私密性的話題,這個場景類似預設會話
,不會對安全性有要求,無需刻意尋找專門使用場所,即不需要專門會話控制進入此模式,上電即預設進入。
如果兩人想討論機密項目的話題,不想被其他不相關人員知道,於是換個環境,從公司大廳進入了單獨的會議室,這個過程可以類比成從預設會話
進入了擴展會話
,進入會議室後為了確認對方是本人沒被冒充,進行識別鑒權詢問口令“天王蓋地虎”,查看對方能不能答出“寶塔鎮河妖”,認證鑒權的這個附加過程就屬於跟0x10服務配合使用的安全訪問服務0x27,溝通結束退出會議室回到大廳區域,這個過程就是從擴展會話
退出到預設會話
的過程。
而從預設會話
進入了編程會話
,也是類似從公司大廳進入了單獨的會議室溝通,只是這個會議室的功能更高級一點比如可以寫入文件到ECU等,功能更高級相對應的鑒權也得有所區別,在編程會話
這個會議室里,就換一個詢問口令“你知道今天下雨嗎?”,如果對方能答上“今天不下明天下”就認為身份合法。
0x10 types
0x10 會話模式的三種模式:
-
10 01 預設模式(default session)
- 在預設會話模式下,一般情況下不允許支持寫服務(Write Data By Identifier 0x2E),也不允許支持請求下載服務(Request Download 0x34)
-
10 02 編程模式(Programming Session)
- 在編程會話模式下,就可以支持(Request Download 0x34)
-
10 03 擴展診斷模式(extended Diagnostic Session)
- 在拓展診斷會話模式下,就允許支持寫服務(Write Data By Identifier 0x2E)
Conversion between session modes
不同會話模式間的切換存在一定的邏輯關係。下圖顯示的就是一個不同會話間轉換示例圖,需要註意的是不同OEM對於進入編程會話通常會有不同的設計要求,具體項目中會話間跳轉關係請依據OEM項目的規範文件為準。
-
預設會話
設備上電後自動進入預設會話模式,從圖中我們可以看出在預設會話模式下的切換關係。本模式重新進入:可以通過0x10 01再次進入預設會話,或通過0x11 01、0x11 03複位服務重啟進入預設會話。
本模式進入其他模式:預設會話模式可以通過0x10 02進入編程會話模式,在有些項目中預設會話是不能直接進入編程會話模式,具體項目中是否能夠支持需要查閱項目產品的診斷技術規範;預設會話模式下還可以通過0x10 03進入擴展會話模式。
-
編程會話
啟動編程會話ECU會進入boot模式,進入boot模式後ECU可以進行固件的更新。boot的更新可以通過Jtag介面使用工具進行燒錄,相對來說Jtag介面的許可權等級比較高,可以通過工具直接修改存儲空間中對應地址的數據信息。實際項目會使用CAN網路來軟體刷寫,商用階段去除Jtag介面,這樣處理的話安全性會得到一定保障。同樣的在boot模式下可以刷寫固件,那很多診斷服務在boot下也可以正常執行,如配合刷寫的
0x11
、0x22
、0x2E
、0x31
、0x28
、0x34
、0x36
、0x37
、0x85
等服務。本模式重新進入:處於編程會話模式下,可以通過0x10 02再次進入編程會話。
本模式進入其他模式:編程會話狀態下可以通過0x10 01進入預設會話,或通過0x11 01服務複位ECU來進入預設會話;編程會話不能進入擴展會話模式。
-
擴展會話
某些服務需要擴展會話的支持才能執行,擴展會話下如果不配合使用0x3E服務(保持會話服務),ECU會在數秒後自動退出擴展會話模式進入到預設會話模式。
本模式重新進入:處於擴展會話模式下,可以通過0x10 03再次進入擴展會話。
本模式進入其他模式:在不使用0x3E服務保持會話時,可以通過超時自動退出到預設會話模式,可以通過0x10 01進入預設會話,或通過0x11 01、0x11 03服務複位ECU來進入預設會話;在某些項目中僅支持在0x10 03擴展模式下,才能進入0x10 02編程會話。
UDS 0x10 Message format
Request Message format
- SID
就是0x10
- Sub-Function
子服務就是上文講的01預設會話
、02編程會話
、03擴展會話
。
當然規範中還存在00保留欄位、04安全系統診斷會話、05-3F保留、40-5F主機廠自定義欄位、60-7E零部件供應商自定義欄位等等(瞭解即可)。 - parameter
Parameter項是對應到最詳細子功能的屬性參數配置項,屬性參數的配置也是根據實際情況來進行配備。
0x10服務沒有參數。
Response Message format
- SID
SID的值為請求報文中SID + 0x40 , 為0x50
; - Sub-Function和Parameter
這兩部分的內容根據具體情況確定,在項目診斷規範中有明確規定。
Negative Response Code - NRC
負響應回覆報文的格式同樣可以分為3個部分:
- 首先第一個位元組是0x7F,表明請求失敗;
- 第二個位元組為請求的服務SID ;
- 第三個位元組為失敗原因代碼NRC
NRC代碼具體對應的失敗原因可以查閱NRC的表格來確定,在具體的項目中這部分內容可以查閱項目中的零部件網路診斷規範。
註意:負響應NRC代碼表一般在項目中是通用的。
負響應報文格式示例:
7F 10 7E
// 7F表明該相應失敗
// 對應的失敗服務是10
// 失敗原因是7E,查閱NRC表知道7E的含義是“Sub-function not supported in active session”,提醒使用請求10 02子功能請求時不應該在當前會話模式下,當前的會話模式不支持10 02子功能請求使用。
UDS 0x10 and 0x27 Process
進入擴展模式
和編程模式
通常是配合0x27服務一起使用的,所以把這兩個服務一起來進行介紹,是因為通常0x27服務使用的前提就是先進入0x10服務的擴展會話,
反過來講0x10服務很少單獨使用,一般都是跟0x27服務配合先完成安全驗證,然後其他服務才能在一定的會話模式和安全接入等級中正常使用。
主機廠和零部件廠商可以通過不同的UDS服務對ECU執行很多操作,這些操作有的會修改ECU配置,有的可以重啟設備,有的可以讀取信息等等。顯而易見的是,不同的操作所造成的後果嚴重程度是不一樣的,因此做敏感操作前需要通過安全認證就很有必要。
我們通常把預設狀態下的ECU叫做鎖定狀態(Locked),成功執行完成$27服務後的狀態叫做解鎖(Unlock),只有在解鎖狀態下才能進行數據寫入、修改等等操作。
上位機和ECU的大致交互流程如下:
//UDS or APP
10 03
50 03
27 01
67 xx xx xx xx
27 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
67 02
2E xx xx
//BOOT
10 02
50 02
27 11
67 xx xx xx xx
...
34 xx xx
Reference
鑒源丨車載ECU嵌入式設備的診斷測試 - 會話和安全控制
https://www.freebuf.com/articles/ics-articles/346353.html
CAN診斷輕鬆入門第二講-UDS服務講解
https://zhuanlan.zhihu.com/p/348308023
Github:https://github.com/Mysticbinary
既然看到了這裡,君何不暢談一番?