于合龍,李 丹,馬 麗
(吉林農(nóng)業(yè)大學(xué) 信息技術(shù)學(xué)院,吉林 長春 130118)
車載信息安全系統(tǒng)中CAN中繼器的設(shè)計與實現(xiàn)
于合龍,李丹,馬麗
(吉林農(nóng)業(yè)大學(xué) 信息技術(shù)學(xué)院,吉林 長春130118)
針對汽車OBD接口存在的安全隱患,設(shè)計了以i.MX6系列處理器為核心,通過其串行外設(shè)接口,利用MCP2515CAN控制器接入CAN總線的車載信息安全中繼器。在分析 Linux設(shè)備驅(qū)動程序工作原理的基礎(chǔ)上,闡述了CAN接口在Linux系統(tǒng)下的驅(qū)動程序設(shè)計方法,實現(xiàn)了CAN接口在Linux系統(tǒng)下的驅(qū)動,解決了汽車CAN總線的中繼問題。通過在Linux系統(tǒng)中添加ISO15031協(xié)議過濾器,實現(xiàn)了非法指令過濾,為車載信息在CAN總線上的傳輸提供了一層保護屏障。
CAN;信息安全;驅(qū)動程序;中繼器
CAN(Controller Area Network,控制器區(qū)域網(wǎng)絡(luò))總線廣泛地應(yīng)用于汽車上,主要用來實現(xiàn)車載網(wǎng)絡(luò)各個電控單元之間的信息交換,形成車載網(wǎng)絡(luò)系統(tǒng)。利用CAN總線、傳感器、控制器和執(zhí)行器通過串行數(shù)據(jù)線連接起來[1-2]。
OBD(On-Board Diagnostic)接口作為車載監(jiān)控系統(tǒng)的通信接口,通過CAN總線接入車載系統(tǒng)。OBD接口除了讀取故障碼以供修車外,首要的功能是提供車輛的各種工況數(shù)據(jù)。利用汽車OBD接口與汽車ECU通過CANBUS協(xié)議通信,就可以達到控制汽車某些部件的目的。為了消除此安全隱患,需要在OBD接口與CAN總線之間接入能夠保證信息安全的CAN中繼器,實現(xiàn)信息可靠傳輸與非法指令過濾。目前CAN中繼器的設(shè)計大多是MCU加控制器來實現(xiàn)的。例如文獻[3]中利用雙MCU實現(xiàn)CAN總線中繼器,文獻[4-5]中利用雙口RAM實現(xiàn)雙機系統(tǒng)的通信,文獻[6]中通過獨立雙CAN設(shè)計CAN中繼器等,在這些方案中,不僅電路冗余復(fù)雜,同時在MCU與CAN控制器交換數(shù)據(jù)時存在數(shù)據(jù)交換速度慢,準確性低等問題,而且沒有相應(yīng)系統(tǒng)的支撐,僅憑借獨立的硬件設(shè)備,很難保證車載信息傳輸安全。
基于上述分析,本文提出車載信息安全系統(tǒng)中繼器的設(shè)計方案。此中繼器一端通過CAN接口與OBD相連接,另一端通過CAN接口與CAN總線相連接。當(dāng)中繼器接收到來自O(shè)BD接口發(fā)送的指令后,經(jīng)過指令判斷與過濾,確定指令是否可以轉(zhuǎn)發(fā)到CAN總線上。本文完成了此中繼器在嵌入式Linux系統(tǒng)下的驅(qū)動和中繼,并加入ISO15031汽車指令集過濾器,通過嵌入式Linux系統(tǒng)自身的安全屬性以及指令過濾增強了整個CAN總線系統(tǒng)的安全性。
本文采用i.MX6Quad處理器,該處理器是基于Cortex-A9內(nèi)核的四核處理器,帶有1 MB L2緩存和64 b DDR3和2通道、支持32 b LPDDR2。
硬件結(jié)構(gòu)圖包含五個組成部分,如圖1所示。
圖1 硬件結(jié)構(gòu)圖
其中:系統(tǒng)控制部分由鎖相環(huán)、振蕩器、時鐘與復(fù)位電路、看門狗、定時器等組成;電源管理部分由電源模塊和濕度監(jiān)測儀組成;程序燒寫模塊采用NorFlash,便于進行撥碼燒寫;兩個CAN接口的設(shè)計借助了參考文獻[7]中提到的問題和解決方法。具體設(shè)計如圖2所示。
圖2 CAN接口
為了保證中繼器工作可靠,采用隔離型的DC/DC變換器[7]。對于CAN終端電阻使用分裂終端的方式,利用兩個30 Ω電阻匹配屏蔽雙絞線的60 Ω特性阻抗[8]。CAN控制器選擇了基于SPI控制器的MCP2515。
指示燈部分共使用了7個LED燈,1個燈用于上電指示,4個燈用于兩路CAN接口的接收和發(fā)送指示燈,2個燈用于兩路CAN通信故障指示。
2.1CAN接口驅(qū)動程序設(shè)計
CAN總線驅(qū)動程序的設(shè)計以Linux系統(tǒng)為開發(fā)平臺,通過字符設(shè)備驅(qū)動的方式實現(xiàn)驅(qū)動程序的設(shè)計。
根據(jù)硬件設(shè)計圖,MCP2515通過SPI的形式接入內(nèi)核,通過向Linux內(nèi)核添加SPI驅(qū)動對MCP2515進行驅(qū)動。在Linux 3.0.35的內(nèi)核中,SPI的驅(qū)動架構(gòu)可以分為如下三個層次:SPI核心層、SPI控制器驅(qū)動層和SPI設(shè)備驅(qū)動層。具體驅(qū)動的結(jié)構(gòu)圖如圖3所示。
Linux中SPI驅(qū)動代碼位于drivers/spi/spi.c目錄。SPI核心層是Linux的SPI核心部分,提供了核心數(shù)據(jù)結(jié)構(gòu)的定義、SPI控制器驅(qū)動和設(shè)備驅(qū)動的注冊、注銷管理等API。SPI控制器驅(qū)動層屬于平臺移植相關(guān)層。它的職責(zé)是為系統(tǒng)中每條SPI總線實現(xiàn)相應(yīng)的讀寫方法[9-10]。SPI設(shè)備驅(qū)動層為用戶接口層,其為用戶提供了通過SPI總線訪問具體設(shè)備的接口。寫驅(qū)動程序時首先要向Linux內(nèi)核注冊設(shè)備,注冊完成后,執(zhí)行make menuconfig配置內(nèi)核選項,然后再編譯內(nèi)核,最后通過Mini USB接口將編譯好的內(nèi)核、文件系統(tǒng)一起燒寫到集成的模塊中。
圖3 SPI驅(qū)動結(jié)構(gòu)圖
2.2CAN數(shù)據(jù)中繼原理及程序設(shè)計
CAN中繼的主要作用是對接收到的CAN報文進行過濾轉(zhuǎn)發(fā)。中繼器的工作流程為:中繼器上電時通過讀取波特率設(shè)置電路和ID設(shè)置電路的狀態(tài),設(shè)置好波特率和ID值。初始化完成后,iMX6Q通過監(jiān)聽兩個CAN接口的中斷完成數(shù)據(jù)的存儲轉(zhuǎn)發(fā)。當(dāng)CAN接口A收到總線上的數(shù)據(jù)包時產(chǎn)生中斷,中斷處理程序根據(jù)標(biāo)準標(biāo)識符和擴展標(biāo)識符判斷該數(shù)據(jù)包是標(biāo)準幀還是擴展幀,同時將該ID值和ID過濾表中的值進行對比,若符合過濾條件則不轉(zhuǎn)發(fā),否則將數(shù)據(jù)包通過CAN接口B轉(zhuǎn)發(fā)出去[11-12]。
根據(jù)本文需要,要求保證車載信息安全,需要結(jié)合ISO1503汽車故障診斷協(xié)議,實現(xiàn)協(xié)議過濾器功能。ISO1503協(xié)議內(nèi)容有9種模式[13],I協(xié)議過濾器根據(jù)這9種模式列出所有合法指令集,如果接收的指令匹配指令集,允許指令通過,否則丟棄。
根據(jù)上文完成兩個CAN接口的驅(qū)動,在此只需實現(xiàn)數(shù)據(jù)的轉(zhuǎn)發(fā)和過濾,由于此設(shè)備是用于汽車CAN總線上,防止黑客通過OBD接口使用非法指令對汽車進行攻擊,因此結(jié)合汽車OBD指令集協(xié)議ISO15031完成指令集的過濾。具體數(shù)據(jù)中繼實現(xiàn)流程如圖4所示。
圖4 數(shù)據(jù)中繼程序設(shè)計流程圖
對于數(shù)據(jù)轉(zhuǎn)發(fā)的處理過程,通常采用環(huán)形緩沖區(qū)的方式來實現(xiàn)。在參考文獻[9]中提出關(guān)于環(huán)形緩沖器的問題:讀和寫在移動尾指針時均需進行“折行處理 ”(即當(dāng)指針指到緩沖區(qū)內(nèi)存的末尾時,需重新將其定向到緩沖區(qū)的首地址),環(huán)形緩沖區(qū)的執(zhí)行效率并不高[14]。為此,本文根據(jù)i.MX6Quad處理器的特點(自帶32 KB的數(shù)據(jù)緩沖區(qū)域),對環(huán)形緩沖區(qū)做了改進,同時為了增強CAN總線的通信能力,提高通信效率。具體做法為:
(1)在緩沖區(qū)域開辟兩個4 KB的環(huán)形數(shù)據(jù)緩沖區(qū),采用雙FIFO的緩沖機制,在主監(jiān)控程序的監(jiān)控下對兩路緩沖區(qū)進行監(jiān)控。
(2)當(dāng)主監(jiān)控程序檢測到CAN接口有信息傳輸時,此CAN接口產(chǎn)生中斷,兩路CAN數(shù)據(jù)通過中斷的方式將接收到的報文通過標(biāo)識符的比較,放入各自對應(yīng)的環(huán)形緩沖區(qū)。
(3)轉(zhuǎn)發(fā)進程通過判斷比較緩沖區(qū)的狀態(tài)標(biāo)識符決定轉(zhuǎn)發(fā)的端口[15],將接收到的指令與配置文件ISO15031協(xié)議中的指令集進行匹配,決定數(shù)據(jù)轉(zhuǎn)發(fā)或過濾,保證車載指令的安全。
本文設(shè)計的測試板如圖5所示。
圖5 CAN中繼器測試板
采用千目電子公司的USB轉(zhuǎn)CAN接口卡對系統(tǒng)進行測試驗證。CAN總線的通信速率最高為1 Mb/s,本系統(tǒng)遵循CAN 2.0A技術(shù)規(guī)范,仲裁域采用11 b標(biāo)識符,再加上64 b的數(shù)據(jù)域、控制域、CRC域等,每幀數(shù)據(jù)幀的長度為110 b左右[16]。為了確定本實驗調(diào)試的通信速率,首先找到汽車CAN總線接口,使用示波器測出CAN總線的波特率為125 Kb/s。
3.1中繼測試
CAN總線的傳輸距離與波特率有關(guān),傳輸距離與波特率成反比,波特率越高,傳輸距離越短。根據(jù)上述測出的CAN總線波特率為125 Kb/s,傳輸距離可在0~530 m之間。由于本實驗設(shè)備直接與CAN總線相連,實驗測試中將實驗距離設(shè)為1.5 m。中繼測試實驗中將兩個CAN子網(wǎng)波特率設(shè)置為125 Kb/s,通過手動以及自動定時兩種向中繼器一端發(fā)送數(shù)據(jù),觀察中繼器能否正常工作,且雙向通信是否均不丟幀。先由CAN1接口向CAN2接口發(fā)送標(biāo)準幀07 DF 01 02 03,然后由CAN2接口向CAN1接口發(fā)送相同的標(biāo)準幀。經(jīng)過反復(fù)測試,抽取其中一次CAN2接口實驗結(jié)果,CAN2接口實驗結(jié)果如圖6所示??梢钥闯觯珻AN2接口既可以接收到數(shù)據(jù),也可以發(fā)送數(shù)據(jù),幀計數(shù)順序依次遞增,沒有出現(xiàn)丟幀現(xiàn)象。
圖6 CAN總線調(diào)試工具終端接收界面圖
3.2安全測試
在中繼測試的基礎(chǔ)上又進一步做了多次安全測試,安全測試與上述中繼實驗的不同之處在于將07 DF 01 02 03標(biāo)準數(shù)據(jù)幀變?yōu)?2 00 aa aa aa數(shù)據(jù)幀(非法數(shù)據(jù)幀)以及其他多種非法數(shù)據(jù)幀,實驗結(jié)果為:當(dāng)CAN1接口成功向CAN1接口發(fā)送數(shù)據(jù)幀時,CAN2接口沒有接收到數(shù)據(jù);同樣當(dāng)CAN2接口向CAN1接口發(fā)送數(shù)據(jù)幀時,CAN1接口也沒有收到數(shù)據(jù)。查看中繼器中的非法數(shù)據(jù)日志文件,里面記錄了發(fā)送的各種非法數(shù)據(jù)幀信息。實驗結(jié)果表明CAN中繼器能夠過濾掉非法指令。
本文基于信息傳輸在OBD接口上存在的安全問題,采用i.MX6Quad處理器方案實現(xiàn)CAN中繼器。同時實現(xiàn)了在Linux系統(tǒng)下CAN的接口驅(qū)動,完成了車載CAN總線中繼,使其性能和效率得到了很大提高;通過將Linux系統(tǒng)移植到硬件平臺上,在Linux系統(tǒng)中植入ISO15031汽車指令集過濾器,使得系統(tǒng)的安全性能得到提升。基于本方案開發(fā)的CAN中繼器通過了車載系統(tǒng)的安全測試,達到了預(yù)期的效果。
[1]黎永健,趙祚喜.汽車CAN總線概述及其故障診斷檢測方法[J].應(yīng)用科學(xué),2010(2):119-120.
[2]REGT H D.車載網(wǎng)絡(luò)讓汽車駛上安全、舒適、環(huán)保的快車道[J].世界電子元器件,2007(12):27-29.
[3]邱鐵,劉曉艷,徐子川.雙MCU的CAN總線中繼器設(shè)計[J].單片機與嵌入式系統(tǒng)應(yīng)用,2008(9):71-73.
[4]王剛.利用雙口RAM實現(xiàn)雙機系統(tǒng)的通信[J].計算機與數(shù)字工程,2008(1):123-124.
[5]史久根,張培仁,陳真勇.CAN現(xiàn)場總線系統(tǒng)設(shè)計技術(shù)[M].北京:國防工業(yè)出版社,2004.
[6]艾萱.基于獨立雙CAN控制器的中繼器設(shè)計與實現(xiàn)[J].現(xiàn)代電子技術(shù),2007,30(21):9-11.
[7]莫瓊?cè)A.基于STM32F105的CAN總線中繼器的設(shè)計與實現(xiàn)[J].電子技術(shù),2011(3):25-26.
[8]王繼國,吉吟東,孫新亞.CAN總線控制器MCP2515的原理及應(yīng)用[J].電測與儀表,2004,41(1):52-56.
[9]戴敏,曹杰.基于ARM的單芯片CAN總線中繼器設(shè)計[J].測控技術(shù),2010(5):64-68.
[10]THOMPSON H A,BENITEZ-PEREZ H,LEE D,et al.ACANbus-based safety-critical distributed earoengine control systems architecture demonstrator[J].Microprocessors and microsystems,1999,23(6):345-355.
[11]曾祥文,宋樹祥,賓相邦.嵌入式Linux下波特率自適應(yīng)的CAN總線驅(qū)動的實現(xiàn)[J].測控技術(shù),2015(8):104-107.
[12]朱振濤.基于ARM9的智能車載信息系統(tǒng)研究[D].秦皇島:燕山大學(xué),2007.
[13]劉仁峰.基于PCI總線的嵌入式設(shè)備驅(qū)動程序設(shè)計與研究[D].武漢:華中科技大學(xué),2004.
[14]楊峰,吉吟東,薛明.CAN通信卡的Linux設(shè)備驅(qū)動程序設(shè)計實現(xiàn)[J].電子技術(shù)應(yīng)用,2002(1):52-55.
[15]BAEK S H,JANG J W.Implementation of integrated OBD-II connector withexternal network[J].Informationsystems,2014,50:69-75.
[16]王宏亮,田帥帥.基于C8051F060單片機SPI接口的CAN中繼器設(shè)計[J].火炮發(fā)射與控制學(xué)報,2011(2):74-77.
Design and implementation of CAN repeater in vehicle-mounted information security system
YU Helong,LI Dan,MA Li
(College of Information Technology,Jilin Agricultural University,Changchun 130118,China)
Aiming at the potential safety hazard of the car on-board diagnostic(OBD)interface,a vehicle-mounted information safety repeater was designed,which takes i.MX6 series processor as the core,and uses the MCP2515 CAN controller to access into CAN bus through its serial peripheral interface.On the basis of analyzing the working principle of the Linux device driver,the driver design method of CAN interface under Linux system is expounded.The drive of CAN interface under Linux system was implemented,and the relaying problem of vehicle-mounted CAN bus was solved.The iso15031 protocol filter is added into Linux system to filter the illegal instructions,and provide a protective screening for transmitting the vehicle-mounted information through CAN bus.
CAN;information safety;driver;repeater
TN92-34
A
1004-373X(2016)17-0120-04
10.16652/j.issn.1004-373x.2016.17.030
2015-11-27
于合龍(1974—),男,博士研究生,教授。研究方向為嵌入式系統(tǒng)。李丹(1988—),女,在讀碩士。研究方向為嵌入式系統(tǒng)。馬麗(1980—),女,在讀博士生,副教授。研究方向為計算機網(wǎng)絡(luò)。