AUTOSAR入门-基于以太网诊断

原创 thatway 那路谈OS与SoC嵌入式软件 2022-03-17 18:06

AUTOSAR入门-基于以太网诊断

人生病比如  

发烧
了要看病,医生通过各种手段比如把脉
、拍片等了解病情,然后对症下药。汽车也一样,当一个零部件ECU出现故障的时候一般会在
仪表盘
上显示出来,重大故障可能车都开不了,一些小的故障参数也会记录存储到汽车的内存里面,然后利用诊断仪器
连接汽车读取出来,就知道汽车啥毛病了。

下面一步一步深入,快速了解诊断  

功能
和AS中对应的代码
,给你提供
无上心法
,直通
最高境界

  1. 诊断框架

直观-》模型框架-》代码

上图是不是很熟悉,你到4S店做保养,肯定有这个流程。
直观
上看师傅手里拿的就是诊断仪器
,通过物理线
连接到汽车上就可以知道车是否有毛病。

上面介绍了4S店过程,现在先上升到  

模型角度
,再描述下这个过程。上图中:

黄色箭头
:当汽车出现故障的时候,DEM会
收到故障
信息,然后
存储
在NVRAM内存中

绿色箭头
:记录故障后,如果故障影响其他功能,则FIM会禁用其他功能

蓝色箭头
:诊断仪器连接汽车,经过
硬件、协议栈层层软件到达DCM
,然后去DEM
读取故障信息

  • DCM:
    Diagnostic Communication Manager
    ,诊断通信管理。实现诊断通信协议,我们通常说的
    UDS协议
    (即ISO14229,是Unified Diagnostic Services,统一诊断服务,是诊断服务的规范化标准,比如读取故障码应该向ecu发什么指令,读数据流又是发什么指令),就是在这里配置的

  • DEM:
    Diagnostic Event Manager
    ,诊断事件管理。就是用来记录和存储诊断事件的DTC
    (诊断故障码),下面连接NVRAM Manager,就是将这些诊断事件记录到EEP或者Flash中

  • FIM:
    Function Inhibition Manager
    ,功能禁止管理。也就是当一些error出现的时候,禁止一些功能。比如当检测到控制器过电流的时候,关闭MOS或IGBT,防止炸管。就是说有一部分SWC是需要使能条件的,这些条件取决于故障内容(就是来源于下面的DEM中),而FIM负责根据故障内容关闭一些SWC或执行一些SWC。

2. 基于以太网诊断架构

为什么诊断这么重要?

**做AUTOSAR或者汽车相关的工作,总是跟诊断有很大的关系,我感觉诊断是汽车跟外界打通的 第一条路,用来检查车辆故障用。但是其他的功能一看已经有了一条路,比如OTA升级,就没必要自己开辟一条路了,直接复用这条路就可以跟汽车通信,广义的诊断其实就是汽车跟外界的通信通道**。

为什么需要网络诊断?

传统的诊断是基于CAN总线的,就是上面说的去4S店,师傅用诊断仪器通过**CAN连接线**  

连接到汽车上导出数据。很明显需要线,这有点过时了,如果像家里的无线路由器一样,通过wifi
就可以诊断,或者汽车5G联网
后,在任何地方都可以诊断,4S店都不用去了。这些通过以太网都可以实现。

为什么需要DoIP?

**UDS**  

只负责诊断业务,要实现网络上传输的秘密在DoIP
(Diagnostic communication over Internet Protocol)。DoIP把跟网络相关的任务
都揽过去了,比如DHCP分配IP的过程,网络会话管理、网络路由等。DoIP模块解析完DoIP报文后,剥离出来UDS报文再给Dcm处理。

DoIP协议格式是什么?

计算机网络中四层网络协议栈如下:

对应网络协议栈如下图:

DoIP Data
是应用层协议报文。

DoIP协议报文如下(参考ISO13400
规范,可以关注公众号,回复ISO获取):

可以看到
应用层是可以嵌套的,这里就是DoIP协议之上还有UDS协议

Protocol Version
:版本号

Inverse version
:Protocol version的取反的值

Data Type
: 业务类型--重点

DataLength
:数据长度

Source Address
:源地址

Target Address
:目的地址

UDS
:UDS报文(参考ISO14229
规范,可以关注公众号,回复ISO获取)

3. 诊断实操

最新的代码我添加了一个发送诊断报文的socket工具
,可以git pull更新

git clone https://github.com/thatway1989/as.git
cd as
git pull
./autorun.sh

cd as/socket_tool
make
./send_client.sh

上图中可以看到,发出去了两条DoIP报文
,十六进制显示的,解析见下面wireshar抓包
中比较清晰。下面先来看下DoIP的过程:

