UDS相关协议——15765协议

UDS协议的实现遵从OSI七层模型,下面是这七层模型中使用的协议。从这个表可以看出,15765-2是在网络层,这个是没有问题的,15765-3在会话层,14229-1是在应用层。

上图是Autosar中DCM模块在OSI七层模型中的划分方式,在实际应用中,我们还要根据can通信的15765和14229协议进行分层

一、ISO 15765-2

ISO 15765-2作为网络层的传输协议,最主要的功能是定义了报文分段和重组的机制。也就是我们说的拆包和组包。每一帧UDS报文包含了地址信息,数据长度,数据内容等。地址信息会在底层拆掉,数据长度是由Autosar架构中的Cantp层根据15765协议拆掉,剩下的具体的数据内容传给应用层。反之组包亦然。

1.拆包组包

那么为了实现这种拆包组包的形式,15765协议把Can报文分为以下几种帧类型:

当数据长度小于8字节,一帧单帧就可以解决了,当数据长度比较大时,就需要拆包进行多帧传输数据。

当发生比较长的报文的时候,将报文拆分成首帧+连续帧。首先发生放发一帧首帧,接收方收到后会回复一帧流控帧(告诉发送方自己的接收能力以及操作指示),发送方收到流控帧继续发送的指示后,将剩余的数据以连续帧的形式发送,然后依次往复,直到所有数据传输完毕。

2.网络层超时机制

ISO 15765-2除了定义了报文分段和重组的机制外,还定义了网络层的超时机制。

  • N_As: 表示CAN数据帧从请求数据链路层发送至接收到对应的ACK的最大时间间隔;

  • N_Bs: 表示发送方数据链路层接受到流控帧的最大时间间隔;

  • N_Ar: 表示接收方从请求数据链路层发送流控帧至接收到对应的ACK的最大时间间隔;

  • N_Br: 表示接收方请求数据链路层发送流控帧的内在最大时间间隔 (N_Br + N_Ar)<(0.9倍N_Bstimeout);

  • N_Cs: 表示发送方请求数据链路层发送流控帧的内在最大时间间隔 (N_Cs + N_As)<(0.9倍N_Cr timeout);

  • N_Cr: 表示接收方接收到流控帧的最大等待时间间隔;

二、ISO 15765-3

1.应用层超时参数

默认会话的应用层定时参数:

另外还有两个是非默认会话时的定时参数:

2.超时机制描述

1)默认会话期间的物理通信

  • 客户端诊断应用层通过发送N_USData.req 到网络层开始发送请求信息。网络层传递该请求信息至服务器。该请求信息要么以单诊的形式或多帧的形式。
  • 在多帧信息情况下,请求开始于网络层发送的NUSDataFF.ind通知服务器。
  • 请求信息的完成通过客户机NUSData.con指示。当接收到NUSData.con 时,客户端使用默认重载
  • 值为P2Client,启动P2Client定时器,该定时器的值应当考虑到车载网络设计上(通信网关总线带宽,等)所有的误差。为了简单化,该图假定客户机和服务器在一条总线上。
  • 服务器通过NUSData.ind指示请求信息的完成。
  • 服务器在接收到NUSData.ind指示时,要求在P2Server 时间内开始回复信息。也就是说,在多
  • 帧回复信息条件下,首帧必须在P2Server 时间内发送,对于单帧回复信息,该单帧必须P2Server 时间内回复。
  • 服务器在给定的P2Server 时间内无法提供请求的信息时,它可以通过发送应答码为 0x78 的否定
  • 应答信息请求扩展的定时窗。客户端接收到否定应答信息时,客户端网络层产生一个N_USData.ind。接收到应答码为 0x78的否定应答信息,客户端重置它的P2Client定时器,但使用的是扩展的重载的P2*Client定时值。
  • 服务器在发送否定应答信息NUSData.con之后,要求在给定的扩展的P2*Server时间内应答信息。如果在给定的扩展的P2Server 时间内仍无法提供请求的信息,服务器则继续发送应答码为0x78的否定应。客户端使用的是扩展的重载的P2*Client,定时值重置它的P2Client 定时器。为了简单起见,图中只显示了一个应答码为 0x78 的否定应答信息。
  • 一旦服务器可以提供请求的信息(肯定的否定的应答,而不是应答码0x78的应答),它就启动最后结果的应答信息。
  • 在多帧应答信息情况下,客户机通过网络层N_USDataFF.ind指示首帧的接收。当接收到首帧时客
  • 户机停止P2Client定时器。
  • 如果完整的信息接收到,或者在接收过程中出现了错误,网络层最后都产生一个NUSData.ind。
  • 单帧响应信息,通过单个的NUSData.ind指示单帧的接收。当接收该单帧指示时,客户端停止P2Client定时器。

