UDS 14229-1定义的请求的响应行为

news2024/11/18 18:23:55

UDS服务响应规则

    • 重要提示
    • 服务器一般响应行为
      • 包含子功能的请求响应行为
      • 物理寻址请求
      • 功能寻址请求
    • 没有子功能参数的服务响应行为
      • 物理寻址客户端请求
      • 功能寻址客户端请求
    • 伪代码示例

重要提示

服务应当支持物理寻址方式请求,部分服务也支持功能寻址方式请求。在功能寻址请求的方式下有些时候不需要回复否定响应:

  • ServiceNotSupport
  • ServiceNotSupportInActiveSession
  • SubFunctionNotSupport
  • SubFunctionNotSupportInActiveSession
  • requstOutOfRange

服务器一般响应行为

以下响应行为是从接受到请求开始验证的,服务器响应分为三个部分:

	**强制数据**:				评估每个请求消息
	**可选数据**:				根据需要选择性评估请求消息
**制造商/供应商规定**:			根据制造商/供应商的规定评估具体信息

服务器一般响应行为描述
可选验证 :检查当前服务器如果处于忙碌状态,回复NRC 0x21,否则,继续向下验证;
制造商指定验证 :根据制造商规定验证对应的请求信息是否满足,并根据需设置相应的NRC,否则,继续向下验证;
强制验证 :请求的服务是否支持,(判断当前的服务器是否设置了对此SID的支持,不是UDS是否支持),如果不支持,回复NRC 0x11,否则继续向下验证;
强制验证 :验证当前的session是否支持请求的服务,如果不支持,回复NRC 0x7F,否则继续向下验证;
可选验证 :根据服务情况选择是否需要验证SA,如果SA验证未通过,回复NRC 0x33,否则继续向下验证;
供应商指定验证 :根据供应商规定验证对应的请求信息是否满足,并根据需设置相应的NRC,否则,继续向下验证;
一般性响应行为到此,下面有两个分支:

  • 包含子功能的服务(并不包括SID 0x31)
  • 其他服务

子功能占据一个Byte,包含bit0-bit7,其中bit7是正响应抑制位,当bit7=1时,正响应会被抑制,但是如果中间服务器发送了0x78的否定响应,也需要发送最终响应。即0x78需要发送的最终响应效果>正响应抑制位的抑制效果

包含子功能的请求响应行为

在这里插入图片描述
强制验证 :检查请求的服务是否满足最小长度,不满足回复NRC 0x13,否则继续向下验证;(至少两个字节,包含SID和SF参数)
强制验证 :检查此服务是否支持请求的子功能,不支持回复NRC 0x12,否则继续向下验证;(检查是否设置了此SF)
强制验证 :检查当前会话是否支持请求的子功能,不支持回复NRC 0x7E,否则继续向下验证;
可选验证 :检查当前的SA是否支持请求的子功能,不支持回复NRC 0x33,否则继续向下验证;
可选验证 :检查子功能的顺序是否正确(eg:27服务先请求seed再比较key),不正确回复NRC 0x24,否则继续向下验证;
制造商/供应商指定 :根据规定验证对应的请求信息是否满足,并根据需设置相应的NRC,否则,继续向下验证;

物理寻址请求

带子功能的物理寻址请求响应行为。
在这里插入图片描述
a:物理寻址,不抑制正响应,服务和子功能都支持,参数至少有一个可用时,服务器回复肯定响应;
b:物理寻址,不抑制正响应,服务和子功能都支持,参数至少有一个可用时,如果请求数据参数错误,服务器回复否定响应;
c:物理寻址,不抑制正响应,服务和子功能都支持,没有可用的数据参数,服务器回复NRC 0x31的否定响应;
d:物理寻址,不抑制正响应,服务不支持,服务器回复NRC 0x11或0x7F的否定响应;
e:物理寻址,不抑制正响应,服务支持,子功能不支持,服务器回复NRC 0x12或0x7E的否定响应;
f:物理寻址,抑制正响应,服务和子功能都支持,参数至少有一个可用时,抑制正响应;
g:物理寻址,抑制正响应,服务和子功能都支持,参数至少有一个可用时,如果请求数据参数错误,服务器回复否定响应;
h:物理寻址,抑制正响应,服务和子功能都支持,没有可用的数据参数,服务器回复NRC 0x31的否定响应;
i:物理寻址,抑制正响应,服务不支持,服务器回复NRC 0x11或0x7F的否定响应;
j:物理寻址,不抑制正响应,服务支持,子功能不支持,服务器回复NRC 0x12或0x7E的否定响应;

