UDS(ISO14229-2006) 理解(No.7 应用层协议)
7.1定义
应用层协议通常作为确认消息的传输,意味着从客户端发送的每一个请求都将有由服务器端产生的与之相对的响应。
唯一的例外在于:例如使用了功能寻址方式,或者该请求/指示没有指定生成响应/确定的少数情况下。为了减轻不必要的消息对系统造成的压力,在个别场合即使服务器处理请求诊断服务失败了也不发送否定响应。
应用层协议是与会话层协议并行执行,这样,即使客户端等待上一个请求的响应时,也将会保持正确的会话层校时功能(例如:发送一个TesterPresent以使其他服务器的诊断会话持续下去;具体实施细则取决于所使用的数据链路层)。
7.2 PDU(Protocol Data Unit)规范
A_PDU(应用层协议数据单元)直接建立于A_SDU(应用层服务数据单元)和层专属控制信息:A_PCI(Application layer Protocol Control Information应用层服务控制信息)。A_PDU一般格式:
A_PDU (
SA,
TA,
TA_type,
[RA,]
A_Data = A_PCI +
[parameter 1, ...]
)
条件:
——“SA, TA, TA_type, RA”在相同A_SDU中使用相同的参数。
——A_Data是一个定义了每一个应用层服务的字节序列字符串。 A_Data字符串以A_PCI起头,后接A_SDU的全部服务专属参数,以此来指定每一个服务。部分参数用方括号括起说明这部分参数可以为空。
7.3 应用控制信息
A_PCI有两个可以替换的格式,具体取决于调用哪种类型的服务原语和结果参数的值。对于所有的服务请求和Result=positive的服务响应确认/服务确认,将应用下面的定义:
A_PCI(
SI
)
条件:当“SI”是服务定义的参数。
对服务响应确认和服务确认,当Result=negative时,将应用以下的定义:
A_PCI(
NR_SI,
SI
)
条件:
——“NR_SI”是特殊的参数用以定义否定服务响应/服务确认。
——“SI”是服务标识符参数。
注释:对利用响应消息类型#2所定义的服务ReadDataByPeriodicIdentifier (2A hex,以周期标识读取数据,参考10.5)的周期性消息传输,当前无A_PCI存在于应用层协议数据单元(A_PDU)。
7.3.1 服务标识符(SI)
类型:1 byte无符号整型值
值域:00-FF16,根据表2定义的16进制数值
表2——服务标识(SI)值
服务标识符(hex) |
服务类型(6 bit) |
定义方 |
00 – 0F |
OBD服务请求 |
ISO 15031-5 |
10 – 3E |
ISO 14229服务请求 |
ISO 14229 |
3F |
不适用 |
文档保留 |
40 – 4F |
OBD服务响应 |
ISO 15031-5 |
50 – 7E |
ISO 14229服务肯定响应 |
ISO 14229 |
7F |
服务否定相应标识 |
ISO 14229 |
80 |
不适用 |
ISO 14229预留 |
81 – 82 |
不适用 |
ISO 14229预留 |
83 – 88 |
ISO 14229 服务请求 |
ISO 14229 |
89 – 9F |
服务请求 |
根据需要预留将来扩展 |
A0 – B9 |
服务请求 |
车辆生产商定义 |
BA – BE |
服务请求 |
系统供应商定义 |
BF |
不适用 |
文档预留 |
C0 |
不适用 |
ISO 14229预留 |
C1 – C2 |
不适用 |
ISO 14229预留 |
C3 – C8 |
ISO 14229服务肯定响应 |
ISO 14229 |
C9 – DF |
服务肯定响应 |
根据需要预留将来扩展 |
E0 – F9 |
服务肯定响应 |
车辆生产商定义 |
FA – FE |
服务肯定响应 |
系统供应商定义 |
FF |
不适用 |
文档预留 |
注意:在服务标识(SI)请求消息和服务标识肯定响应消息之间是一对一的,16进制SI值第6 bit指示服务类别:所有请求消息SI bit 6 = 0,所有响应消息SI bit 6 =1。除了响应消息类别#2的服务ReadDataByPeriodicIdentifier(2A hex,参见10.5节)
描述:
SI被服务原语调用时用于对制定的服务进行编码,每一个请求服务都被分配一个唯一的SI值,每一个肯定响应的服务也都被分配一个相对应的唯一SI值。
服务标识(SI)被用来表示从应用层发送到下层(以及从下层返回)的A_Data数据串的服务。
7.3.2否定响应服务标识(NR_SI)
类型:1 byte无符号整型值
固定值:7F (16进制)
描述:
NR_SI是特为标识否定服务响应/否定服务确认的特殊参数,是A_PCI中的一部分:否定响应/确认的信息。
注意:NR_SI值相对应于SI值;为使A_Data编码和解码方便,NR_SI的值不能用于SI。
7.4 否定响应/确认服务原语
每个诊断服务都具有根据表3 A_DATA字节中指定的否定响应/否定确认消息。第一个A_DATA字节(A_PCI.NR_SI)经常指定否定响应服务标识,第二个A_DATA(A_PCI.SI)作为与否定响应对应的服务请求/指示消息的复制。
表3—否定响应A-PDU
A_PDU parameter |
Parameter name |
Cvt |
Hex value |
Mnemonic |
SA |
Source Address |
Ma |
xx |
SA |
TA |
Target Address |
M |
xx |
TA |
TA_type |
Target Address type |
M |
xx |
TA Type |
RA |
Remote Address(optional) |
Cb |
xx |
RA |
|
||||
A_Data.A_PCI.NR_SI |
Negative Response Service Id |
M |
7F |
SIDNR |
A_DATA.A_PCI.SI |
<Service Name> Request Service Id |
M |
xx |
SIDRQ |
A_Data.parameter1 |
ResponseCode |
M |
xx |
NRC_ |
aM(Mandatory)如果发出否定响应A_PDU的情况下这些A_PDU参数会出现。 b C(Conditional)RA(Remote Address) PDU参数只出现在远程地址的环境下。 |
注意 A_DATA代表否定响应消息的消息数据字节序列
参数response code(响应码)用在否定响应消息中用于指示诊断服务失败或者无法及时完成的原因。值定义在A.1中。
7.5 服务响应实施细则
7.5.1 一般定义
在执行一项服务时,一下小姐指定服务器的行为。服务器和客户端应遵循这些执行规则。
小节图例:7.5.2,7.5.3和7.5.4
缩写 描述
SuppressPosRspMsgIndicationBit TRUE=服务器应不发送肯定响应消息
FALSE=服务器应发送肯定或否定响应消息
PosRsp 肯定响应消息缩写
NegRsp 否定响应消息缩写
NoRsp 未发送肯定或否定响应消息
NRC 否定响应码缩写
ALL 服务器支持的所有请求数据参数(没有子函数参数的服务)的客户端请求信息
at list 1 服务器支持至少一个客户端请求数据参数(没有子函数参数服务)
NONE 服务器支持无客户端请求数据参数(没有子函数参数服务)
服务器不论寻址模式(物理、功能寻址类型)都应支持该诊断服务列表。
重点——按照上表的要求,SNS1、SFNS2和ROOR3的否定响应消息与否定响应码,当请求消息使用功能寻址方式的情况下不应被传输。
注释:1 SNS(serviceNotSupported), 2 SFNS(subFunctionNotSupported), 3 ROOR(requestOutOfRange)
7.5.2 带有子函数参数的请求消息和服务器响应动作
7.5.2.1 功能寻址客户端请求消息
在本节指定的服务响应行为,被支持客户端物理寻址请求消息子函数参数的每个服务的服务描述所引用。
表4展示可能的物理寻址对话格式。
表4——带子函数参数的物理寻址请求消息和服务器响应行为
服务器示例# |
客户端请求消息 |
服务器功能 |
服务器响应 |
服务器响应注释 |
||||
寻址格式 |
子函数(抑制PosRsp指示位) |
支持服务ID |
支持子函数 |
支持数据参数(仅在适用情况) |
消息 |
否定: |
||
1 |
物理 |
FLASE(bit=0) |
YES |
YES |
At least 1 |
PosRsp |
-- |
服务器发送肯定响应 |
2 |
-- |
NegRsp |
NRC=xx |
服务器否定响应,因为读请求消息的数据参数时出现错误。 |
||||
3 |
NO |
-- |
-- |
NRC=SNS |
带有NRC 11 hex的否定响应 |
|||
4 |
YES |
NO |
-- |
NRC=SFNS |
带有NRC 12 hex的否定响应 |
|||
5 |
TRUE(bit=1) |
YES |
YES |
At least 1 |
NoRsp |
-- |
服务器未发送响应 |
|
6 |
-- |
NegRsp |
NRC=xx |
服务器否定响应,因为读取请求消息的数据参数时出现错误 |
||||
7 |
NO |
-- |
-- |
NRC=SNS |
带有NRC 11 hex的否定响应 |
|||
8 |
YES |
NO |
-- |
NRC=SFNS |
带有NRC 12 hex的否定响应 |
下列描述出物理寻址情况下在客户端发出带有子函数的请求消息后服务器的响应用例:
1)服务发出积极响应消息,因为该服务标识和子函数参数是支持客户端带有指示响应消息的请求。
2)服务器发送否定响应消息(例如IMLOIF:不正确的消息长度或消息格式)因为客户端请求的服务标识和子函数参数被支持,但是在处理子函数时发生一些其他的错误(例如:请求消息的服务标识和子函数参数)。
3)服务器发送了带有否定响应码SNS(service not supported)的否定响应消息,是因为客户端请求的服务标识符被响应消息所指示为不支持。
4)服务器发送了带有否定响应码SFNS(sub-function not supported)的否定消息,是因为响应消息指示了服务标识符被支持,而客户端请求的子函数参数不被支持。
5)服务器发送无响应消息,因为服务标识和子函数参数被客户端的请求(带有无响应消息的指示)支持。如果使用否定响应码RCRRP(requestCorrectlyReceivedResponsePending,请求正确接收,响应挂起),最终的响应要赋予独立的suppressPosRspMsgIndicationBit值。
6)和2)效果相同(例如:发送否定响应消息)因为suppressPosRspMsgIndicationBit(抑制肯定响应消息标识)忽任何需要在其上发送物理寻址请求消息回执的否定响应。
7)和3)效果相同(例如,发送否定响应消息)因为suppressPosRspMsgIndicationBit(抑制肯定响应消息标识)忽任何需要在其上发送物理寻址请求消息回执的否定响应。
8)和4)效果相同(例如,发送否定响应消息)因为suppressPosRspMsgIndicationBit(抑制肯定响应消息标识)忽任何需要在其上发送物理寻址请求消息回执的否定响应。
7.5.2.2 功能性寻址客户端请求消息
服务器请求行为在本节中引用每个服务的服务描述,这些服务是支持在功能寻址模式下子函数参数请求消息从客户端接收的。
表5——带有子函数参数和服务器相应动作的功能寻址请求消息
服务器示例# |
客户端请求消息 |
服务器功能 |
服务器响应 |
服务器响应注释 |
||||
寻址格式 |
子函数(抑制肯定响应指示位) |
支持服务ID |
支持子函数 |
支持数据参数(仅在适用情况) |
消息 |
否定: |
||
1 |
功能 |
FLASE(bit=0) |
YES |
YES |
At least 1 |
PosRsp |
-- |
服务器发送肯定响应 |
2 |
At least 1 |
At least 1 |
NRC=xx |
服务器发送否定响应,因为读取请求消息的数据参数时发生错误 |
||||
3 |
None |
NoRsp |
-- |
服务器未发送相应 |
||||
4 |
NO |
-- |
-- |
-- |
服务器未发送相应 |
|||
5 |
YES |
NO |
-- |
-- |
服务器未发送相应 |
|||
6 |
TRUE(bit=1) |
YES |
YES |
At least 1 |
NoRsp |
-- |
服务器未发送相应 |
|
7 |
At least 1 |
NegRsp |
NRC=xx |
服务器发送否定响应,因为读取请求消息的数据参数时出现错误 |
||||
8 |
None |
|
-- |
服务器未发送相应 |
||||
9 |
NO |
-- |
-- |
-- |
服务器未发送相应 |
|||
10 |
YES |
NO |
-- |
-- |
服务器未发送相应 |
功能寻址模式下,带有子函数的客户端请求消息的服务器响应用例:
1)服务器发送肯定相应消息因为客户端请求(带有响应消息标识)支持该服务标识和子函数参数。
2)服务器发送否定响应消息(例如 IMLOIF:incorrectMessageLengthOrIncorrectFormat)因为服务标识符和子函数参数被客户端请求支持,但某些其他错误发生在子函数执行过程中(,例如根据请求消息的服务标识符和子函数参数的长度错误)。
3)服务器发送无响应消息,因为否定响应码ROOR(所以服务器标识requestOutOfRange因为服务标识和子函数参数被支持,但是一个必要的数据参数不被客户端请求所支持)在功能寻址请求消息的情况下总是被抑制。supressPosRspMsgIndicationBit抑制肯定响应消息标识位在这种情况下不受影响。
4)服务器发送无响应消息,因为否定响应码SNS(服务器标识serviceNotSupported,因为服务标识不被客户端请求支持)在功能寻址请求消息的情况下总是被抑制。supressPosRspMsgIndicationBit抑制肯定响应消息标识位不受此影响。
5)服务器发送无响应出消息,因为否定响应码SFNS(服务器标识subFunctinNotSupported因为服务标识被客户端请求支持,而子函数参数不被其支持)通常在功能寻址请求的状况下被抑制。supressPosRspMsgIndicationBit抑制肯定响应标识位不受此影响。
6)服务器发送无响应消息因为服务标识和子函数参数被客端请求(带有无响应消息的指示)支持。
注释:如果使用否定响应码RCRRP(requestCorrectlyReceivedResponsePending,请求正确接收,响应挂起),一个最终响应赋予独立的suppressPosRspMsgIndicationBit(抑制肯定响应标识位)值。
7)同2)(例如发送否定响应)因为suppressPosRspMsgIndicationBit被所有否定响应忽略。如果请求为功能寻址方式,此项值为TRUE。
8)同3)(例如发送无响应消息)因为否定响应码ROOR(requestOutOfRange,这是由服务器确定的,因为服务标识和子函数参数受到客户端请求支持,但是一个必要的数据参数不被支持)通常在功能寻址请求消息情况下被抑制。supressPosRspMsgIndicationBit不受此影响。
9)同4)(例如发送无响应消息)因为否定响应码SNS(被服务器标记serviceNotSupported,因服务标识符不被客户端请求所支持)在功能寻址请求消息的情况下通常被抑制。
10)同5)(例如发送无响应消息)因为否定响应码SFNS(服务器标识subFunctionNotSupported因服务标识符不被客户端请求消息支持,而子函数参数不被客户端请求消息所支持。)在功能寻址请求消息的情况下通常被抑制。suppressPosRspMsgIndicationBit一致肯定响应消息标识符不受此影响。
7.5.3 不包含子函数参数和服务器响应行为的请求参数
7.5.3.1物理寻址的客户端请求
本节每个服务(不支持子函数参数,但一个从客户端接收物理寻址请求消息的数据参数被支持)的服务描述指定的服务器响应动作。
表6体现了可能的物理寻址通信格式
表6——物理寻址不包含子函数参数和服务响应行为的请求消息
服务器示例# |
客户端请求 |
服务器功能 |
服务器响应 |
服务器响应注解 |
||
寻址方式 |
支持服务ID |
支持参数 |
消息 |
否定: |
||
1 |
物理 |
YES |
ALL |
PosRsp |
-- |
服务器发送肯定响应 |
2 |
At least 1 |
-- |
服务器发送肯定响应 |
|||
3 |
Atleast1, |
NegRsp |
NRC=xx |
服务器发送否定响应,因为读取请求消息参数数据发生错误 |
||
4 |
NONE |
NRC=ROOR |
否定响应 NRC 31 hex |
|||
5 |
NO |
-- |
NRC=SNS |
否定响应 NRC 11 hex |
下面描述了服务器相呼应示例,在物理寻址模式下,客户端带有无子函数数据参数和服务标识。
1) 服务器发送肯定相应消息,因为服务标识符和全部数据参数均被客户端请求消息所支持。
2) 服务器发送肯定相应消息,因为服务标识和一个单独的数据参数被客户端请求消息所支持。
3) 服务器发送否定响应消息(例如IMLOIF: incorrectMessageLengthOrIncorrectFormat错误的消息长度或错误的格式)因为服务标识、多于等于一个的数据参数被客户端请求消息所支持。但是在运行服务的时候出现一些其他的错误(例如错误的请求消息长度)。
4) 服务器发送否定响应消息,带有否定响应码ROOR(requestOutOfRange请求越界),因为客户端请求消息支持该服务标识,但所有的请求数据参数均不被支持。
5) 服务发送否定响应消息,带有否定响应码SNS(serviceNotSupport服务不支持),请求消息不支持服务标识。
7.5.3.2 功能殉职客户端请求消息
在本节指定的服务器响应行为,在功能寻址请求消息的情况下被每个服务的服务描述所引用,这些服务不支持一个子函数参数,但是支持一个数据参数。
表7展示了可能的功能寻址下的通信格式。
表7——功能寻址请求消息,不带有子函数参数和服务器相应行为
服务器示例# |
客户端请求消息 |
服务器功能 |
服务器响应 |
服务器响应注解 |
||
寻址模式 |
支持服务ID |
支持参数 |
消息 |
否定: |
||
1 |
功能性 |
YES |
YES |
PosRsp |
-- |
服务器发送肯定响应 |
2 |
At least 1 |
-- |
服务器发送肯定响应 |
|||
3 |
At least 1, more than 1,or ALL |
NegRsp |
NRC=xx |
服务器发送否定响应,因为读取请求消息的数据参数错误 |
||
4 |
NONE |
NoRsp |
-- |
服务器不能发送相应 |
||
5 |
NO |
-- |
-- |
服务器不能发送相应 |
下面描述了服务器响应示例,在功能寻址情况下客户端不带有子函数的请求消息(数据参数遵循服务标识符)。
1) 服务器发送肯定响应消息,因为服务标识符和单独数据参数被客户端请求消息所支持。
2) 服务器发送肯定响应出消息,因为服务标识和至少一个数据参数被客户端请求消息抠支持。
3) 服务器发送否定响应消息(例如IMLOIF:incorrectMessageLengthOrIncorrectFormat)因为服务标识符被至少一个数据参数被客户端请求消息支持,但是一些其他的错误发生在服务执行过程中(例如错误的请求消息长度)。
4) 服务器发送无响应消息因为否定响应码ROOR(requestOutOfRange,由于服务标识被客户端请求所支持,但是没有请求数据参数被支持的情况下产生)在功能殉职请求时通常被抑制。
5) 服务器发送无响应消息因为否定响应码SNS(serviceNotSupported,因为服务标识不被客户端请求所支持,而被服务器标识该否定响应码。)通常在功能寻址模式请下被抑制。
7.5.4 服务器响应行为伪代码示例
接下来的服务器为代码示例用来描述:服务器当正在接收客户端请求时应执行的步骤。
SWITCH (A_PDU.A_Data.A_PCI.SI)
{
CASE Service_with_subFunction:
/* 测试,当支持服务子函数*/
SWITCH
(A_PDU.A_Data.A_Data.Parameter1 & 0x7F) /*
获取子函数参数,不包括第7bit */
{
CASE subFunction_00: /* 测试,如果支持子函数参数值*/
IF (message_length ==
expected_subFunction_message_length) THEN
: /*
准备响应消息 */
responseCode = positiveResponse; /*
响应消息;赋值内部 NRC = 0x00 */
ELSE
responseCode = IMLOIF; /*
NRC 0x13: incorrectMessageLengthOrInvalidFormat */
ENDIF
BREAK;
CASE subFunction_01: /* 测试,当支持子函数参数值 */
: /*
预备响应消息*/
responseCode = positiveResponse; /*
肯定响应消息; 赋值内部 NRC = 0x00 */
:
:
CASE subFunction_127: /* 测试,如果支持子函数参数*/
: /*
预备响应消息 */
responseCode = positiveResponse; /* 肯定响应消息; 设置内部 NRC = 0x00 */
BREAK;
DEFAULT:
responseCode = SFNS; /*
NRC 0x12: subFunctionNotSupported */
}
suppressPosRspMsgIndicationBit =
(A_PDU.A_Data.Parameter1 & 0x80); /* 结果为0x00 或 0x80 */
IF ( (suppressPosRspMsgIndicationBit)
&& (responseCode == positiveResponse) ) THEN
/* 测试,如果需要积极响应和响应码为肯定的0x00 */
suppressResponse = TRUE; /* 标记不发送肯定响应消息 */
ELSE
suppressResponse = FALSE; /* 发送相应消息标记 */
ENDIF
BREAK;
CASE Service_without_subFunction: /* 测试,如果服务不包括子函数 */
suppressResponse = FALSE; /* 发送相应消息标记 */
IF (message_length ==
expected_message_length) THEN
IF (A_PDU.A_Data.Parameter1
== supported) THEN
/*
测试,如果一支持以下SID的数据参数*/
: /*
read data and 预备响应消息 */
responseCode =
positiveResponse; /* 肯定响应消息;设置内部NRC = 0x00 */
ELSE
responseCode = ROOR; /* NRC
0x31: requestOutOfRange */
ENDIF
ELSE
responseCode = IMLOIF; /*
NRC 0x13: incorrectMessageLengthOrInvalidFormat */
ENDIF
BREAK;
DEFAULT:
responseCode = SNS; /* NRC 0x11:
serviceNotSupported */
}
IF (A_PDU.TA_type == functional && ((responseCode == SNS) ¦¦
(responseCode == SFNS) ¦¦ (responseCode == ROOR))) THEN
/* 抑制否定响应消息 */
ELSE
IF (suppressResponse == TRUE) THEN
/* suppress 肯定响应消息 */
ELSE
/*发送肯定或否定响应*/
ENDIF
ENDIF
当请求消息使用功能寻址,在接收请求消息后,对PDU分析结果带有NRC=SNS(服务不支持)、NRC=SFNS(子函数不支持)或者NRC=ROOR(请求越界)的情况下,应当不实施带有否定响应码(NRC)78 hex的否定响应消息和RCRRP(请起去正确接收,响应挂起)。
7.5.5 具有物理和功能寻址的多个并发请求消息
在同一时间,一个服务器实现只有一个可处理请求的诊断协议实例。接收请求消息(不论功能寻址或是物理寻址)的规则是占用这个诊断协议实例资源,直至请求处理完成(完成是指最后一条响应发出,或处理完不需要响应的请求)。
以下两种特殊情况需要特殊对待:
1)用于客户端维持先前针对若干服务器会话的保持在线逻辑。保持在线逻辑为功能寻址的TesterPresent消息定义,该消息中SPRMIB=true,并由旁路逻辑进行处理。该特性取决于服务器非阻塞地处理该消息,并能保证其他跟随的寻址消息通过。
2)如果服务器支持若干合规的诊断请求,且其中一个诊断请求在非规定的服务活动期间(如强诊断)被服务器接收,这时该活动的服务会被中止执行,启动默认会话,并且执行合规的诊断服务。在编程会话中不适用此要求。
7.5.6 数据标识(DID)的大小
数据标识dataIdentifier即DID,在ISO 14229整个规范中都占2 Byte大小。
如果一个规范基于ISO14229但与本规范不匹配,则需指定DID参数的大小。