系列文章目录
9、诊断和通信管理功能单元(1-5)
9、诊断和通信管理功能单元(6-10)
9、诊断和通信管理功能单元1-5
9.1 概述
表22定义了诊断和通信管理功能单元。
--------------------------------表22 -诊断和通信管理功能单元
服务 | 描述 |
---|---|
DiagnosticSessionControl | 客户端请求控制与服务器的诊断会话。 |
ECUReset | 客户端强制服务器执行重置。 |
SecurityAccess | 客户端请求解锁受保护的服务器。 |
CommunicationControl | 客户端控制服务器中通信参数的设置(例如:通信波特率)。 |
TesterPresent | 客户端向服务器表明它仍然存在。 |
AccessTimingParameter | 客户端使用此服务读取/修改主动通信的定时参数。 |
SecuredDataTransmission | 客户端使用此服务执行具有扩展数据链路安全性的数据传输。 |
ControlDTCSetting | 客户端控制服务器中dtc的设置。 |
ResponseOnEvent | 客户端请求设置和/或控制服务器中的事件机制。 |
LinkControl | 客户端请求控制通信波特率。 |
9.2 DiagnosticSessionControl (0x10)服务
9.2.1服务描述
DiagnosticSessionControl服务用于在服务器中启用不同的诊断会话。
诊断会话在服务器中启用一组特定的诊断服务和/或功能。该服务提供了一种功能,服务器可以报告数据链路层特定的参数值,这些参数值对于已启用的诊断会话是有效的(例如定时参数值)。本国际标准的使用者应定义在每个诊断会话中启用的服务和/或功能的确切集合。
在服务器中应该总是只有一个活动的诊断会话。服务器在通电时应始终启动默认诊断会话。如果没有启动其他诊断会话,那么只要服务器通电,默认诊断会话就会运行。
服务器应能够在正常操作条件和车辆制造商定义的其他操作条件下(例如,跛行在家操作条件)提供诊断功能。
如果客户端请求了一个诊断会话,并且该会话已经在运行,那么服务器将发送一个肯定的响应消息,并按照图7所示的方式进行操作,图7描述了在会话之间转换时服务器的内部行为。
每当客户端请求新的诊断会话时,服务器应在新会话的计时在服务器中变为活动状态之前发送DiagnosticSessionControl肯定响应消息。有些情况可能要求在发送肯定响应之前必须进入新会话,同时保持发送响应的旧协议定时。如果服务器不能启动请求的新诊断会话,那么它将使用一个DiagnosticSessionControl否定响应消息进行响应,当前会话将继续(有关服务器和客户端如何行为的进一步信息,请参阅diagnosticSession参数定义)。非默认诊断会话(不包括programmingSession)中的诊断服务和诊断功能集是defaultSession中提供的功能的超集,这意味着在切换到任何非默认诊断会话时,defaultSession的诊断功能也可用。会话可以启用特定于汽车制造商的服务和功能,这些不是本文档的一部分。
要启动一个新的诊断会话,服务器可能要求满足某些条件。所有这些条件都是用户定义的。这类情况的例子有:
——服务器可能只允许具有特定客户端标识符(客户端诊断地址)的客户端启动特定的新诊断会话(例如,服务器可能要求只有具有客户端标识符0xF4的客户端才能启动extendedDiagnosticSession)。
——可能需要满足某些安全条件(例如,车辆不得移动或发动机不得运转)。
在一些系统中,当一个新的诊断会话开始时,需要改变通信时序参数。DiagnosticSessionControl服务实体可以使用适当的服务原语来更改为底层指定的定时参数,以更改本地节点以及客户端想要与之通信的潜在节点中的通信定时。
图7概述了诊断会话转换,以及服务器在转换到另一个会话时应该做些什么。
1 default session:当服务器处于defaultSession状态,客户端请求启动defaultSession时,服务器将重新完全初始化defaultSession。在激活会话期间,服务器应重置所有激活/启动/更改的设置/控制。这还不包括编入非易失性存储器的长期变化。
2 会话:当服务器从defaultSession过渡到任何其他会话时,服务器应该只停止事件(类似于stopResponseOnEvent),这些事件在defaultSession期间通过ResponseOnEvent (0x86)服务在服务器中配置。
3 相同或其他会话:当服务器从除defaultSession以外的任何诊断会话转换到除defaultSession以外的另一个会话(包括当前活动的诊断会话)时,服务器应(重新)初始化诊断会话,这意味着:
i)通过ResponseOnEvent (0x86)服务在服务器中配置的每个事件都应停止。
ii) 安全应重新锁定。注意,安全访问的锁定将重置任何依赖于安全访问的活动诊断功能,使其解锁(例如,DID的活动inputOutputControl)。
iii)在新会话中支持的、不依赖于安全访问的所有其他活动诊断功能应予以维护。例如,当从一个非defaultsession转换到另一个非defaultsession或相同的非defaultsession时,任何配置的周期性调度程序都应保持活动状态,并且CommunicationControl和ControlDTCSetting服务的状态不应受到影响,这意味着正常通信在会话切换时被禁用时将保持禁用状态。
4 default session:当服务器从除default session以外的任何诊断会话过渡到defaultSession时,服务器应停止通过ResponseOnEvent (0x86)服务在服务器中配置的每个事件,并启用安全性。defaultSession中不支持的任何其他活动诊断功能将被终止。例如,任何配置的周期性调度程序或输出控制都应被禁用,并且CommunicationControl和ControlDTCSetting服务的状态应被重置,这意味着在会话切换到defaultSession时,当正常通信被禁用时,应重新启用正常通信。在激活会话期间,服务器应重置所有激活/启动/更改的设置/控制。这还不包括编入非易失性存储器的长期变化。
表23定义了在defaultSession和非defaultSession(定时服务)期间允许的服务。任何非defaultsession都绑定到诊断会话计时器,该计时器必须由客户端保持肯定状态。
Service | defaultSession | non-defaultSession |
---|---|---|
DiagnosticSessionControl – 0x10 | x | x |
ECUReset – 0x11 | x | x |
SecurityAccess – 0x27 | not applicable | x |
CommunicationControl – 0x28 | not applicable | x |
TesterPresent – 0x3E | x | x |
AccessTimingParameter – 0x83 | not applicable | x |
SecuredDataTransmission – 0x84 | not applicable | x |
ControlDTCSetting – 0x85 | not applicable | x |
ResponseOnEvent – 0x86 | x^a | x |
LinkControl – 0x87 | not applicable | x |
ReadDataByIdentifier – 0x22 | x^b | x |
ReadMemoryByAddress – 0x23 | x^c | x |
ReadScalingDataByIdentifier – 0x24 | x^b | x |
ReadDataByPeriodicIdentifier – 0x2A | not applicable | x |
DynamicallyDefineDataIdentifier – 0x2C | x^d | x |
WriteDataByIdentifier – 0x2E | x^b | x |
WriteMemoryByAddress – 0x3D | x^c | x |
ClearDiagnosticInformation – 0x14 | x | x |
ReadDTCInformation – 0x19 | x | x |
InputOutputControlByIdentifier – 0x2F | not applicable | x |
RoutineControl – 0x31 | x^e | x |
RequestDownload – 0x34 | not applicable | x |
RequestUpload – 0x35 | not applicable | x |
TransferData – 0x36 | not applicable | x |
RequestTransferExit – 0x37 | not applicable | X |
RequestFileTransfer – 0x38 | not applicable | X |
a 、 在defaultSession期间是否允许ResponseOnEvent服务是具体实现的。 | ||
b 、 安全数据标识符需要SecurityAccess服务,因此需要非默认诊断会话。 | ||
c 、受保护的内存区域需要SecurityAccess服务,因此需要非默认诊断会话。 | ||
d 、 可以在默认和非默认诊断会话中动态定义数据标识符。 | ||
e 、安全例程需要SecurityAccess服务,因此需要非默认诊断会话。需要客户端主动停止的例程也需要非默认会话。 | ||
not applicable :不适用 |
重要提示——服务器和客户端应满足请求和响应消息行为在7.5节(未更)中指定。
9.2.2请求消息
9.2.2.1请求消息定义
表24定义了请求消息。
A_Data byte | 参数名称 | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | DiagnosticSessionControl Request SID | M | 0x10 | DSC |
#2 | sub-function = [ diagnosticSessionType ] | M | 0x00 – 0xFF | LEV_DS_ |
9.2.2.2请求消息子函数参数$Level (LEV_)的定义
子函数参数diagnosticSessionType由DiagnosticSessionControl服务用于选择服务器的特定行为。表25详细说明了可能的诊断会话的解释和使用。
指定以下子函数值(suppressPosRspMsgIndicationBit (bit 7)未显示)。
Bit 6-0 | 描述 | Cvt | Mnemonic |
---|---|---|---|
0x00 | SOSAEReserved 此值由本文档保留。 | M | ISOSAERESRVD |
0x01 | defaultSession 此诊断会话启用服务器中的默认诊断会话,并且不支持任何诊断应用程序超时处理规定(例如,不需要testpresent服务来保持会话活动)。 如果服务器中除defaultSession之外的任何其他会话已经激活,并且defaultSession再次启动,则应遵循以下实现规则(参见上面给出的服务器诊断会话状态图): 服务器在发送了DiagnosticSessionControl阳性响应消息后,应停止当前的诊断会话,并在之后启动新请求的诊断会话。 如果服务器发送了一个DiagnosticSessionControl肯定响应消息,如果客户端在诊断会话期间解锁了服务器,则服务器将被重新锁定。 如果服务器发送带有DiagnosticSessionControl请求服务标识符的否定响应消息,则活动会话将继续。 注:如果使用的数据链路需要初始化步骤,则初始化服务器将默认启动默认诊断会话。在初始化步骤之后,不需要将诊断会话设置为defaultSession的诊断会话控制。 | M | DS |
0x02 | ProgrammingSession 这个diagnosticSession启用了支持服务器内存编程所需的所有诊断服务。 如果服务器在引导软件中运行programmingSession,则programmingSession只能通过客户端发起的ECUReset (0x11)服务、sessionType等于defaultSession的DiagnosticSessionControl (0x10)服务或服务器中的会话层超时来保留。 如果服务器在接收到sessionType等于defaultSession的DiagnosticSessionControl (0x10)服务时运行在引导软件中,或者发生会话层超时,并且两种情况下都存在有效的应用软件,则服务器应重新启动应用软件。本文档没有具体说明如何实现有效应用软件的重新启动的各种实现方法(例如,在启动软件中直接确定有效的应用软件,在ECU启动阶段执行ECU复位等)。 | U | PRGS |
0x03 | extendedDiagnosticSession 此诊断会话可用于启用所有诊断服务,以支持服务器内存中“空闲速度、CO值等”等功能的调整。它还可以用于启用诊断服务,这些服务与功能的调整没有特别的联系(例如,参考表23中的定时服务)。 | U | EXTDS |
0x04 | safetySystemDiagnosticSession 此诊断会话启用支持安全系统相关功能(例如,安全气囊展开)所需的所有诊断服务。 | U | SSDS |
0x05 – 0x3F | ISOSAEReserved 本文档保留此值以供将来定义。 | M | ISOSAERESRVD |
0x40 – 0x5F | vehicleManufacturerSpecific 此值范围保留给特定的汽车制造商使用。 | U | VMS |
0x60 – 0x7E | systemSupplierSpecific 此值范围保留给系统供应商特定使用。 | U | SSS |
0x7F | ISOSAEReserved 本文档保留此值以供将来定义。 | M | ISOSAERESRVD |
9.2.2.3请求消息数据参数定义
此服务不支持请求消息中的数据参数。
9.2.3 肯定响应消息
9.2.3.1 肯定响应消息定义
表26定义了肯定响应消息定义。
A_Data byte | Parameter Name | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | DiagnosticSessionControl Response SID | M | 0x50 | DSCPR |
#2 | sub-function = [ diagnosticSessionType ] | M | 0x00 – 0xFF | LEV_DS_ |
#3 : #6 | sessionParameterRecord[]#1 = [ data#1 : data#4 ] | M : M | 0x00 – 0xFF : 0x00 – 0xFF | SPREC_ DATA_1 : DATA_m |
9.2.3.2 肯定响应消息数据参数定义
表27定义了响应消息数据参数定义。
定义 |
---|
diagnosticSessionType 该参数是请求消息中子函数参数6 - 0位的回显。 |
sessionParameterRecord 该参数记录包含服务器报告的与会话相关的参数值。sessionParameterRecord的内容在表28和表29中定义。 |
表28和表29定义了响应消息数据-参数sessionParameterRecord的结构,该结构适用于在受支持的数据链路上实现此服务。
Byte pos.in record | 描述 | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 #2 #3 #4 | sessionParameterRecord[] = [ P2 Server_max (high byte) P2 Server_max (low byte) P2* Server_max (high byte) P2* Server_max (low byte) ] | M M M M | 0x00 – 0xFF 0x00 – 0xFF 0x00 – 0xFF 0x00 – 0xFF | SPREC_ P2SMH P2SML P2ESMH P2ESML |
参数 | 描述 | # of bytes | Resolution | minimum value | maximum value |
---|---|---|---|---|---|
P2 Server_max | 对于激活的诊断会话,服务器支持的默认P2 Server_max定时。 | 2 | 1 ms | 0 ms | 65 535 ms |
P2* Server_max | 增强的(NRC 0x78) P2 Server_max,服务器支持激活的诊断会话。 | 2 | 10 ms | 0 ms | 655 350 ms |
有关P2服务器和P2*服务器的详细信息,请参阅ISO 14229-2。
9.2.4支持的否定响应码(NRC_)
本服务应执行以下否定响应代码。表30记录了每个响应代码发生的情况。如果错误场景适用于服务器,则应使用列出的否定响应。
NRC | 描述 | Mnemonic |
---|---|---|
0x12 | sub-functionNotSupported 如果子功能参数不被支持,则发送此NRC。 | SFNS |
0x13 | incorrectMessageLengthOrInvalidFormat 如果消息长度错误,则应发送此NRC。 | IMLOIF |
0x22 | conditionsNotCorrect 如果请求DiagnosticSessionControl的标准不满足,则返回该NRC。 | CNC |
9.2.5消息流示例诊断会话控制
9.2.5.1示例#1 -启动programmingSession
此消息流显示了如何在服务器中启用诊断会话“programmingSession”。客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。对于给定的示例,假设P2 Server_max等于50 ms, P2* Server_max等于5 000 ms。
表31定义了DiagnosticSessionControl请求消息流示例#1。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | DiagnosticSessionControl Request SID | 0x10 | DSC |
#2 | diagnosticSessionType = programmingSession, suppressPosRspMsgIndicationBit = FALSE | 0x02 | DS_ECUPRGS |
表32定义了DiagnosticSessionControl肯定响应消息流示例#1。
Message direction | server→ client(服务器 → 客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | DiagnosticSessionControl Response SID | 0x50 | DSCPR |
#2 | diagnosticSessionType = programmingSession | 0x02 | DS_ECUPRGS |
#3 #4 #5 #6 | sessionParameterRecord [ P2 Server_max (high byte) ] sessionParameterRecord [ P2 Server_max (low byte) ] sessionParameterRecord [ P2* Server_max (high byte) ] sessionParameterRecord [ P2* Server_max (low byte) ] | 0x00 0x32 0x01 0xF4 | SPREC_1 SPREC_2 SPREC_3 SPREC_4 |
9.3 ECUReset (0x11)服务
9.3.1服务描述
客户端使用ECUReset服务请求服务器重置。
该服务请求服务器根据ECUReset请求消息中嵌入的resetType参数值的内容有效地执行服务器重置。ECUReset肯定响应消息(如果需要)应该在服务器执行重置之前发送。服务器复位成功后,服务器将激活defaultSession。
重要提示——服务器和客户端应满足7.5中规定的请求和响应消息行为。
ISO 14229的这一部分没有定义ECU的行为,从ECU复位请求的肯定响应消息之后的时间,直到复位成功完成。建议在此期间ECU不接受任何请求消息,也不发送任何响应消息。
9.3.2请求消息
9.3.2.1请求消息定义
表33定义了请求消息定义。
A_Data byte | 参数名称 | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | ECUReset Request SID | M | 0x11 | ER |
#2 | sub-function = [ resetType ] | M | 0x00 – 0xFF | LEV_RT_ |
9.3.2.2请求消息子函数参数$Level (LEV_)定义
ECUReset请求消息使用子函数参数resetType来描述服务器必须如何执行复位(suppressPosRspMsgIndicationBit (bit 7)未显示)。
表34定义了请求消息子函数参数定义。
Bits 6 – 0 | 描述 | Cvt | Mnemonic |
---|---|---|---|
0x00 | ISOSAEReserved 此值由本文档保留。 | M | ISOSAERESRVD |
0x01 | hardReset 该值标识了一个“硬复位”条件,它模拟了在服务器先前断开其电源(即电池)后通常执行的上电/启动序列。执行的操作是特定于实现的,而不是由标准定义的。它可能导致将易失性存储器和非易失性存储器位置重新初始化为预定值。 | U | HR |
0x02 | keyOffOnReset 此值识别类似于驾驶员将点火键关闭并重新打开的情况。这个复位条件应该模拟一个键-off-on序列(即中断开关电源)。执行的操作是特定于实现的,而不是由标准定义的。通常,保留非易失性存储器位置的值;易失性内存将被初始化。 | U | KOFFONR |
0x03 | softResett 此值标识“软复位”条件,该条件会导致服务器立即重新启动应用程序(如果适用)。执行的操作是特定于实现的,而不是由标准定义的。典型的操作是重新启动应用程序,而不重新初始化先前学习的配置数据、自适应因素和其他长期调整。 | U | SR |
0x04 | enableRapidPowerShutDown 此子功能适用于非点火供电但仅由电池供电的ecu。因此,关机强制进入睡眠模式,而不是关闭电源。睡眠意味着断电,但仍准备好唤醒(电池供电)。子功能的目的是减少ECU的待机时间后,点火转到关闭位置。 该值要求服务器启用并执行“快速关机”功能。一旦“钥匙/点火”关闭,服务器将立即执行该功能。当服务器执行关机功能时,它应该直接或在定义的待机时间之后过渡到睡眠模式。如果客户端需要响应消息,而服务器已经准备好执行“快速关机”功能,则服务器应在“快速关机”功能启动前发送肯定响应消息。下一次出现“键开”或“点火开”信号将终止“快速断电”功能。 说明 : 该子功能仅适用于支持待机模式的服务器! | U | ERPSD |
0x05 | disableRapidPowerShutDown 该值要求服务器禁用先前启用的“快速下电”功能。 | U | DRPSD |
0x40 – 0x5F | vehicleManufacturerSpecific 此值范围保留给特定的汽车制造商使用。 | U | VMS |
0x60 – 0x7E | systemSupplierSpecific 此值范围保留给系统供应商特定使用。 | U | SSS |
0x7F | ISOSAEReserved 本文档保留此值以供将来定义。 | M | ISOSAERESRVD |
9.3.2.3请求消息数据参数定义
此服务不支持请求消息中的数据参数。
9.3.3 肯定响应消息
9.3.3.1 肯定响应消息定义
表35定义了肯定响应消息。
A_Data byte | 参数名称 | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | ECUReset Response SID | M | 0x51 | ERPR |
#2 | sub-function = [ resetType ] | M | 0x00 – 0x7F | LEV_RT_ |
#3 | powerDownTime | C | 0x00 – 0xFF | PDT |
C:如果子函数参数设置为enableRapidPowerShutDown值(0x04),则此参数存在; |
9.3.3.2 肯定响应消息数据参数定义
表36定义了响应消息的数据参数。
定义 |
---|
resetType 该参数是请求消息中子函数参数6 - 0位的回显。 |
powerDownTime 该参数向客户端表示服务器在下电顺序中保持待机顺序的最小时间。 该参数的分辨率为每次计数一(1)秒。 以下值是有效的: ——0x00 - 0xFE: 0 - 254秒电源停机时间 ——0xFF:表示失败或时间不可用。 |
9.3.4 支持的否定响应码(NRC_)
本服务应执行以下否定响应代码。表37记录了每个响应代码发生的情况。如果错误场景适用于服务器,则应使用列出的否定响应。
NRC | 描述 | Mnemonic |
---|---|---|
0x12 | sub-functionNotSupported 如果子功能参数不被支持,则发送此NRC。 | SFNS |
0x13 | incorrectMessageLengthOrInvalidFormat 如果消息长度错误,则应发送此NRC。 | IMLOIF |
0x22 | conditionsNotCorrect 如果不满足ECUReset请求的标准,则应返回该NRC。 | CNC |
0x33 | securityAccessDenied 如果请求的重置是安全的,并且服务器没有处于解锁状态,则该NRC将被发送。 | SAD |
9.3.5消息流示例ECUReset
此子句指定了在服务器中成功执行ECUReset服务所需满足的示例条件。
服务器状态:点火= on,系统不应处于工作模式(例如,如果系统是发动机管理,发动机应关闭)。
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”来请求响应消息。
服务器在执行resetType操作之前,需要发送一个ECUReset肯定响应消息。
表38定义了ECUReset请求消息流示例#1。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | ECUReset Request SID | 0x11 | ER |
#2 | ResetType = hardReset, suppressPosRspMsgIndicationBit = FALSE | 0x01 | RT_HR |
表39定义了ECUReset肯定响应消息流示例#1。
Message direction | server →client (服务器 →客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | ECUReset Response SID | 0x51 | ERPR |
#2 | resetType = hardReset | 0x01 | RT_HR |
9.4 SecurityAccess (0x27)服务
9.4.1服务描述
此服务的目的是提供一种访问数据和/或诊断服务的方法,这些数据和/或诊断服务由于安全、排放或安全原因而受到访问限制。用于下载/上传例程或数据到服务器以及从服务器读取特定内存位置的诊断服务可能需要安全访问。不适当的例程或下载到服务器的数据可能会潜在地损坏电子设备或其他车辆部件,或危及车辆对排放、安全或安全标准的遵守。安全概念使用种子和键关系。
使用此服务的典型示例如下:
——客户请求“种子”,
——服务器发送“种子”,
——客户端发送“Key”(适用于收到的种子),
——服务器回应,“密钥”是有效的,它将解锁自己。
‘requestSeed’子函数参数值应始终为奇数,相同安全级别对应的’ sendKey’子函数参数值应等于’requestSeed’子函数参数值加1。
在任何时刻,只有一个安全级别是有效的。例如,如果与requestSeed 0x03相关联的安全级别处于活动状态,并且测试者请求成功地解锁了与requestSeed 0x01相关联的安全级别,那么此时只有与requestSeed 0x01相关联的安全级别所支持的安全功能将被解锁。先前由与requestSeed 0x03关联的安全级别解锁的任何其他安全功能将不再有效。安全级别编号是任意的,并不意味着级别之间有任何关系。
客户端应通过发送服务SecurityAccess ’ requestSeed '消息请求服务器“解锁”。服务器应通过使用服务SecurityAccess的“requestSeed”肯定响应消息发送“种子”来响应。然后,客户端应通过使用适当的服务SecurityAccess ’ sendKey '请求消息向服务器返回一个“密钥”号来进行响应。服务器将这个“键”与内部存储/计算的键进行比较。如果两个数字匹配,那么服务器将启用(“解锁”)客户端对特定服务/数据的访问,并使用服务SecurityAccess ’ sendKey '肯定响应消息指示。如果两个号码不匹配,则认为这是一次错误的访问尝试。无效密钥要求客户端使用SecurityAccess 'requestSeed’消息从头开始(有关安全访问处理细节的其他详细信息请参阅附件1)。
如果服务器支持安全,但是当收到SecurityAccess ’ requestSeed '消息时请求的安全级别已经解锁,该服务器应响应SecurityAccess ’ requestSeed '肯定响应消息服务,其种子值等于零(0)。对于当前锁定的给定安全级别,服务器永远不会发送全零种子。客户端应使用此方法通过检查非零种子来确定服务器是否为特定安全级别锁定。
在服务器上电/复位以及在一定次数的错误访问尝试之后,在服务器能够肯定响应来自客户端的服务SecurityAccess ’ requestSeed '消息之前,可能需要车辆制造商特定的时间延迟(参见下面的进一步描述)。如果支持此延迟计时器,则延迟将在车辆制造商指定的错误访问尝试数达到或服务器上电/重置并且先前执行的SecurityAccess服务由于单个错误访问尝试而失败时激活。如果服务器支持此延迟定时器,则在SecurityAccess服务sendKey成功执行后,服务器内部指示信息用于上电/复位时的延迟定时器调用将被服务器清除。如果服务器支持此延迟计时器,并且无法确定在上电/重置之前执行的SecurityAccess服务是否失败,则延迟计时器应在上电/重置后始终处于活动状态。只有当服务器在上电/重置时被锁定时才需要延迟。是否支持延时定时器,由车辆制造商选择。
进入安全系统的尝试不应妨碍正常的车辆通信或其他诊断通信。
提供安全性的服务器应支持在服务器被锁定时请求安全服务时拒绝消息。
在特定诊断会话期间请求的某些诊断功能/服务可能需要成功的安全访问序列。在这种情况下,应按下列顺序提供服务:
——diagnostic - sessioncontrol服务
——安全访问服务,
——安全诊断服务。
对于服务器中已启用的诊断会话(会话启动),允许使用不同的accessModes。
重要提示——服务器和客户端应满足7.5中规定的请求和响应消息行为。
9.4.2请求消息
9.4.2.1请求消息定义
表40定义了请求消息定义- sub-function = requestSeed。
A_Data byte | 参数名称 | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | SecurityAcces Request SID | M | 0x27 | SA |
#2 | sub-function = [ securityAccessType = requestSeed ] | M | 0x01, 0x03, 0x05, 0x07 – 0x7D | LEV_ SAT_RSD |
#3 : #n | securityAccessDataRecord[] = [ parameter#1 : parameter#m ] | U : U | 0x00 – 0xFF : 0x00 –0xFF | SECACCDR_ PARA1 : PARAm |
表41定义了请求消息定义- sub-function = sendKey。
A_Data byte | 参数名称 | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | SecurityAcces Request SID | M | 0x27 | SA |
#2 | sub-function = [ securityAccessType = sendKey ] | M | 0x02, 0x04, 0x06, 0x08 – 0x7E | LEV_SAT_SK |
#3 : #n | securityKey[] = [ key#1 (high byte) : key#m (low byte) ] | M : U | 0x00 – 0xFF : 0x00 – 0xFF | SECKEY_ KEY1HB : KEYmLB |
9.4.2.2请求消息子函数参数$Level (LEV_)的定义
子函数参数securityAccessType向服务器指示该服务正在进行的步骤、客户端希望访问的安全级别以及种子和密钥的格式。如果一个服务器支持不同的安全级别,每个级别应该由requestSeed值标识,它与sendKey值有固定的关系:
——" requestSeed = 0x01 “标识了” requestSeed = 0x01 “和” sendKey = 0x02 "之间的固定关系
——“requestSeed = 0x03”表示“requestSeed = 0x03”和“sendKey = 0x04”之间的固定关系。
表42中定义了requestSeed和sendKey (suppressPosRspMsgIndicationBit (bit7)未显示)的值。
Bits 6 – 0 | 描述 | Cvt | Mnemonic |
---|---|---|---|
0x00 | ISOSAEReserved 此值由本文档保留。 | M | ISOSAERESRVD |
0x01 | requestSeed RequestSeed,使用车辆制造商定义的安全级别。 | U | RSD |
0x02 | sendKey SendKey和车辆制造商定义的安全级别。 | U | SK |
0x03, 0x05, 0x07 – 0x41 | requestSeed RequestSeed具有由车辆制造商定义的不同安全级别。 | U | RSD |
0x04, 0x06, 0x08 – 0x42 | sendKey SendKey具有由车辆制造商定义的不同安全级别。 | U | SK |
0x43 – 0x5E | ISOSAEReserved 本文档保留此值以供将来定义。 | M | ISOSAERESRVD |
0x5F | ISO26021-2 values 在ISO 26021-2中定义的机载烟火装置生命周期结束激活的不同安全级别的请求种子。 | U | RSD |
0x60 | ISO26021-2 sendKey values SendKey具有不同级别的安全定义,用于ISO 26021-2中定义的机载烟火装置的生命周期结束激活。 | U | SK |
0x61 – 0x7E | systemSupplierSpecific 此值范围保留给系统供应商特定使用。 | U | SSS |
0x7F | ISOSAEReserved 本文档保留此值以供将来定义。 | M | ISOSAERESRVD |
9.4.2.3 请求消息数据-参数定义
表43定义了请求消息的数据参数。
定义 |
---|
securityKey (high and low bytes) 请求消息中的“Key”参数是由对应于特定“Seed”值的安全算法生成的值。 |
securityAccessDataRecord 此参数记录是用户可选的,用于在请求种子信息时向服务器传输数据。例如,它可以包含在服务器中验证的客户端的标识。 |
9.4.3肯定响应消息
9.4.3.1肯定响应消息定义
表44定义了肯定响应消息。
A_Data byte | Parameter Name | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | SecurityAccess Response SID | M | 67 | SAPR |
#2 | sub-function = [ securityAccessType ] | M | 00-7F | LEV_SAT_SK |
#3 : #n | securitySeed[] = [ seed#1 (high byte) : seed#m (low byte) ] | C : C | 0x00 – 0xFF : 0x00 – 0xFF | SECSEED_ SEED1HB : SEEDmLB |
C:该参数的存在取决于securityAccessType参数。如果securityAccessType参数表明客户端希望从服务器检索种子,则必须使用该参数。 | ||||
9.4.3.2 肯定响应消息数据参数定义
表45定义了响应消息的数据参数
定义 |
---|
securityAccessType 该参数是请求消息中子函数参数6 - 0位的回显。 |
securitySeed (high and low bytes) seed参数是服务器发送的一个数据值,客户端在计算访问安全性所需的密钥时使用它。只有在发送请求消息时,子函数设置为请求服务器种子的值时,securitySeed数据字节才会出现在响应消息中。 |
9.4.4支持的否定响应码(NRC_)
本服务应执行以下否定响应代码。表46中记录了每个响应代码发生的情况。如果错误场景适用于服务器,则应使用列出的否定响应。
NRC | Description | Mnemonic |
---|---|---|
0x12 | sub-functionNotSupported 如果子功能参数不被支持,则发送此NRC。 | SFNS |
0x13 | incorrectMessageLengthOrInvalidFormat 如果消息长度错误,则应发送此NRC。 | IMLOIF |
0x22 | conditionsNotCorrect 如果不满足安全访问请求的标准,则应返回该NRC。 | CNC |
0x24 | requestSequenceError 如果收到’ sendKey ‘子函数而没有首先收到’ requestSeed '请求消息,则发送。 | RSE |
0x31 | requestOutOfRange 如果用户可选的securityAccessDataRecord包含无效数据,则发送此NRC。 | ROOR |
0x35 | invalidKey 如果收到预期的’sendKey’子函数值,并且该键值与服务器内部存储/计算的键值不匹配,则发送。 | IK |
0x36 | exceededNumberOfAttempts 如果延迟定时器由于超过允许的错误访问尝试的最大次数而激活,则发送。 | ENOA |
0x37 | requiredTimeDelayNotExpired 如果延迟计时器处于活动状态并且请求被传输,则发送。 | RTDNE |
9.4.5消息流示例SecurityAccess
9.4.5.1假设
对于下面给出的消息流示例,如果服务器处于“锁定”状态,则必须满足以下条件才能成功解锁服务器:
——请求种子的子函数:0x01 (requestSeed)
——发送密钥的子函数:0x02 (sendKey)
——服务器的种子(2字节):0x3657
——服务器的密钥(2字节):0xC9A9(例如2的种子值的补码)
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
9.4.5.2示例#1 -服务器处于“锁定”状态
9.4.5.2.1步骤#1:请求种子
表47定义了SecurityAccess请求消息流示例#1 -步骤#1。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | SecurityAccess Request SID | 0x27 | SA |
#2 | SecurityAccessType = requestSeed, suppressPosRspMsgIndicationBit = FALSE | 0x01 | SAT_RSD |
表48定义了SecurityAccess肯定响应消息流示例#1 -步骤#1。
Message direction | server →client (服务器 →客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | SecurityAccess Response SID | 0x67 | SAPR |
#2 | securityAccessType = requestSeed | 0x01 | SAT_RSD |
#3 #4 | securitySeed [ byte#1 ] = seed#1 (high byte) securitySeed [ byte#2 ] = seed#2 (low byte) | 0x36 0x57 | SECHB SECLB |
9.4.5.2.2第二步:发送密钥
表49定义了SecurityAccess请求消息流示例#1 -步骤#2。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | SecurityAccess Request SID | 0x27 | SA |
#2 | securityAccessType = sendKey, suppressPosRspMsgIndicationBit = FALSE | 0x02 | SAT_SK |
#3 #4 | securitySeed [ byte#1 ] = seed#1 (high byte) securitySeed [ byte#2 ] = seed#2 (low byte) | 0xC9 0xA9 | SECKEY_HB SECKEY_LB |
表50定义了SecurityAccess肯定响应消息流示例#1 -步骤#2。
Message direction | server →client (服务器 →客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | SecurityAccess Response SID | 0x67 | SAPR |
#2 | securityAccessType = sendKey | 0x02 | SAT_SK |
9.4.5.3示例#2 -服务器处于“未锁定”状态
9.4.5.3.1步骤#1:请求种子
表51定义了SecurityAccess请求消息流示例#2 -步骤#1。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | SecurityAccess Request SID | 0x27 | SA |
#2 | securityAccessType = requestSeed, suppressPosRspMsgIndicationBit = FALSE | 0x01 | SAT_RSD |
表52定义了SecurityAccess肯定响应消息流示例#2 -步骤#2。
Message direction | server →client (服务器 →客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | SecurityAccess Response SID | 0x67 | SAPR |
#2 | securityAccessType = requestSeed | 0x01 | SAT_RSD |
#3 #4 | securitySeed [ byte#1 ] = seed#1 (high byte) securitySeed [ byte#2 ] = seed#2 (low byte) | 0x00 0x00 | SECHB SECLB |
9.5通信控制(0x28)服务告警解释
9.5.1服务描述
此服务的目的是开启/关闭服务器的某些消息的传输和/或接收(例如应用程序通信消息)。
重要提示——服务器和客户端应满足7.5中规定的请求和响应消息行为。
9.5.2请求消息
9.5.2.1请求消息定义
表53定义了请求消息。
A_Data byte | 参数名称 | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | CommunicationControl Request SID | M | 0x28 | CC |
#2 | sub-function = [ controlType ] | M | 0x00 – 0xFF | LEV_CTRLTP |
#3 | communicationType | M | 0x00 – 0xFF | CTP |
#4 | nodeIdentificationNumber (high byte) | C^a | 0x00 – 0xFF | NIN |
#5 | nodeIdentificationNumber (low byte) | C^a | 0x00 – 0xFF | NIN |
a C参数的存在要求controlType为0x04或0x05。 |
9.5.2.2请求消息子函数参数$Level (LEV_)的定义
子函数参数controlType包含有关服务器如何修改通信类型的信息,该通信类型引用于通信类型参数(suppressPosRspMsgIndicationBit(位7),未在表54中显示)。
Bits 6 – 0 | Description | Cvt | Mnemonic |
---|---|---|---|
0x00 | enableRxAndTx 该值表示对指定的communicationType允许接收和发送消息。 | U | ERXTX |
0x01 | enableRxAndDisableTx 该值表示对于指定的communicationType,允许接收消息,禁止发送消息。 | U | ERXDTX |
0x02 | disableRxAndEnableTx 该值表示对于指定的communicationType,不允许接收消息,允许发送消息。 | U | DRXETX |
0x03 | disableRxAndTx 该值表示对指定的communicationType禁止消息的接收和发送。 | U | DRXTX |
0x04 | enableRxAndDisableTxWithEnhancedAddressInformation 该值表示寻址总线主站应将相关的子总线段切换到仅诊断调度模式。 | U | ERXDTXWEAI |
0x05 | enableRxAndTxWithEnhancedAddressInformation 该值表示寻址总线主机应将相关的子总线段切换到应用程序调度模式。 | U | ERXTXWEAI |
0x06 – 0x3F | ISOSAEReserved 此值范围由本文档保留,以供将来定义。 | M | ISOSAERESRVD |
0x40 – 0x5F | vehicleManufacturerSpecific 此值范围保留给特定的汽车制造商使用。 | U | VMS |
0x60 – 0x7E | systemSupplierSpecific 此值范围保留给系统供应商特定使用。 | U | SSS |
0x7F | ISOSAEReserved 本文档保留此值以供将来定义。 | M | ISOSAERESRVD |
9.5.2.3请求消息数据参数定义
表55定义了请求消息的数据参数。
定义 |
---|
communicationType 该参数用于引用需要控制的通信类型。communicationType参数是一个位码值,允许同时控制多种通信类型。(通信类型数据参数编码见附件B.1) |
nodeIdentificationNumber 这个2字节的参数用于识别车辆中某个子网上的节点,该节点不能使用较低的OSI层1到6的寻址方法进行寻址。只有当子函数参数controlType被设置为0x04或0x05时,这个参数才会出现(参见附件B.4关于nodeIdentificationNumber数据参数的编码)。 |
9.5.3肯定响应消息
9.5.3.1肯定响应消息定义
表56定义了肯定响应消息。
A_Data byte | Parameter Name | Cvt | Byte Value | Mnemonic |
---|---|---|---|---|
#1 | CommunicationControl Response SID | M | 0x68 | CCPR |
#2 | sub-function = [ controlType ] | M | 0x00 – 0x7F | LEV_CTRLTP |
9.5.3.2肯定响应消息数据参数定义
表57定义了肯定响应消息的数据参数。
定义 |
---|
controlType |
该参数是请求消息中子函数参数6 - 0位的回显 |
9.5.4支持的否定响应码(NRC_)
本服务应执行以下否定响应代码。表58记录了每个响应代码发生的情况。如果错误场景适用于服务器,则应使用列出的否定响应。
NRC | Description | Mnemonic |
---|---|---|
0x12 | sub-functionNotSupported 如果子功能参数不被支持,则发送此NRC。 | SFNS |
0x13 | incorrectMessageLengthOrInvalidFormat 如果消息长度错误,则应发送此NRC。 | IMLOIF |
0x22 | conditionsNotCorrect 当服务器处于关键的正常模式活动,因此无法禁用/启用所请求的通信类型时使用。 | CNC |
0x31 | requestOutOfRange 如果服务器在communicationType或nodeIdentificationNumber参数中检测到错误,则使用此响应代码。 | ROOR |
9.5.5消息流示例CommunicationControl(禁用网管消息传输)
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
表59定义了CommunicationControl请求消息流示例。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | CommunicationControl Request SID | 0x28 | CC |
#2 | controlType = enableRxAndDisableTx, suppressPosRspMsgIndicationBit = FALSE | 0x01 | ERXTX |
#3 | communicationType = network management | 0x02 | NWMCP |
表60定义了CommunicationControl肯定响应消息流示例。
Message direction | server →client (服务器 →客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | CommunicationControl Response SID | 0x68 | CCPR |
#2 | ControlType | 0x01 | CTRLTP |
9.5.6消息流示例通信控制(将连接地址为0x000A的节点的远程网络切换为仅诊断调度模式)
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
表61定义了CommunicationControl请求消息流示例。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | CommunicationControl Request SID | 0x28 | CC |
#2 | controlType = enableRxAndDisableTxWithEnhancedAddressInformation, suppressPosRspMsgIndicationBit = FALSE | 0x04 | ERXTX |
#3 | communicationType = normal messages | 0x01 | NMCP |
#4 | nodeIdentificationNumber (high byte) | 0x00 | NIN |
#5 | nodeIdentificationNumber (low byte) | 0x0A | NIN |
表62定义了CommunicationControl肯定响应消息流示例。
Message direction | server →client (服务器 →客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | CommunicationControl Response SID | 0x68 | CCPR |
#2 | controlType = enableRxAndDisableTxWithEnhancedAddressInformation, suppressPosRspMsgIndicationBit = FALSE | 0x04 | ERXTX |
9.5.7消息流示例通信控制(切换到应用程序调度模式,增强地址信息,连接到子网的节点0x000A被寻址)
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
表63定义了CommunicationControl请求消息流示例。
Message direction | client → server(客户端 →服务器) |
---|---|
Message Type | Request(请求) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | CommunicationControl Request SID | 0x28 | CC |
#2 | controlType = enableRxAndTxWithEnhancedAddressInformation, suppressPosRspMsgIndicationBit = FALSE | 0x05 | ERXTX |
#3 | communicationType = normal messages | 0x01 | NMCP |
#4 | nodeIdentificationNumber (high byte) | 0x00 | NIN |
#5 | nodeIdentificationNumber (low byte) | 0x0A | NIN |
表64定义了CommunicationControl肯定响应消息流示例。
Message direction | server →client (服务器 →客户端) |
---|---|
Message Type | Response(响应) |
A_Data byte | 描述(所有值都是十六进制) | Byte Value | Mnemonic |
---|---|---|---|
#1 | CommunicationControl Response SID | 0x68 | CCPR |
#2 | controlType = enableRxAndTxWithEnhancedAddressInformation, suppressPosRspMsgIndicationBit = FALSE | 0x05 | ERXTX |
|