车载信息安全系统中CAN中继器的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

车载信息安全系统中CAN中继器的设计与实现
作者:于合龙李丹马丽
来源:《现代电子技术》2016年第17期
摘要:针对汽车OBD接口存在的安全隐患,设计了以i.MX6系列处理器为核心,通过其串行外设接口,利用MCP2515CAN控制器接入CAN总线的车载信息安全中继器。

在分析Linux 设备驱动程序工作原理的基础上,阐述了CAN接口在Linux系统下的驱动程序设计方法,实现了CAN接口在Linux系统下的驱动,解决了汽车CAN总线的中继问题。

通过在Linux系统中添加ISO15031协议过滤器,实现了非法指令过滤,为车载信息在CAN总线上的传输提供了一层保护屏障。

关键词: CAN;信息安全;驱动程序;中继器
中图分类号: TN92⁃34 文献标识码: A 文章编号: 1004⁃373X(2016)17⁃0120⁃04
0 引言
CAN(Controller Area Network,控制器区域网络)总线广泛地应用于汽车上,主要用来实现车载网络各个电控单元之间的信息交换,形成车载网络系统。

利用CAN总线、传感器、控制器和执行器通过串行数据线连接起来[1⁃2]。

OBD(On⁃Board Diagnostic)接口作为车载监控系统的通信接口,通过CAN总线接入车载系统。

OBD接口除了读取故障码以供修车外,首要的功能是提供车辆的各种工况数据。

利用汽车OBD接口与汽车ECU通过CANBUS协议通信,就可以达到控制汽车某些部件的目的。

为了消除此安全隐患,需要在OBD接口与CAN总线之间接入能够保证信息安全的CAN 中继器,实现信息可靠传输与非法指令过滤。

目前CAN中继器的设计大多是MCU加控制器来实现的。

例如文献[3]中利用双MCU实现CAN总线中继器,文献[4⁃5]中利用双口RAM实现双机系统的通信,文献[6]中通过独立双CAN设计CAN中继器等,在这些方案中,不仅电路冗余复杂,同时在MCU与CAN控制器交换数据时存在数据交换速度慢,准确性低等问题,而且没有相应系统的支撑,仅凭借独立的硬件设备,很难保证车载信息传输安全。

基于上述分析,本文提出车载信息安全系统中继器的设计方案。

此中继器一端通过CAN 接口与OBD相连接,另一端通过CAN接口与CAN总线相连接。

当中继器接收到来自OBD
接口发送的指令后,经过指令判断与过滤,确定指令是否可以转发到CAN总线上。

本文完成了此中继器在嵌入式Linux系统下的驱动和中继,并加入ISO15031汽车指令集过滤器,通过嵌入式Linux系统自身的安全属性以及指令过滤增强了整个CAN总线系统的安全性。

1 硬件设计
本文采用i.MX6Quad处理器,该处理器是基于Cortex⁃A9内核的四核处理器,带有1 MB L2缓存和64 b DDR3和2通道、支持32 b LPDDR2。

硬件结构图包含五个组成部分,如图1所示。

其中:系统控制部分由锁相环、振荡器、时钟与复位电路、看门狗、定时器等组成;电源管理部分由电源模块和湿度监测仪组成;程序烧写模块采用NorFlash,便于进行拨码烧写;两个CAN接口的设计借助了参考文献[7]中提到的问题和解决方法。

具体设计如图2所示。

为了保证中继器工作可靠,采用隔离型的DC/DC变换器[7]。

对于CAN终端电阻使用分裂终端的方式,利用两个30 Ω电阻匹配屏蔽双绞线的60 Ω特性阻抗[8]。

CAN控制器选择了基于SPI控制器的MCP2515。

指示灯部分共使用了7个LED灯,1个灯用于上电指示,4个灯用于两路CAN接口的接收和发送指示灯,2个灯用于两路CAN通信故障指示。

2 CAN中继器程序设计
2.1 CAN接口驱动程序设计
CAN总线驱动程序的设计以Linux系统为开发平台,通过字符设备驱动的方式实现驱动程序的设计。

根据硬件设计图,MCP2515通过SPI的形式接入内核,通过向Linux内核添加SPI驱动对MCP2515进行驱动。

