继上篇《DoIP了解一下?》与大家分享了DoIP协议的报文格式、负载类型、应用场景等内容,也了解到完整的DoIP诊断会话主要包含:激活线激活——车辆发现——路由激活——诊断交互——关闭TCP_DATA_Socket,共五个步骤,今天小编主要给大家分享一下在整个DoIP诊断会话中需要重点关注的一些信息。
激活线激活
-
减少电磁干扰 -
降低DoIP边缘节点的功耗
ISO 13400提供了两种激活线电路示例, OEM可根据需求选择适用于自己车型的电路。综合来讲电路1对于电路2激活电压较高、抗干扰能力较弱、功耗相对较低,一般会建议在能通过RI、BCI等测试的前提下,选择电路1设计激活线路。
按照ISO 13400要求,当激活条件不满足时,外部诊断仪与边缘节点不能进行以太网通信,同时边缘节点不执行IP地址分配及车辆发现流程。
车辆发现
1、IP地址分配
一般情况下边缘节点作为DHCP的Client,DHCP的Server集成在诊断仪中。在激活线激活之后,应立即执行IP地址分配过程。
2、车辆信息获取
DHCP机制执行完成之后,边缘节点应按照ISO 13400要求以广播方式发送3次(A_DoIP_Announce_Num)车辆声明报文,且第一条声明报文应在A_DoIP_Announce_Wait(0~500ms)时间内发出。
关于车辆信息获取过程一些关键的小Tips:
多次发送车辆声明报文的原因:车辆声明报文以UDP报文传输,无法保证报文正确传输,多次发送报文增加诊断仪至少接收到一条报文的概率,ISO 13400建议发送三次,实际发送次数可以按照OEM需求配置。
ISO 13400中规定车辆声明报文应以受限广播地址(255.255.255.255)为目的IP地址发送。
车辆声明/信息响应报文中“Further action required”字段意义:该字段值一般默认为0x00,若此字段值为0x10,则诊断仪需要使用0xE0的激活类型发送路由激活请求,即在路由激活过程中需要执行OEM定义的安全认证机制(身份认证、确认)。

图1 车辆发现
路由激活
路由激活有三个核心知识点:路由激活、TCP_DATA Socket处理和在线检测。
1、路由激活处理过程
在DoIP通信网络中,通常使用逻辑地址来唯一标识一个DoIP实体(DoIP节点、诊断仪),ISO 13400中定义了ECU及诊断仪的逻辑地址范围,同时规定OEM在设计阶段需要定义ECU支持的诊断仪逻辑地址(一个或多个)。进行诊断报文交互之前,诊断仪需要通过路由激活过程将自己的逻辑地址注册到通信的TCP_DATA Socket中。
ECU在接收到诊断仪发送的路由激活请求后,会按照下图描述路由激活的处理流程进行判别处理,若所有的判别项均满足要求,ECU会回复路由激活成功响应。

图2 路由器激活处理过程
对于某些路由激活否定响应码(0x00、0x01、0x02、0x03、0x05、0x06),ECU在回复否定响应报文后需要关闭TCP_DATA Socket。
上述提到需要使用0xE0激活类型进行路由激活时,需要执行相应身份认证及确认机制,具体以何种方式实现ISO 13400并未详细定义,OEM可根据需求自定义该部分功能。
对于诊断仪执行路由激活有两个时间参数需要注意:诊断仪与ECU建立TCP连接后需在T_TCP_Initial_Inactivity(2s)时间内进行路由激活,否则ECU会主动关闭该连接;路由激活成功之后,ECU所能保持TCP_DATA Socket静止(无任何诊断交互)的最长时间为T_TCP_General_Inactivity(5min),超时后ECU会主动关闭TCP_DATA Socket。

图3 TCP_DATA Socket处理过程
若在该流程中检测到当前激活的Socket已使用其他SA进行激活,ECU会立即停止Socket处理流程,并发送路由激活否定响应报文(响应码为0x02)。
3、在线检测
Alive Check主要作用是确定已注册并激活的Socket是否仍在被诊断仪使用,当ECU发送Alive Check请求后,若诊断仪还需要使用该Socket,则在其接收到Alive Check请求后,需要按照ISO 13400要求在T_TCP_Alive_Check(500ms)时间内回复相应的Alive Check响应,若超时未回复,ECU会立即关闭该Socket,即Alive Check未通过。
在线检测过程,基本上属于以下两种情况:
若路由激活处理流程中检测到当前激活的SA已注册到其他激活的Socket,ECU会在已激活socket执行Alive Check Single流程,若Alive Check未通过,当前路由激活成功;若Alive Check通过,ECU会立即停止Socket处理流程,并发送路由激活否定响应报文(响应码为0x03)。
若路由激活处理流程中检测到ECU所支持的Socket全被注册并激活,则ECU会执行Alive Check all流程,若有至少一个socket未通过Alive Check,则当前路由激活成功;若所有Sockets全通过Alive Check,ECU会立即停止Socket处理流程,并发送路由激活否定响应报文(响应码为0x01)。
诊断处理过程
路由激活完成之后,诊断仪即可以通过该TCP_DATA Socket与ECU进行诊断通信,同样在ECU接收到诊断请求后会按照下图所示流程进行判别处理,若所有判别均满足要求,ECU会回复诊断肯定响应及诊断响应报文,或者向目标网络转发该诊断请求。

图4 诊断处理过程
对内部ECU进行诊断时,诊断否定响应相关报文应由谁来发送呢?
其实不难理解,这些否定响应报文皆由网关来发送。网关接收到诊断请求后会按照诊断处理流程图所示依次进行检测,若有检测项不通过,则网关会向诊断仪发送相应诊断否定响应报文,并丢弃该诊断请求。
响应码为0x02的报文过大DoIP首部否定响应与响应码为0x04的诊断报文过大否定响应的区别:报文过大(0x02)是指诊断请求中DoIP报文的负载长度超过网关所支持的最大DoIP报文大小;而诊断报文过大(0x04)是指诊断报文的长度超过目标网络或者ECU所支持的DoIP报文大小。这也就解答了小编经常被问到的一个问题:为什么经过DoIP首部检测之后还会有诊断报文过大的否定响应报文出现?
网关接收到诊断请求后,需要在A_DoIP_Diagnostic_Message时间内向诊断仪回复诊断肯定响应/否定响应报文,若超时诊断仪未接收到相应报文,应重发诊断请求。

小编在此提出一种观点:从诊断处理流程图中可以看到,网关需要从诊断请求中获取TA(即目标ECU),且后续有检测目标ECU是否可达/是否可路由到目标ECU的步骤。因此,网关即可在此步骤中与目标ECU建立连接,并进行路由激活,且将路由激活的结果作为此步骤的检测结果。


