智能汽车安全新媒体
我司电子电器架构升级了,原先我们的ASW部署在自己的控制器中,我们自己做ASW与BSW的集成,自然也负责CAN的通信诊断测试和基于CAN信号的功能测试。
新架构后控制器被取消了,然后ASW被部署在区域控制器中,对外接口也换成的SOMEIP。为了测试功能,需要模拟SOMEIP的交互过程,这中间踩了不少的坑,不过总算是成功了,记录一下踩过的坑。
在进行信息交互时,车端的时钟系统与需要与车外的时钟系统对齐基准时间,也即遵循相同的时钟体系,以便在时间维度定位事件。
01
技术方案的选择
Vector API方案
我们原先模拟CAN交互的时候,由于最早压根没有CANoe,所以选择了XL Driver Library来做。这是个很底层的库,CANoe或者CANape我理解都是基于这个库做的。
我们对这个库还进行了封装,分为CAN、UDS-TP、UDS-Service三个层次,还做了能够精确控制程控电源电压和上下电时刻的PowerControl库。
基于这些库我们完成了很多个车型的诊断、通信、功能内部测试。由于历史包袱,即使后来有了CANoe,还是一直用这套东西。
基于成功经验,我们一开始也打算直接使用这个底层库做SOMEIP的仿真,花了两个月左右的时间,基本的流程和函数也调试完成了,但是我们忽视了一点,我们手里有的5610只支持100M,但是实车很多接口是1000M的,导致这个方案没有再用。但是对ARXML文件的解析基本在这个阶段完成了,给后续工作打下了基础。
这个方案的好处是基于MAC层的,理论上讲可以用一个Channel模拟出所有对手件节点的SOMEIP报文出来。
但相对而言,需要人工处理的地方比较多,而且还需要Vector的硬件,有优势也有劣势吧,但是没有继续下去的最主原因还是因为没有1000M的Vector硬件盒子。
Windows环境socket编程方案
由于原先有Windows环境socket编程的基础,所以计划使用这个方案,好处是通过OS配置好mac和ip后,只需要在代码中配置UDP层的参数就可以了,能简化工作量。
但是模拟一个节点就需要一个网卡和一个车载以太网的转换器。我们最终好使的方案就是这个,下一部分继续详细说明。
其实后来查资料的发现,socket编程也可以发送底层的mac包,详情可见
www.baeldung.com/cs/raw-sockets
昆易电子方案
在“Windows环境socket编程”方案正在做还没有完全做好的时候,我们也找了一些别的方案。交流了不少供应商,感觉昆易电子做的比较好,于是申请了设备使用。但是万万没想到,卡在ARXML解析这一步了。
我司的ARXML是严格管理的,我们作为ASW开发部门,拿到的ARXML只包含我们自己这个网络节点的信息,别的包可以解析,但是缺少信息,导致没办法导入到昆易的设备。
我们中间走了很多弯路,浪费了很多的时间。感觉ARXML还是太复杂了,而且没有一个很明确的格式定义,不像dbc可以很方便的生成和解析。
不过昆易的VBE1000系列车载以太网转换盒确实很好用。双通道的还支持Bypass功能。
CANoe方案
这和方案2.3是同一个阶段,终于到货了一个5620,然后了解了一下CANoe的方案。这个的介绍可以参考:
Overview Example Configurations for SOME/IP Simulation
链接里的例子已经很不错了。没继续往下走的原因有两个,一个是5620只有一套,如果按这个方案会比较受限;另一个还是ARXML的问题,解析不了。
02
Windows环境socket编程方案踩坑过程
方案简介
还是分层架构,先编写someip的封装库,完成报文填充和报文解析,然后每个节点一个exe,调用封装库,每个exe中有三个线程,三个socket。主线程做Someip Server,负责发送someip 数据frame和sd的offer service,SD Rec线程负责监听SD端口,负责完成订阅交互,Client线程负责接收someip 数据frame。
SD端口还要设置多播。最上层有个TestControl的exe,与每个节点的exe通过共享内存控制节点的发送内容。
字节序的坑
刚开始的时候对着实车采集的log,在电脑上打开wireshark,不断对比wireshark抓的自己通过socket发出去的包和实车采集的包的区别。首先发现的是字节序不对。
后续将所有多于1个byte的成员都改写为多个byte的数组,在someip的结构体里按网络字节序,在填充和解析的时候完成字节序的转换。
结构体填充的坑
由于结构体对齐,导致解析header的很麻烦,网上找了找,使用#pragma pack (1)和#pragma pack ()搞定。
同时,在动态内存分配时忘了自己是64位系统,把指针的长度按4Byte算,导致填充的someip结构体出来问题。
VLAN的坑
在把某个包的所有byte都做对的情况下,控制器就是不订阅。向某个高手请教,一句话解决了我的问题:“VLAN设置了吗?”
我的电脑是intel的网卡,设置vlan非常复杂,下载了app,弄了好半天才搞定,这次控制器就订阅了。后来我们找了很多USB的Realtek的网卡,VLAN设置就很简单了,和设置物理地址在一个地方。
mac与IP绑定的坑
经过上一步,订阅是订阅了,但是仿真节点发不出去订阅OK,详细分析wireshark,发现不知道为什么,arp协议总找不到对应ip的mac,可能车载以太网就是这样的?没深入研究,网上查了查,直接一条指令搞定。
netsh -c interface ipv4 add neighbors "WLAN" "10.1.1.1" "12-34-56-78-9a-bc"
然后arp -a进行确认。
一条UDP对应N条Someip
刚开始时我司一条UDP只对应一条SOMEIP,于是偷懒了,没想到过了一段时间底层升级了,一条UDP对应N条Someip,于是又重写了底层库……
03
其他-SOMEIP通讯监测
目前我司的SOMEIP通信是点对点的,为了监测多流入和流入某个节点的全部报文,在实车上可以使用交换机的镜像功能。
如果要在实验室环境监测两个节点之间的通信,比较简单的做法是买一个带管理功能的交换机,配置镜像功能,这样就可以用windows环境的wireshark监测了。
使用wireshark监测有个不好的地方,就是没有办法看到某个信号随时间的变化,于是我们参考wireshark,直接调用npcap抓包,然后使用我们原先的CAN库,自定义了一个dbc,将信号发到CAN总线上,这样监测就方便了。
内容来源:@知乎王御
https://zhuanlan.zhihu.com/p/672883124
- THE END -
精品活动推荐
因文章部分文字及图片涉及到引用,如有侵权,请及时联系17316577586,我们将删除内容以保证您的权益。