此处,i,j表中NRC各少了一个,个人认为是表中记录错了。原文档的解析中有一句描述是g-j与b-e是相同的,因为物理寻址的否定响应不关注正响应抑制位的设置情况。

**还有一点,如果服务器在处理某一条请求的时候使用了NRC 0x78作为回复,那么一定要在后面回复最终的肯定响应或者NRC不是0x78的最终响应。这意味着在f的情况下,如果使用了0x 78去延长响应的执行时间,最后也要给出一个最终响应。**

功能寻址请求

带子功能的物理寻址请求响应行为。
在这里插入图片描述
a:功能寻址,不抑制正响应,服务和子功能都支持,参数至少一个可用,服务器回复肯定响应;
b:功能寻址,不抑制正响应,服务和子功能都支持,参数至少有一个可用时,如果请求数据参数错误,服务器回复否定响应;
c:功能寻址,不抑制正响应,服务和子功能都支持,没有可用参数,功能寻址抑制NRC 0x31(ROOR)的否定响应;
d:功能寻址,不抑制正响应,服务不支持,服务器抑制NRC 0x11或0x7F的否定响应;
e:功能寻址,不抑制正响应,服务支持,子功能不支持,服务器抑制NRC 0x12或0x7E的否定响应;
f:功能寻址,抑制正响应,服务和子功能都支持,参数至少一个可用,服务器抑制肯定响应;
g:功能寻址,抑制正响应,服务和子功能都支持,参数至少一个可用,但是由于一些错误,服务器发送否定响应
h:功能寻址,抑制正响应,服务器和子功能都支持,参数不可用,功能寻址抑制NRC 0x31(ROOR)的否定响应;
i:功能寻址,抑制正响应,服务不支持,服务器抑制NRC 0x11或0x7F的否定响应;
j:功能寻址,不抑制正响应,服务支持,子功能不支持,服务器抑制NRC 0x12或0x7E的否定响应。

没有子功能参数的服务响应行为

对于没有子功能参数的的请求消息,没有通用的服务器响应行为可用。

物理寻址客户端请求

此子项中指定的服务器响应行为在每个服务的服务描述中引用,该服务不支持子函数参数,但支持从客户端收到的物理寻址请求消息中的数据参数。
在这里插入图片描述
a:物理寻址,服务和参数都支持,服务器回复肯定响应;
b:物理寻址,服务支持,至少有一个可用参数,服务器回复肯定响应;
c:物理寻址,服务支持,至少有一个参数可用,但是由于一些错误,服务器发送否定响应;
d:物理寻址,服务支持,没有可用参数,服务器回复NRC 0x31的否定响应;
e:物理寻址,服务不支持,服务器回复NRC 0x11或0x7F的否定响应。

功能寻址客户端请求

此子项中指定的服务器响应行为在每个服务的服务描述中引用,该服务不支持子函数参数,但支持从客户端收到的功能性地址请求消息中的数据参数。
在这里插入图片描述
a:功能寻址,服务和参数都支持,服务器发送正响应;
b:功能寻址,服务支持,至少一个参数可用,服务器回复肯定响应;
c:功能寻址,服务支持,至少一个参数可用,但是由于一些错误,服务器发送否定响应;
d:功能寻址,服务支持,没有参数可用,服务器抑制NRC 0x31的否定响应
e:功能寻址,服务不支持,服务器抑制NRC 0x11或0x7F的否定响应

伪代码示例

