PIX线控改装技术连载二 | 车辆组成模块之间的共同语言
在上一节中我们大致了解了一辆车最基本的组成部分,这些部分除了机械机构还包含了电子控制部分,可以说是机电一体化的代表作之一。
相关文章戳此:(线控改装技术连载一之——线控开端和车辆组成)
(线控CRV,最高性价比的自动驾驶开发平台)
接下来的内容都围绕着油门,转向和制动这三大功能模块做更深入的了解和认知。那么问题来了,接下来我们该如何跟这几个部分的建立联系呢?换句话说我们通过什么来控制他们呢?
在PIX刚开始接触到车辆和线控改装的时候也同样遇到了这样的问题,当然这拦不住PIX的全能极客们。于是乎我们买了很多汽车零配件回来,很快,我们就破解了车辆模块之间的交流的特定的通讯协议。
全球有很多顶尖黑客也做过类似的事,比如第一个破解Apple iphone和SONY PS的天才黑客乔治·霍兹(George Hotz),他最近破解了本田思域,并推出999美元的民主化的自动驾驶产品Comma One。说到车辆黑客,我们今天有必要来一起来了解一下在汽车领域用的最多的现场总线协议——CAN协议。
CAN总线简介
控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。
在汽车领域中也大量使用了这一通讯方式,将车身上各个执行机构比作节点,那么这些节点大部分都将连接在CAN总线上,不断的向总线里发送消息和从中读取出自己需要的信息。CAN总线贯穿车身,但是车身上不止有一条CAN总线,按照各个模块的功能不同,一般把CAN总线分成几个速度,高速CAN主要负责传输关键消息,如发动机转速,转向角,油门踏板位置,油压等敏感信息。而向车门,车灯等非重要的设备会接到低速CAN中。
CAN 2.0 协议只定义了 OSI 七层模型中的最底两层——物理层和数据链路层,应用层需要用户自行定义或选择,比如J1939和CANopen等。所以需要知道各个设备之间通讯信息的意思,必须获得之间定义好的协议(dbc文件)。
图:车辆控制局域网示意图
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CAN总线简介——CAN标准
在国际标准中,CAN总线是唯一的一种现场总线,其底层标准遵循Bosch公司制定的CAN2.0A/B规范(其中CAN2.0A支持CAN标准报文格式,CAN2.0B支持CAN标准报文格式和扩展报文格式)和ISO11989国际标准。物理层定义了IOS11898和IOS11519两个标准。
从ISO/OSI网络模型来看,CAN拥有三层:物理层,数据链路层和应用层。其中应用层是由用户自定义的一层。
CAN控制器:接收控制单元中微处理器发出的数据,处理数据并传给CAN收发器
CAN收发器:将数据传到总线 或从总线接收数据给控制器
图:CAN OSI模型
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CAN总线简介——物理层
CAN总线物理层定义了汽车上各个节点的连接介质和硬件接口。每一个节点都配备了一个CAN收发器芯片,该芯片主要用于在微控制器和CAN网络之间的逻辑信号和差分信号的转换。
硬件连接:CAN总线由一条双绞线,首尾各连接一个120Ω电阻(标准ISO11898 )组成,其中双绞线中的两根线分别称作CAN_H和CAN_L,设备节点通过连接到这两根线束上来实现差分信号的数据传输。
图:总线物理连接
数据收发:每个节点都包含有CAN收发芯片,芯片主要作用是实现逻辑电平和数字电平之间转换。
信号表示:总线上分为显性电平和隐性电平,不同的标准有不同的规定。
通讯速度:CAN的通讯速度最高可以达到1Mbit/s,根据不同标准有不同的通讯速度,一般500Kbit/s,250Kbit/s和125Kbit/s较多。
通讯距离:速度越高距离越短,一般500K为130m,250K为270m。通讯速度与通讯距离成反比。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CAN总线简介——数据链路层
节点在接入CAN网络之后,可以接收来自网络的所有需要的信息。节点与节点之间通过CAN报文来实现通讯,CAN把报文分成了五种不同的数据帧:数据帧、远程帧、错误帧、过载帧和帧间隔。
>数据帧:收发数据(使用频率最高)
>远程帧:请求某节点发送特定ID的数据帧
>错误帧:某节点发现帧错误时用来向其他节点通知的帧
>过载帧:接收节点用来向发送节点告知自身接收能力的帧
>错误帧:数据帧、远程帧与前面帧隔离的帧
由于数据帧最重要,所着重讲解数据帧。数据帧根据仲裁段(帧ID)的长度不同,可以分成标准帧和扩展帧两种。标准帧仲裁段长度为12位,扩展帧长度为32位。
数据帧根据仲裁段(帧ID)的长度不同,可以分成标准帧和扩展帧两种。标准帧仲裁段长度为12位,扩展帧长度为32位。
不管是标准帧还是扩展帧,数据帧结构都由:帧起始,仲裁段,控制段,数据段,CRC段,ACK段和帧结束7个部分组成。
图:标准数据帧结构
图:扩展数据帧结构
>帧起始:帧起始是发送一个帧开始的标志,它是一个显性位。
>仲裁段:仲裁段可以理解为一个报文的ID标识,当CAN总线上的一个节点在接收报文时,通过该段来判断该数据是否为自己需要的数据。不同的帧标准仲裁段的长度不同,标准帧中,仲裁段的长度为12位。扩展帧中仲裁段的长度为32位。
>RTR位:远程请求位,当该位为显性时表示该帧为数据帧,隐性位远程帧。 >IDE位:标识符扩展位,该位为显性时表示该帧为标准帧,反之为扩展帧。
>SRR位:代替远程请求位,在扩展帧中该位位于标准帧的RTR位上,为占位位,始终为隐性,因此一旦标准帧与扩展帧发生冲突,将以标准帧的优先级高于扩展帧而结束。
>r0,r1位:保留位,必须以显性电平传送。
>DCL段:数据长度代码段,最长不能超过8位。
>数据段:数据段为CAN报文中存放数据的地方,数据总长度不能超过8字节(64位),前面的帧起始,仲裁段和控制段与之后的CRC段,ACK段和帧结束都是一个数据帧中的辅助段,真正的数据保存在了数据段中,同时也是需要真正去解析的。当然仲裁段也很重要,需要解析出ID和节点之间的匹配关系。
>CRC段:该段主要用RCR进行数据校验,CRC校验值存放于此处。该段由15位CRC值和一位CRC界定符(隐性)组成。
>ACK段:应答段,应答场长度为2个位,包含应答间隙和应答界定符。在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙期间向发送器发送一“显性”的位以示应答。
>帧结束:为一位显性位,表示一个帧发送结束。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
USB-CAN —— 数据监听设备
当设备正常连接到CAN网络之后便可以在软件视窗处看到接收到的所有CAN消息,此时如果需要具体查看某个特定ID帧,则可以设置过滤来实现单帧检测。
>如何查看数据:在配置正确的情况下,侦测软件上会有很多CAN消息出现,此时如果这些消息是需要的可以保存下来。分析软件已经将CAN报文分解出来了,不需要人工分解,此时会有帧ID和帧数据。
>如何分析数据:如果在已知数据协议的情况下可以结合DBC解析文件来分析帧和各个节点之间的关系,如果在不知道的情况下则需要通过CAN逆向工程来破解协议,将在最后一章节讲解如何利用CAN设备对CAN网络进行逆向工程。
图:USB-CAN分析软件接收到的数据
图:保存下来的CAN报文协议
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CAN通讯协议——了解模块之间在说些什么
经过上文的简单科普,大家已经知道了CAN的基本构成和工作方式。虽然知道了CAN的工作方式,但还是无法应用到实际,怎么办呢?
我们首先需要进行理论积累,才能为实践提供可行依据。在PIX改车的过程中,我们先了解完CAN总线协议之后,再着手实践。
说到这里聊聊我们的整个实践过程吧。最开始我们是在一个带CAN的可编程VCU上自己编写程序,让这个VCU发出我们定义好的CAN报文。这一步成功之后我们讲目标放在现有量产车的逆向上(这里强烈安利一本书——《汽车黑客大曝光》 ,书中讲解了汽车逆向工程的一些方法)。然而逆向量产车的核心数据并不简单,车上的众多CAN节点每时每刻都在向外发出消息,总线上分分钟约有上万条数据通过。如何有效进行数据的分析呢?PIX的极客们立马找来车辆维修手册,摸清了整车的硬件线路配置关系:该辆车有几条CAN总线,分别经过哪些地方;哪些模块连载那根线上面,需要逆向的模块在哪里;还有引脚定义和线束定义图。
对于CAN的了解和运用针对线控车逆向来说,更应该注重利用合适的装备和自动化工具协助来完成这个庞大的工程。同时应争取向全世界的朋友们互相交流,以获得更多有用的帮助。
因为在破解改装车辆的这条路上,我们一直都不是孤独的。
如前文提到的天才黑客乔治·霍兹的comma.ai ,【https://github.com/commaai】——这是他的开源项目,他们已经破解了本田等非常多车系里面的非常多的车辆;另一个就是OSCC【https://github.com/PolySync/oscc】开源项目,这个开源项目车型集中为Kia系列车型。从这两个项目中我们获得了许多信息,排除了不少阻碍,使改车过程更加顺利和高效,所以希望更多的人能从我们的博客与这两个知名项目中获益。
如今,PIX已经可以提供完整的线控车辆解决方案。如果你有相关的疑问或者需求可以找到我们,不仅是提供解决方案,我们也将持续分享我们前期积累下来的知识。
这期文章介绍了CAN的通讯形式,后面的章节中我将会着重介绍如何利用各种工具对车辆进行数据分析和逆向。记得持续关注PIX公众号和官方网站,我们将会第一时间分享更多关于自动驾驶和线控技术相关干货。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本文作者有话说:立个flag,写完线控连载,我还会针对当下流行的自动驾驶开源方案来一波深度的源码分析连载,本期到这,我是搬砖搬到迷失自我的大虫啊哈哈哈,这是我的个人博客网站:www.dowson.live 。里面同样也会持续更新我最新文章,可能404,哈哈。