UDS協(xié)議通過0x10(診斷會話控制)服務(wù)定義了三級會話體系,包括默認(rèn)會話(Default Session)、擴(kuò)展會話(Extended Session)和編程會話(Programming Session)。這套安全體系實(shí)現(xiàn)了不同權(quán)限級別的分層隔離,確保了診斷和刷寫流程的安全性。
![]()
三級安全體系剖析
會話層級
子功能碼
“禁區(qū)”類比
核心機(jī)制
默認(rèn)會話 0x01
公共區(qū)域
ECU上電后的初始狀態(tài)。這是權(quán)限最低的會話,通常只支持信息讀取等基礎(chǔ)服務(wù)。
擴(kuò)展會話 0x03
工程師工作區(qū)
權(quán)限更高,可進(jìn)行參數(shù)寫入等操作。進(jìn)入此模式后,通常需要先通過“安全訪問”認(rèn)證。
編程會話 0x02
手術(shù)室
最高權(quán)限,用于執(zhí)行固件更新、內(nèi)存擦寫等敏感操作。
注:這些會話與0x27安全訪問服務(wù)緊密配合,構(gòu)成了UDS的核心安全防線。會話切換與狀態(tài)管理
會話切換并非隨意進(jìn)行,它遵循一套嚴(yán)謹(jǐn)?shù)倪壿嫞⒂啥〞r器機(jī)制進(jìn)行管理,防止ECU長時間停留在高權(quán)限狀態(tài)。
標(biāo)準(zhǔn)會話切換路徑
一個常見的診斷會話切換路徑及報文示例通常如下:
graph TD
Default[默認(rèn)會話 (Default) 0x10 01]
Default -->|診斷請求| Extended[擴(kuò)展會話 (Extended) 0x10 03
Request: 10 03
Positive: 50 03]
Extended -->|安全訪問| SA{安全訪問 (27 Service)}
SA -- 驗(yàn)證通過 --> Extended_Ready[擴(kuò)展會話(已解鎖)]
Extended_Ready -->|編程請求| Programming[編程會話 (Programming) 0x10 02
Request: 10 02
Positive: 50 02]
Default -.->|直接請求失敗| x((X))
Programming -.->|不可直接返回| Extended
關(guān)鍵切換邏輯:
路徑要求 :必須從 默認(rèn)會話 切換到 擴(kuò)展會話 ,再從擴(kuò)展會話切換到 編程會話 。通常不能從默認(rèn)會話直接切換到編程會話。
會話保持 :進(jìn)入擴(kuò)展或編程會話后,診斷儀需周期性發(fā)送 **
TesterPresent服務(wù) (ID:0x3E)**,以維持非默認(rèn)會話狀態(tài),避免因超時而自動退回默認(rèn)會話。
會話超時是UDS協(xié)議中重要的安全機(jī)制,其核心時間參數(shù)有:
S3 Server time : 非默認(rèn)會話在無診斷請求時,能保持的最大空閑時間。
P2 Server : ECU 處理單幀診斷請求的典型超時時間。
P2 Server *: 在需要更多處理時間 (如下載/擦除) 時,響應(yīng)超時時間的最大值。
以下代碼示例展示了如何在嵌入式ECU中實(shí)現(xiàn)這些核心邏輯(基于常見UDS協(xié)議棧實(shí)現(xiàn))。
0x10 服務(wù):會話切換核心處理
當(dāng)診斷儀發(fā)送一個切換會話的請求時(如 10 03),ECU的Dcm_Dcm_ProcessRequest函數(shù)會接收到報文,并根據(jù)以下邏輯進(jìn)行處理:
會話超時管理/* 全局變量:用于存儲診斷會話狀態(tài)和應(yīng)用計(jì)時器 */
static Dcm_DiagnoticSessionType Dcm_CurrDiagSession = DCM_DEFAULT_SESSION; // 當(dāng)前會話狀態(tài)
static uint16 Dcm_S3ServerTimer = 0; // S3 Server超時計(jì)時器,單位ms
static uint8 Dcm_TimerRunning = 0; // 計(jì)時器運(yùn)行標(biāo)志
/** @brief UDS 0x10 服務(wù)的主處理函數(shù)
* @param MsgBuf 指向接收到的UDS請求報文的指針
* @param RespBuf 指向響應(yīng)報文緩沖區(qū)的指針(輸出參數(shù))
* @return 函數(shù)執(zhí)行狀態(tài)(通常是E_OK表示成功,E_NOT_OK表示失敗)
*/
Std_ReturnType Dcm_DiagnosticSessionControl (uint8* MsgBuf, uint8* RespBuf)
{
uint8 subFunction = MsgBuf[1]; // 獲取請求的子功能 (01/02/03)
uint8 retVal = 0; // 返回值
/* 1. 執(zhí)行通用條件檢查 */
retVal = Dcm_PreconditionsCheck(MsgBuf); // 檢查是否支持該服務(wù),格式是否正確
if (retVal != NRC_POS_RESP)
{
RespBuf[0] = 0x7F; // 負(fù)響應(yīng)ID
RespBuf[1] = 0x10; // 被拒絕的服務(wù)ID
RespBuf[2] = retVal; // 負(fù)響應(yīng)碼
return E_OK;
}
/* 2. 根據(jù)請求的子功能,執(zhí)行特定的會話切換邏輯 */
switch (subFunction)
{
case DCM_DEFAULT_SESSION: // 子功能碼 0x01 : 切換到默認(rèn)會話
if (Dcm_CurrDiagSession != DCM_DEFAULT_SESSION)
{
/* 在退出非默認(rèn)會話前,調(diào)用清理函數(shù) */
Dcm_ClearSessionResources(Dcm_CurrDiagSession);
Dcm_CurrDiagSession = DCM_DEFAULT_SESSION;
}
/* 重新初始化默認(rèn)會話:重置所有診斷相關(guān)的臨時配置 */
Dcm_ReinitializeDefaultSession();
break;
case DCM_PROGRAMMING_SESSION: // 子功能碼 0x02 : 切換到編程會話
/* 檢查切換條件1:是否由擴(kuò)展會話發(fā)起 */
if (Dcm_CurrDiagSession != DCM_EXTENDED_DIAGNOSTIC_SESSION)
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_7E; // 服務(wù)序列中的子功能不支持(當(dāng)前會話不支持該切換)
return E_OK;
}
/* 檢查切換條件2:安全訪問是否已解鎖(通常需要高安全級別) */
if (Dcm_SecurityLevel != DCM_SEC_LVL_PROGRAMMING) // 假設(shè)DCM_SEC_LVL_PROGRAMMING是編程安全級別
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_33; // 安全訪問未解鎖
return E_OK;
}
/* 檢查切換條件3:車輛狀態(tài)是否允許(如車速、電壓等) */
if (Dcm_CheckVehicleConditions() != E_OK)
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_22; // 條件不滿足
return E_OK;
}
/* 執(zhí)行編程會話的清理和準(zhǔn)備工作 */
Dcm_ClearSessionResources(Dcm_CurrDiagSession);
Dcm_CurrDiagSession = DCM_PROGRAMMING_SESSION;
/* 重置并重新配置適用于編程會話的計(jì)時參數(shù)(如超時間隔) */
Dcm_ConfigureTimingParameters(DCM_PROGRAMMING_SESSION);
break;
case DCM_EXTENDED_DIAGNOSTIC_SESSION: // 子功能碼 0x03 : 切換到擴(kuò)展會話
/* 檢查切換條件:是否在默認(rèn)會話下請求切換 */
if (Dcm_CurrDiagSession != DCM_DEFAULT_SESSION)
{
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_7E;
return E_OK;
}
Dcm_ClearSessionResources(Dcm_CurrDiagSession);
Dcm_CurrDiagSession = DCM_EXTENDED_DIAGNOSTIC_SESSION;
break;
default: // 其他不支持的子功能
RespBuf[0] = 0x7F;
RespBuf[1] = 0x10;
RespBuf[2] = NRC_12; // 子功能不支持
return E_OK;
}
/* 3. 構(gòu)造0x10服務(wù)的肯定響應(yīng)報文 */
RespBuf[0] = 0x50; // 正響應(yīng)ID
RespBuf[1] = subFunction; // 回聲請求的子功能
RespBuf[2] = (uint8)(Dcm_P2Server_Max >> 8); // 時間參數(shù) P2 Server Max 高位字節(jié)
RespBuf[3] = (uint8)(Dcm_P2Server_Max & 0xFF); // 時間參數(shù) P2 Server Max 低位字節(jié)
RespBuf[4] = (uint8)(Dcm_P2StarServer_Max >> 8); // 時間參數(shù) P2* Server Max 高位字節(jié)
RespBuf[5] = (uint8)(Dcm_P2StarServer_Max & 0xFF);// 時間參數(shù) P2* Server Max 低位字節(jié)
RespBuf[6] = 0x01; // 可選參數(shù),通常為0x01
RespBuf[7] = 0xF4; // 可選參數(shù),通常為0xF4
/* 4. 重置S3 Server超時計(jì)時器 */
Dcm_S3ServerTimer = Dcm_S3ServerMax; // 重新加載定時器初始值
Dcm_TimerRunning = 1; // 啟動計(jì)時器return E_OK;
}
ECU的系統(tǒng)Tick中斷或后臺主循環(huán)中,需要持續(xù)處理會話的超時邏輯。其核心思想是:當(dāng)ECU處于某個非默認(rèn)會話時,會啟動一個計(jì)時器(S3 Server),并在計(jì)時器到期后將會話切回默認(rèn)會話。
/** @brief 定時器服務(wù)函數(shù)(通常在1ms或10ms中斷/循環(huán)中被調(diào)用) */
void Dcm_MainFunction_Timer (void)
{
/* 1. 會話超時管理 (S3 Server) */
if (Dcm_TimerRunning == 1) // 如果有計(jì)時器正在運(yùn)行
{
if (Dcm_S3ServerTimer != 0U) // 如果計(jì)時器未歸零
{
Dcm_S3ServerTimer--; // 計(jì)時器遞減
}
if (Dcm_S3ServerTimer == 0U) // 如果計(jì)時器歸零,會話超時
{
Dcm_CurrDiagSession = DCM_DEFAULT_SESSION; // 強(qiáng)制切換回默認(rèn)會話
Dcm_TimerRunning = 0; // 停止計(jì)時器
/* 通知系統(tǒng):會話已因超時而退出,重置任何與之前會話相關(guān)的配置 */
Dcm_NotifySessionTimeout();
}
}/* 2. 其他定時管理,如P2/P2*服務(wù)器的超時監(jiān)控等 */
// ...
}
注意:上述代碼為典型設(shè)計(jì)思路,實(shí)際產(chǎn)品級實(shí)現(xiàn)通常在AUTOSAR DCM(診斷通信管理)模塊的Dcm_DiagnosticSessionControl_SubFnc函數(shù)和Dcm_Timer函數(shù)中完成。典型安全刷寫流程
一個完整的、安全的ECU軟件升級流程,會充分體現(xiàn)這套三級安全體系。通常包括以下步驟:
進(jìn)入擴(kuò)展會話 :診斷儀發(fā)送
10 03,ECU進(jìn)入擴(kuò)展會話,解鎖部分功能。安全訪問認(rèn)證 :診斷儀通過
27服務(wù)(請求種子->發(fā)送密鑰)通過ECU的高級別身份驗(yàn)證。成功后,ECU解鎖編程相關(guān)權(quán)限。刷寫前預(yù)檢查 :使用
31例程控制服務(wù)檢查刷寫條件(如電壓、車速),確保環(huán)境安全。進(jìn)入編程會話 :診斷儀發(fā)送
10 02。ECU驗(yàn)證當(dāng)前在擴(kuò)展會話且通過安全認(rèn)證后切換至編程會話,并 停止應(yīng)用軟件運(yùn)行 ,準(zhǔn)備接收新固件。執(zhí)行固件更新 :通過
34,36,37等服務(wù),將新固件數(shù)據(jù)下載到ECU的特定內(nèi)存區(qū)域(如Flash)。復(fù)位與退出 :更新完成后,發(fā)送
11 01硬復(fù)位ECU,使其重啟。此時ECU會 自動回到默認(rèn)會話 ,新固件開始運(yùn)行。
這種分級設(shè)計(jì)有效確保了即使在安全認(rèn)證失敗的情況下,ECU也不會被惡意刷寫,保護(hù)了核心功能安全。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.