在Linux 3.0.35的内核中,SPI的驱动架构可以分为如下三个层次:SPI 核心层、SPI控制器驱动层和SPI设备驱动层。

具体驱动的结构图如图3所示。

Linux 中SPI驱动代码位于drivers/spi/spi.c目录。

SPI核心层是Linux的SPI核心部分,提供了核心数据结构的定义、SPI控制器驱动和设备驱动的注册、注销管理等API。

SPI控制器驱动层属于平台移植相关层。

它的职责是为系统中每条SPI总线实现相应的读写方法[9⁃10]。

SPI设备驱动层为用户接口层,其为用户提供了通过SPI总线访问具体设备的接口。

写驱动程序时首先要向Linux内核注册设备,注册完成后,执行make menuconfig配置内核选项,然后再编译内核,最后通过Mini USB接口将编译好的内核、文件系统一起烧写到集成的模块中。

2.2 CAN数据中继原理及程序设计
CAN中继的主要作用是对接收到的CAN报文进行过滤转发。

中继器的工作流程为:中继器上电时通过读取波特率设置电路和ID设置电路的状态,设置好波特率和ID值。

初始化完成后,iMX6Q通过监听两个CAN接口的中断完成数据的存储转发。

当CAN接口A收到总线上的数据包时产生中断,中断处理程序根据标准标识符和扩展标识符判断该数据包是标准帧还是扩展帧,同时将该ID值和ID过滤表中的值进行对比,若符合过滤条件则不转发,否则将数据包通过CAN接口B转发出去[11⁃12]。

根据本文需要,要求保证车载信息安全,需要结合ISO1503汽车故障诊断协议,实现协议过滤器功能。

ISO1503协议内容有9种模式[13],I协议过滤器根据这9种模式列出所有合法指令集,如果接收的指令匹配指令集,允许指令通过,否则丢弃。

根据上文完成两个CAN接口的驱动,在此只需实现数据的转发和过滤,由于此设备是用于汽车CAN总线上,防止黑客通过OBD接口使用非法指令对汽车进行攻击,因此结合汽车OBD指令集协议ISO15031完成指令集的过滤。

具体数据中继实现流程如图4所示。

对于数据转发的处理过程,通常采用环形缓冲区的方式来实现。

在参考文献[9]中提出关于环形缓冲器的问题:读和写在移动尾指针时均需进行“折行处理”(即当指针指到缓冲区内存的末尾时,需重新将其定向到缓冲区的首地址),环形缓冲区的执行效率并不高[14]。

为此,本文根据i.MX6Quad处理器的特点(自带32 KB的数据缓冲区域),对环形缓冲区做了改进,同时为了增强CAN总线的通信能力,提高通信效率。

具体做法为:
(1)在缓冲区域开辟两个4 KB的环形数据缓冲区,采用双FIFO的缓冲机制,在主监控程序的监控下对两路缓冲区进行监控。

(2)当主监控程序检测到CAN接口有信息传输时,此CAN接口产生中断,两路CAN 数据通过中断的方式将接收到的报文通过标识符的比较,放入各自对应的环形缓冲区。

(3)转发进程通过判断比较缓冲区的状态标识符决定转发的端口[15],将接收到的指令与配置文件ISO15031协议中的指令集进行匹配,决定数据转发或过滤,保证车载指令的安全。

3 中继测试及安全测试
本文设计的测试板如图5所示。

采用千目电子公司的USB转CAN接口卡对系统进行测试验证。

CAN总线的通信速率最高为1 Mb/s,本系统遵循CAN 2.0A技术规范,仲裁域采用11 b标识符,再加上64 b的数据域、控制域、CRC域等,每帧数据帧的长度为110 b左右[16]。

为了确定本实验调试的通信速率,首先找到汽车CAN总线接口,使用示波器测出CAN总线的波特率为125 Kb/s。

3.1 中继测试
CAN总线的传输距离与波特率有关,传输距离与波特率成反比,波特率越高,传输距离越短。

根据上述测出的CAN总线波特率为125 Kb/s,传输距离可在0~530 m之间。

由于本实验设备直接与CAN总线相连,实验测试中将实验距离设为1.5 m。