SWITCH (A_PDU.A_Data.A_PCI.SI) 
 { 
 	CASE Service_with_sub-function: /* 如果服务子功能支持*/ 
		IF (message_length >= 2) THEN /* 检查最小长度SI+SF */ 
 			SWITCH (A_PDU.A_Data.A_Data.Parameter1 & 0x7F) /*检查是否抑制正响应*/
			{ 
		 		CASE sub-function_00: /* 如果子功能00支持*/ 
 					IF (message_length == expected_sub-function_message_length) THEN /* 如果消息长度正确,组装响应*/ 
						responseCode = positiveResponse; /* 正响应消息,NRC设置为无效的否定相应码*/
 					ELSE 
 						responseCode = IMLOIF; /* 否则,长度不正确,回复NRC 0x13*/ 
 					ENDIF 
					BREAK; 
				CASE sub-function_01: /* 如果子功能01支持 */  /* 组装响应*/ 
 					responseCode = positiveResponse;  /* 正响应消息,NRC设置为无效的否定相应码*/
		 		: /*等等等等,判断其他的子功能参数*/
		 		CASE sub-function_127: /* 如果子功能127支持 */  /* 组装响应*/  
			 		responseCode = positiveResponse; /* 正响应消息,NRC设置为无效的否定相应码*/
			 		BREAK; 
		 		DEFAULT: 
 					responseCode = SFNS; /* 其他情况,说明不支持的子功能,设置NRC 0x12 */ 
			} 
		 ELSE 
 			responseCode = IMLOIF; /* 如果最小长度不满足,设置NRC 0x13 */ 
 		ENDIF 
 		suppressPosRspMsgIndicationBit = (A_PDU.A_Data.Parameter1 & 0x80); /*获取正响应抑制位信息, 0x00或者0x80 */ 
 		IF ( (suppressPosRspMsgIndicationBit) && (responseCode == positiveResponse) && (“not yet a NRC 0x78 response sent”)) THEN 
 		/* 如果抑制正响应,而且要求的是回复正响应,并且没有发送过0x78 */ 
 			suppressResponse = TRUE; /* 抑制正响应标记为TRUE */ 
 		ELSE 
 		suppressResponse = FALSE; /* 否则,抑制正响应标记为Falise*/ 
 		ENDIF 
 		BREAK; 
 	CASE Service_without_sub-function: /*如果服务不包含子功能 */ 
 		suppressResponse = FALSE; /* 抑制响应的标志初始化为False */ 
 		IF (message_length == expected_message_length) THEN 
 			IF (A_PDU.A_Data.Parameter1 == supported) THEN /* 如果消息长度支持,服务支持*/
				responseCode = positiveResponse; /* 正响应消息,NRC设置为无效的否定相应码*/
 			ELSE 
 				responseCode = ROOR; /* 如果参数不支持,设置NRC 0x31 */ 
 			ENDIF 
 		ELSE 
 			responseCode = IMLOIF; /* 如果长度不满足,设置NRC 0x13 */ 
 		ENDIF 
 		BREAK; 
 	DEFAULT: 
 		responseCode = SNS; /* 如果服务不支持,设置NRC 0x11 */ 
 	} 
IF (A_PDU.TA_type == functional && ((responseCode == SNS) ¦¦ (responseCode == SFNS) ¦¦ (responseCode == SNSIAS) ¦¦ 
(responseCode == SFNSIAS) ¦¦ (responseCode == ROOR)) &&(“not yet a NRC 0x78 response sent”)) THEN 
 /* 如果是功能寻址,否定响应是以上几个,且没有发送过0X78 */ 
 ············
ELSE
 IF (suppressResponse == TRUE) THEN /* 否则,如果抑制正响应*/ 
 ·········
 ELSE /* 发送响应 */ 
 ······
 ENDIF
 ······ 
ENDIF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1226239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux tc 使用

tc模拟延时丢包等网络故障依赖的内核驱动 /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的,如果没有安装该驱动,构造网络故障时会报错。 root:curtis# tc qdisc change dev enp4s0 root netem delay…

LoRA低秩微调技术详解

在当今快节奏的技术环境中,大型AI模型正在推动不同领域的突破。 然而,根据特定任务或数据集定制这些模型可能是一项计算和资源密集型工作。 LoRA是一种突破性且高效的微调技术,它利用这些高级模型的强大功能来执行自定义任务和数据集&#xf…

Word 2016 删除标注

步骤: 菜单栏--审阅--删除--删除文档中的所有标注

07.webpack的性能优化 -- 产出代码