2)非默认会话期间的物理通信

  • 客户端诊断应用层通过发送N_USData.req至网络层,传递诊断会话控制(0x10)请求信息。网络层
  • 传递该请求信息至服务器。
  • 请求信息是单帧信息。它的完成通过客户端N_USData.con指示。客户端产生的N_USData.con不会促使S3Client定时器开启(会话定时器)。这与使用功能地址不同,使用功能地址会周期性发送(0x3E)信息保持诊断会话一直处于激活状态。
  • 服务器通过N_USData.ind指示请求信息的完成。
  • 图上给出,假定客户机需要服务器一个应答。服务器应当发送诊断会话控制(0x10)的肯定应答信息。
  • 服务器通过 N_USData.con 指示应答信息发送的完成。然后服务器开启S3Server 定时器,只要它不超时,它就一直处于非默认状态。客户机通过NUSData.ind指示诊断会话控制(0x10)的接收。这将促使S3Client 的开启。客户机负责保证S3Server定时器在它超时之前复位,以保证服务器处于非默认
  • 会话状态。
  • 客户机任何时候发送一条请求信息至服务器(包括(0x3E)信息),它都会停止S3Client 。
  • 接收到请求信息的单帧或首帧,服务器都停止S3Server定时器。服务器通过N_USData.ind 标识请求信息的完成。
  • 客户机通过N_USData.ind指示应信息的完成,这促使客户机开启S3Client服务器通N_USData.con 指示应答信息的完成,这促使服务器开启S3Server。还有一种客户机不需要应答的情况,客户机接收到网络层N_USData.con确认标识请求信息发送完时,开启S3Client,服务器完成请S3Server求的动作时,开启S3Server,为简单起见,图中显示的是需要应答的情况。
  • 如果客户机在S3Client超时之前,没有发送任何诊断请求信息,这促使客户机在S3Client超时时,发送一条物理地址(0x3E)请求信息。
  • 服务器通过NUSData.ind指示(0x3E)请求信息的接收。这促使服务器停止S3Server定时器。客户机通过N_USData.ind指示(0x3E)应信息的完成,这促使客户机开启S3Client,服务器通过
  • N_USData.con指示(0x3E)应信息的完成,这促使服务器开启S3Server。还有一种客户机不需要
  • 应答的情况,客户机接收到网络层N_USData.con(0x3E)标识请求信息发送完时,开启S3Client,服务器完成请求的动作时,开启S3Server,为简单起见,图中显示的是需要应答的情况。

### 关于15765协议中P2Service和P2Client的时间要求 ISO 15765 是一种用于汽车网络通信的标准,主要用于定义车载诊断系统(OBD-II)的数据传输协议。该标准涵盖了 CAN 总线上的数据帧结构以及消息传递机制。以下是关于 P2Service 和 P2Client 的时间要求的具体说明: #### 定义与背景 在 ISO 15765 中,`P2Service` 和 `P2Client` 表示服务端和服务客户端之间的响应超时参数。这些参数是为了确保在网络环境中实现可靠的消息交换而设计的。 - **P2Service**: 这是指 ECU(电子控制单元)作为服务器,在接收到请求后发送第一个响应帧的最大允许延迟时间[^3]。 - **P2Client**: 这是指测试设备或另一个节点作为客户端,在向 ECU 发送请求后的最大等待时间,直到接收到来自 ECU 的首个响应帧为止[^4]。 #### 参数详解 根据 ISO 15765 标准的规定,具体的时间要求如下: - **P2Service (T_P2_MAX)** - 默认值通常设置为 100ms 到 250ms 范围内,取决于具体的车辆制造商配置[^5]。 - 如果某个特定的服务处理较为复杂,则可以延长此时间间隔至更长时间段,但需提前协商并通知客户端。 - **P2Client (T_P2_MIN)** - 此值一般设定得较短,默认情况下可能接近 50ms 左右[^6]。 - 主要目的是为了快速检测到异常情况下的无回应状态,并采取相应的错误恢复措施。 需要注意的是,实际应用过程中可能会因为不同的应用场景或者特殊需求调整上述默认数值;因此建议查阅对应车型的技术手册获取精确的信息。 ```python # 示例代码展示如何模拟简单的定时器逻辑来验证这两个时间段 import time def simulate_p2_service(): start_time = time.time() # Simulate processing delay here... process_duration_ms = 150 # Example value within typical range of T_P2_MAX time.sleep(process_duration_ms / 1000) end_time = time.time() elapsed_time_ms = int((end_time - start_time) * 1000) print(f"P2 Service Response Time: {elapsed_time_ms} ms") simulate_p2_service() def simulate_p2_client(timeout_ms=50): try: response_received_within_timeout = False timeout_s = timeout_ms / 1000 deadline = time.time() + timeout_s while True: current_time = time.time() if current_time >= deadline: break # Check for incoming message from service side... if not response_received_within_timeout: raise TimeoutError("No response received before client's timeout.") except TimeoutError as e: print(e) simulate_p2_client(50) ``` 以上脚本仅作示意用途,展示了基于 Python 编程语言下简单计时功能的应用场景之一。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值