中继测试实验中将两个CAN子网波特率设置为125 Kb/s,通过手动以及自动定时两种向中继器一端发送数据,观察中继器能否正常工作,且双向通信是否均不丢帧。

先由CAN1接口向CAN2接口发送标准帧07 DF 01 02 03,然后由CAN2接口向CAN1接口发送相同的标准帧。

经过反复测试,抽取其中一次CAN2接口实验结果,CAN2接口实验结果如图6所示。

可以看出,CAN2接口既可以接收到数据,也可以发送数据,帧计数顺序依次递增,没有出现丢帧现象。

3.2 安全测试
在中继测试的基础上又进一步做了多次安全测试,安全测试与上述中继实验的不同之处在于将07 DF 01 02 03标准数据帧变为02 00 aa aa aa数据帧(非法数据帧)以及其他多种非法数据帧,实验结果为:当CAN1接口成功向CAN1接口发送数据帧时,CAN2接口没有接收到数据;同样当CAN2接口向CAN1接口发送数据帧时,CAN1接口也没有收到数据。

查看中继器中的非法数据日志文件,里面记录了发送的各种非法数据帧信息。

实验结果表明CAN中继器能够过滤掉非法指令。

4 结论
本文基于信息传输在OBD接口上存在的安全问题,采用i.MX6Quad处理器方案实现CAN中继器。

同时实现了在Linux系统下CAN的接口驱动,完成了车载CAN总线中继,使其性能和效率得到了很大提高;通过将Linux系统移植到硬件平台上,在Linux系统中植入
ISO15031汽车指令集过滤器,使得系统的安全性能得到提升。

基于本方案开发的CAN中继器通过了车载系统的安全测试,达到了预期的效果。

参考文献
[1] 黎永健,赵祚喜.汽车CAN总线概述及其故障诊断检测方法[J].应用科学,2010(2):119⁃120.
[2] REGT H D.车载网络让汽车驶上安全、舒适、环保的快车道[J].世界电子元器件,2007(12):27⁃29.
[3] 邱铁,刘晓艳,徐子川.双MCU的CAN总线中继器设计[J].单片机与嵌入式系统应
用,2008(9):71⁃73.
[4] 王刚.利用双口RAM实现双机系统的通信[J].计算机与数字工程,2008(1):123⁃124.
[5] 史久根,张培仁,陈真勇.CAN现场总线系统设计技术[M].北京:国防工业出版社,2004.
[6] 艾萱.基于独立双CAN控制器的中继器设计与实现[J].现代电子技术,2007,30(21):9⁃11.
[7] 莫琼华.基于STM32F105的CAN总线中继器的设计与实现[J].电子技术,2011(3):25⁃26.
[8] 王继国,吉吟东,孙新亚.CAN总线控制器MCP2515的原理及应用[J].电测与仪表,2004,41(1):52⁃56.
[9] 戴敏,曹杰.基于ARM的单芯片CAN总线中继器设计[J].测控技术,2010(5):
64⁃68.
[10] THOMPSON H A, BENITEZ⁃PEREZ H, LEE D, et al. A⁃CANbus⁃based
safety⁃critical distributed earoengine control systems architecture demonstrator [J]. Microprocessors and microsystems, 1999, 23(6): 345⁃355.
[11] 曾祥文,宋树祥,宾相邦.嵌入式Linux下波特率自适应的CAN总线驱动的实现[J].测控技术,2015(8):104⁃107.
[12] 朱振涛.基于ARM9的智能车载信息系统研究[D].秦皇岛:燕山大学,2007.
[13] 刘仁峰.基于PCI总线的嵌入式设备驱动程序设计与研究[D].武汉:华中科技大学,2004.
[14] 杨峰,吉吟东,薛明.CAN通信卡的Linux设备驱动程序设计实现[J].电子技术应用,2002(1):52⁃55.
[15] BAEK S H, JANG J W. Implementation of integrated OBD⁃II connector with external network [J]. Information systems, 2014, 50: 69⁃75.
[16] 王宏亮,田帅帅.基于C8051F060单片机SPI接口的CAN中继器设计[J].火炮发射与控制学报,2011(2):74⁃77.。

相关文档
最新文档