目标: 体积更小合理分包,不重复加载速度更快,使用内存更小 实现功能 小图片的base64编码提取公共代码bundle加hashIngorePlugin懒加载使用CDN使用productionScope Hosting 1. 使用production module.exports smart(webpackCommonConf, …

Python武器库开发-flask篇之session与cookie(二十六)

flask篇之session与cookie(二十六) 在 Flask 中,可以使用 session 来在不同请求之间存储和传递数据。Session 在客户端和服务器端之间交换,但是数据存储在服务器端。 Session 与 Cookie 的区别 session 和 cookie 都可以用来在不同请求之间存储和传递…

Vue3-readonly(深只读) 与 shallowReadonly(浅只读)

Vue3-readonly(深只读) 与 shallowReadonly(浅只读) readonly(深只读):具有响应式对象中所有的属性,其所有值都是只读且不可修改的。shallowReadonly(浅只读):具有响应式对象的第一层属性值是只读且不可修改的&#x…

解决Kibana初始化失败报错: Unable to connect to Elasticsearch

现象: 原因: docker run生成容器的时候,指定elastic server时指向了localhost 为什么不能是localhost, 因为这个localhost指向的是容器本身的网络,而elastic用的是物理网络,两个网络是隔离的,所以如果kiba…

Rocket如何实现顺序消费

RocketMQ 支持两种消息模式 集群消费( Clustering )和广播消费( Broadcasting )。 集群消费:同一 Topic 下的一条消息只会被同一消费组中的一个消费者消费。也就是说,消息被负载均衡到了同一个消费组的多…

Java集合大总结——Collection接口

集合概述 Java 集合可分为 Collection 和 Map 两大体系: Collection接口:用于存储一个一个的数据。 List子接口:用来存储有序的、可以重复的数据(主要用来替换数组,也被称作"动态"数组) 实现类…

LangChain 代理 Agent(学习笔记)

原文:LangChain 代理 Agent(学习笔记) - 尘叶心繁的专栏 - TNBLOG LangChain 代理 Agent(学习笔记) LangChain 代理 Agent(学习笔记) 简介Agent Zero-shot ReActStructured Input ReActOpenAI FunctionsConversationalSelf ask with searchReAct document storePlan…

斯坦福机器学习 Lecture1 (机器学习,监督学习、回归问题、分类问题定义)

https://www.bilibili.com/video/BV1JE411w7Ub?p1&vd_source7a1a0bc74158c6993c7355c5490fc600 笔记如下 机器学习的定义:不需要明确编程就能让计算机去学习做某件事情 另一个定义 什么是监督学习? 给定一组 (x,y) 样本,学习一个 x-&g…

十三、Linux文件目录指令

pwd 指令 基本语法:pwd (功能描述:显示当前工作目录的绝对路径) 应用实例:案例:显示当前工作目录的绝对路径 ls 指令 基本语法:ls 【选项】【目录或是文件】 常用选项 -a :显示当…

【STL】string类 (上) <vector>和<list>的简单使用

目录 一,什么是 STL 二,STL 的六大组件 三,标准库中的 string 类 1,string 类 2,string 类的常用接口 1,string类对象的常见构造 2,string(const string& str&#xff…

PHP常用的数组函数

PHP是一种流行的服务器端脚本语言,广泛用于Web开发。数组是PHP中最重要且最常用的数据类型之一,它提供了许多强大的数组函数,用于在数组上执行各种操作。在本文中,我们将深入解析PHP中一些常用的数组函数,以便更好地理…

【考研数学神作】你不能错过的学习教材

【文末送书】今天推荐一些考研数学优质书籍,带你筑牢知识体系 目录 导语优美的数学思维:问题求解与证明数学分析线性代数线性代数及其应用代数初等数论及其应用数论概论概率论基础教程概率论与统计推断统计学基础:透过数据看世界数理统计及其…

前端为什么要工程化

前端为什么要工程化 文章目录 前端为什么要工程化传统开发的弊端一个常见的案例更多问题 工程化带来的优势开发层面的优势团队协作的优势统一的项目结构统一的代码风格可复用的模块和组件代码健壮性有保障团队开发效率高 求职竞争上的优势 现在前端的工作与以前的前端开发已经完…

【Seata源码学习 】篇三 seata客户端全局事务开启、提交与回滚

1.GlobalTransactionalInterceptor 对事务方法对增强 我们已经知道 GlobalTransactionScanner 会给bean的类或方法上面标注有GlobalTransactional 注解 和 GlobalLock的 添加一个 advisor (DefaultPointcutAdvisor ,advisor 绑定了PointCut 的 advise) 而此处的 …

更新文章分类

CategoryController PutMappingpublic Result update(RequestBody Validated Category category){categoryService.update(category);return Result.success();} CategoryService //更新分类void update(Category category); CategoryServiceImpl Overridepublic void update(…

大数据Doris(二十六):数据导入(Routine Load)介绍

文章目录 数据导入(Routine Load)介绍 一、​​​​​​​适用场景

asp.net智能考试系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 智能考试系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 系统运行视频 https://www.bilibili.com/video/BV1gz4y1A7Qp/ 二、功能介绍 本系统使用Microsoft Visual Studio 201…