激活线激活
:AS代码用的虚拟机,不需要

DHCP过程
:AS中直接配置死的IP 172.18.0.200
,这里不需要,见代码
com/as.application/common/config/SoAd_Cfg.c中

{   /* for DCM */                                                                          
     .SocketId = 0,
     .SocketLocalIpAddress = "172.18.0.200",
     .SocketLocalPort = 13400,
     .SocketProtocol = SOAD_SOCKET_PROT_TCP,
     .AutosarConnectorType = SOAD_AUTOSAR_CONNECTOR_DOIP,
 },

车辆识别
:AS虚拟机中可以先省略不做这个过程,后续再研究。

路由激活
:基于TCP协议,我们发送的DoIP协议报文如下:

02 fd
00 05
00 00 00 07
be ef
da 00 00 00 00

利用wireshark工具在ubuntu上对tap0端口(qemu虚拟出来的)抓包对应报文如下:

可以看到这条DoIP报文基于TCP,目的端口是13400,从172.18.0.1发给172.18.0.200,功能是
0x0005
路由激活

源地址
是0xbeef 激活类型是0xda

诊断请求
:基于TCP协议,我们发送的DoIP协议报文如下:

02 fd
80 01
00 00 00 06
be ef
fe ed
11
01

可以看到这条报文是DoIP报文的基础上又封装了
UDS报文

DoIP报文的功能类型是
0x8001
诊断请求

源地址
是0xbeef,目的地址是0xfeed,这些地址都是在AS代码里面规定好的,见代码com/as.application/common/config/SoAd_Cfg.c里面。

另外UDS报文里面服务id是
0x11
ECU复位
,类型是0x01硬复位。

4. 代码实操

这里先说下**AUTOSAR规范**  

,因为这个规范非常详细,甚至繁琐。把某个模块里面有哪些函数,哪些变量名字参数
都定义好了,跟代码息息相关。这里以DoIP为例,我们找DoIP的规范:https://www.autosar.org/nc/document-search/?tx_sysgsearch_pi1%5Bquery%5D=&tx_sysgsearch_pi1%5Bcategory%5D%5B64%5D=64

打开后,如下图,点击
“Specification of Diagnostic over IP

下载AUTOSAR_SWS_DiagnosticOverIP.pdf

打开发现全英文
,不过这是一手的参考资料,我也是把这个pdf看了几遍的,能看英文就看吧。查看DoIP sws规范的第一章可以看到这么一个图:

图里面的箭头就是我们发包工具的包在AUTOSAR框架里面走的路:

网卡驱动-》网络接口-》网络协议栈-》SoAd模块-》DoIP模块-》PduR模块-》Dcm模块
。这个pdf其他部分,讲到具体模块了再详细展开说明。这里我们先串一下代码,查看qemu运行起来telnet中的打印:

这个是Pci网卡驱动打印的,代码在:com/as.infrastructure/communication/Pci/pci_asnet.c

网络协议栈Arccore代码里面用的LWIP,在as/release/download/lwip/src/netif/etharp.c
中的ethernet_input-》ip_input-》tcp_input-》tcp_receive里面自己加打印

SoAd模块的打印,代码在com/as.infrastructure/communication/SoAd/SoAd.c

DoIP模块的打印,代码在com/as.infrastructure/communication/DoIP/DoIP.c

Dcm模块的打印,代码在
com/as.infrastructure/diagnostic/Dcm/*.c

另外发包工具as/socket_tool文件夹下  

client.c

send_client.sh
,了解socket编程
就可以看懂,比较简单,这里不说明了。

后记:

无上秘籍
这篇文章里面就有,就看你
资质
如何能吸收多少了。笔者也是看AUTOSAR官网文档、Arccore源码、AS源码、csdn
等研究了小半年一点一点摸索出来的,这个文章都串起来了,
冰山一角
已经为你打开,
星辰大海
等你来
探索

后续为围绕数据报文走的路:**网卡驱动-》网络接口-》LWIP网络协议栈-》SoAd模块-》DoIP模块-》PduR模块-》Dcm模块**  

,一个一个模块的代码结合AUTOSAR规范和ISO规范进行介绍。

Talk is cheap,show methe code!
后续会继续更新,纯
干货
分享,无广告,不打赏,欢迎
转载
,欢迎
评论交流

往期回顾:

AUTOSAR入门-江湖

AUTOSAR入门-AS开源代码运行环境搭建

AUTOSAR入门-AS开源代码编译过程详解

AUTOSAR入门-AS平台工具命令和目录介绍

results matching ""

    No results matching ""