藍啟亮,吳光耀,王 帥,陳 聰
基于Python的CAN網絡數據庫管理分析
藍啟亮,吳光耀,王 帥,陳 聰
(比亞迪汽車工業有限公司 產品規劃及汽車新技術研究院,廣東 深圳 518118)
為高效管理車輛系統控制器局域網(CAN)網絡數據,基于對CAN網絡數據結構的研究及車載嵌入式軟件開發測試經驗的積累,提出一種基于Python的CAN網絡數據庫管理平臺的方法,實現多種格式CAN網絡數據庫文件的導入、數據編輯、數據自動校驗、數據自動對比和CAN網絡數據庫文件輸出,解決了當前主流CAN網絡數據庫管理工具編輯效率低、人工校驗和比對數據易出錯的缺陷,有效提高CAN網絡開發及CAN網絡各個節點控制器軟件開發的效率。
CAN網絡數據庫;數據抓取;Python
控制器局域網(Controller Area Network, CAN)網絡數據庫文件定義了CAN網絡中各個控制器節點報文信號信息,是CAN總線網絡通訊的密碼本[1-2]。在實際的車型研發項目中,CAN網絡數據庫隨著車型項目的推進逐步完善和迭代,各個控制器的數據收發模塊必須嚴格遵循正確定義的CAN網絡數據庫進行開發,方可保證項目的安全推進[3]。
當前CAN網絡數據庫的管理一般以Excel表格管理*.xlsx格式文本的形式或者Vecotor公司開發的CANdb++工具管理*.dbc格式文本的形式進行CAN數據定義和編輯[4-5]。隨著汽車電動化、智能化的發展,CAN總線數據越來越多,當CAN網絡數據庫文件進行變更時,各個控制器軟件開發工程師需要使用Excel或者CANdb++工具手動逐個篩選、檢查和比對CAN總線數據然后再對嵌入式軟件CAN通訊模塊中的C代碼進行逐一修改,如此逐個手動修改CAN報文信號重復低效的勞動方式特別容易出錯且出錯后不便于定位查找問題。
對于采用CAN通訊的汽車嵌入式軟件開發過程而言,軟件運行時環境(Run Time Environment, RTE)層CAN通訊數據交互定義方法固定,完全可以從嵌入式軟件RTE層抓取控制器中實際定義的CAN網絡數據,與系統輸入的CAN網絡數據統一實現同平臺工具管理:通過正則匹配的方式可以從嵌入式運行時環境RTE層C代碼或其他類文本格式的CAN網絡數據庫文件中獲取CAN網絡數據庫信息,利用統一的用戶圖形界面(Graphical User Interface, GUI)把不同版本的CAN網絡數據顯示在一個界面內,軟件開發人員只需要通過操作控件即可實現不同版本CAN網絡數據的導入、編輯、校驗和對比,操作便捷高效,開發人員可以從低效重復的工作中解脫出來,把更多精力放到應用層策略開發中。
CAN是由博世公司開發的一個汽車計算機控制系統和嵌入式工業控制局域網的國際通用總線協議[6-7]。CAN總線是一種基于消息的廣播式的串行通信總線協議,屬于多主控的總線系統。為實現CAN報文的發送與接收,各個控制器在RTE層軟件需要實現CAN總線數據的打包、解包、發送和接收等功能[8]。
DBC(Data Base CAN)文件是Vecor公司開發的用來描述單一CAN網絡配置信息的一種特定格式文件,通過CANdb++數據庫管理工具進行編輯管理,內容包含CAN總線上各個控制器節點信息、報文信息和信號信息,它可以被專業CAN測試工具識別,用來監測與分析CAN網絡上的報文數據,也可以用來模擬仿真某個CAN節點,是總線開發的重要輸出物,是軟件開發和軟件測試的重要參考。其主要內容包含但不限于如下:
1)節點(Node):定義在CAN總線上的所有接收方或發送方,節點名唯一;
2)報文(Message):報文是CAN網絡中交換與傳輸的數據單元,即接收方或發送方一次性要交流的數據塊。在DBC文件中,報文含有報文ID(MsgID)、數據長度(Dlc)、發送周期(Cyctime)等信息;
3)信號(Signal):信號是報文數據段的基本單元,在DBC中主要參數包含信號名(Signal)、起始位(Startbit)、信號長度(Length)、因子系數(Factor)、偏移量(Offset)等信息[9-10]。
DBC文件僅能表達單一的CAN總線數據,且當報文幀數據長度超過8個字節時無法通過CANdb++進行編輯[11-12]。在實際工程項目中,對于多路CAN網絡數據的管理和含有多幀總線數據的數據庫管理通常以自定義的Excel表格進行數據管理,由于Excel的局限性,無法通過Excel自動對比兩份不同的CAN總線數據的差異。
不論DBC文件格式的CAN網絡數據庫文件或者Excel文件格式的CAN網絡數據庫文件抑或是RTE層代碼中開發的CAN網絡數據,其實質都是一個或多個儲存了CAN網絡通信規則的文本文件,其中的字符包含了關鍵的節點、報文和信號三大部分的信息,且這些信息都是按照固定的規則進行組織。本文通過對不同格式的CAN網絡數據庫文件規則的分析,基于Python開發了一個DbcManager網絡數據庫管理平臺,快速識別并抓取不同格式的CAN網絡數據庫文件信息,通過SQLite數據庫和PyQt實現對CAN網絡數據庫文件數據的增刪查改等數據管理;開發數據校驗算法實現CAN報文信號數據的基本校驗;開發數據比對算法實現同格式版本不同CAN網絡數據庫變更的比對和不同格式版本不同CAN網絡數據庫變更的比對,有效提高嵌入式軟件開發效率,減少人工錯誤的引入。
為了解決CANdb++或Excel管理CAN網絡數據編輯效率低、不能校驗、無法對版本進行比對等難題,本文基于Python開發了一個運行于Windows操作系統上的DbcManager網絡數據庫管理平臺,集成CAN網絡數據讀取、編輯、校驗、比對、輸出等五項主要功能,所有的功能集中顯示在一個GUI界面中,其功能架構如圖1所示。

圖1 CAN網絡數據庫管理平臺
1)CAN網絡數據讀取:支持從嵌入式軟件RTE層代碼中抓取CAN總線數據、讀取標準dbc格式CAN總線數據和導入Excel格式總線數據共三種方式。
2)CAN網絡數據編輯:對數據的整理和結構化處理后顯示在GUI中,通過檢索算法和數據的樹結構方法實現數據的便捷查詢和編輯。
3)CAN網絡數據校驗:對CAN網絡數據信息按照Channel/Msg/Signal數據的基本規則進行數據檢查,輸出校驗分析報告。
4)CAN網絡數據比對:支持不同版本的CAN網絡數據的比對,輸出比對分析報告。
5)CAN網絡數據庫文件導出:CAN網絡數據讀取的反向操作。
CAN網絡數據庫管理平臺的GUI界面由菜單欄、工具欄、數據欄和狀態欄組成,如圖2所示。
菜單欄:負責完成導入數據的功能,導入的格式包括*.xlsx格式的Excel網絡數據庫文件、*.dbc格式的DBC網絡數據庫文件和嵌入式軟件的路徑。
工具欄:負責完成對數據的編輯功能,可以插入數據、修改數據、刪除數據、篩選數據、保存數據以及檢查CAN網絡數據庫等。
數據欄:數據欄中包含網絡(Channel)、報文(Msg)和信號(Sig)的具體信息。
狀態欄:顯示當前GUI界面中導入的數據來源以及當前數據欄中網絡(Channel)、報文(Msg)和信號(Sig)的數量。

圖2 GUI界面
為了滿足*.xlsx、*.dbc和嵌入式軟件RTE層代碼路徑三種不同格式的CAN網絡數據庫導入,基于正則匹配開發不同的算法抓取不同格式的CAN網絡數據庫文件中的CAN網絡數據庫信息,再通過統一定義的*.json文件整理抓取到的數據,最后將*.json數據插入到數據庫中,由用戶操作GUI界面與數據庫進行交互并將所需數據顯示在GUI界面上,如圖3所示。

圖3 導入數據的方式
抓取C文件格式的CAN網絡數據庫數據和抓取*.dbc格式的CAN網絡數據庫數據的方式原理基本一致,本質上都是將文本文件讀取到內存中,然后采用特定的正則匹配方法獲得所需數據。抓取*.xlsx格式的CAN網絡數據庫數據的方式也類似,唯一的區別是加載的數據來源于表格,通過openpyxl庫可以定位到所需的sheet和cell完成數據的逐個讀取并整理到*.json數據結構中。
統一的*.json數據結構不僅需要映射完整的CAN網絡數據庫字段以適配不同格式的CAN網絡數據庫數據,并且考慮到CAN網絡數據庫數據之間有明顯的內在層次和邏輯,通過多表外鍵級聯的形式實現CAN網絡數據庫網絡、報文和信號的關聯,將*.json文件分為Channel.json、Msg.json和Signal.json三個文件對CAN網絡數據庫數據進行本地化的臨時存儲,每個json文件由若干個數據字典組成,每個字典對應的關鍵字如表1所示。
表1 *.json數據字段定義
序號Channel.json數據字段Msg.json數據字段Signal.json數據字段 1ChannelnameMsgnameSigname 2Cantypebl2_ChannelMsgID 3 MsgIDMulti_ID 4 Dec_MsgIDStartbit 5 DLCLength 6 Rx_or_TxByte_Order 7 CyctimeValuetype 8 Factor 9 Offset 10 Min 11 Max 12 Unit 13 Receiver 14 Startvalue 15 Comment 16 Valuetable 17 Start_Pos 18 End_Pos
SQLite數據庫是一個輕量級的開源數據庫系統,以其單一的磁盤文件形式、零配置的使用前提和簡單易用的特性廣泛應用在桌面應用程序的數據管理項目中。在本文的CAN網絡數據庫管理平臺同樣采用SQLite數據庫對CAN網絡數據庫數據進行管控,自主開發了一系列的應用程序編程接口(Application Programming Interface, API)函數,便捷地實現*.json數據的批量導入以及與GUI界面控件的數據交互,實現數據的增刪查改,在GUI界面上顯示用戶需求的CAN網絡數據庫數據。
為了將*.json數據文件中的字典數據集高效地導入SQLite數據庫,開發了*.json矩陣數據批量插入到SQLite表中的算法,其運作方式如圖4所示。首先確認*.json數據文件是否存在,若存在則讀取*.json數據至內存,然后以*.json文件名在SQLite中創建對應文件名的數據表,以字典關鍵字為創建數據表的列標題,若*.json中的字典數據完整有效,則向SQLite發送插入數據的SQL指令,完成數據插入工作。

圖4 數據庫的創建
與*.json數據文件對應,SQLite數據庫中使用三個數據表分別存儲Channel、Msg和Signal的各個屬性信息,如圖5所示。

圖5 CAN網絡數據庫SQLite數據庫
為了避免CAN網絡數據庫源文件自身存在的信息錯誤或使用CAN網絡數據庫管理平臺編輯CAN網絡數據時引入的信息錯誤,開發了校驗算法對CAN網絡數據的一些屬性進行必要的檢查,校驗項目如表2所示。
表2 自動校驗內容
序號內容對象 1info_loss_checkChannel/Msg/Sig 2value_error_checkSig 3bit_repeat_checkMsg/Sig
info_loss_check:分別將Channel/Msg/Sig中不可或缺的CAN網絡數據信息進行簡單的非空校驗,當信息缺失時記錄在報告中。
value_error_check:僅對info_loss_check校驗數據完整的Sig數據對象進行校驗:
1)依據Signame字段中涵蓋的信號起、止位與Startbit字段和Length字段進行校驗,Signame字段描述的起/止位應該與Startbit和Length描述的字節位一致;
2)依據Signame字段中涵蓋的信號起/止位和Startvalue字段、Min字段、Max字段、Valuetype字段、Offset字段、Factor字段進行校驗,計算的物理最值應該Min字段和Max字段范圍內,Startvalue也不能超過該范圍。
bit_repeat_check:對隸屬于每一個Msg的Sig對象進行bit位重復定義校驗,每一個bit位只能被一個Sig信號定義。
校驗不通過的數據在GUI中會標注為紅色,在GUI中的狀態欄會顯示錯誤數據的個數以及錯誤數據所在的Tablewidget。通過工具欄的上一個錯誤按鈕控件或下一個錯誤按鈕控件,可以在數據欄中快速跳轉到錯誤數據行,用戶需要對錯誤信息進行修改并保存數據后,才可以進行CAN網絡數據庫文件的生成。
CAN網絡數據庫文件定義了整個車型CAN總線上交互的各個節點報文信號的信息,是車輛嵌入式軟件開發與測試的密碼本。然而在實際車型項目的研發過程中,CAN網絡數據會隨著車型項目開發進展不斷地完善與變更,各個控制器嵌入式軟件CAN通訊模塊代碼也需要隨之做出對應變更修改。對嵌入式軟件開發人員而言,明確每次輸入的CAN網絡數據庫文件的變更內容以及CAN網絡數據庫文件與當前嵌入式軟件CAN通訊模塊代碼中的CAN網絡數據的差異,是極其繁瑣而又十分重要的內容。
DbcManager支持DBC格式導入、Excel格式導入和嵌入式軟件RTE層代碼中抓取共三種方式獲得CAN網絡數據,導入DbcManager的CAN網絡數據經過結構化整理后以*.db3存儲在SQLite數據庫中。對兩個不同的CAN網絡數據庫比對流程如圖6所示。

圖6 CAN網絡數據庫比對流程
選取兩個待比對的CAN網絡SQLite數據庫A.db3和CAN網絡SQLite數據庫B.db3,分別從中反向導出json格式數據文件Channel.json、Msg.json、Sig.json。
分別遍歷兩份Channel.json、Msg.json、Sig. json中的每一個數據對象獲得兩份CAN網絡數據的差異信息,差異信息內容包含內容增加item_ added、內容刪除item_removed和內容變更values_ changed,依據差異信息自動生成比對報告。
CAN網絡數據庫文件導出即導入CAN網絡數據的反向操作。在CAN網絡數據庫管理平臺GUI的菜單欄可以選擇*.xlsx格式、*.dbc格式和*.db3格式進行CAN網絡數據庫文件的輸出。為了避免輸出的CAN網絡數據庫文件存在低級的數據錯誤,在生成CAN網絡數據庫文件之前會自動調用校驗程序對數據庫中的CAN網絡數據庫數據進行檢查校驗,若不存在錯誤則生成指定格式的CAN網絡數據庫文件,否則提示“對錯誤信息進行修改后再執行該操作”。
本文基于Python開發的DbcManager是一個運行于Windows環境的圖形用戶界面可執行程序,可以便捷地加載不同格式的CAN網絡數據庫文件進行編輯、校驗和不同CAN網絡數據庫之間的數據比對。下面以一個實際工程應用進行詳細說明。
使用DbcManager導入某項目系統工程師提供的DBC文件進行校驗,自動生成校驗報告;再使用DbcManager讀取某控制器嵌入式軟件代碼中的CAN網絡數據和該DBC文件CAN網絡數據進行比對,自動生成比對報告。
導入的DBC文件CAN網絡數據如表3所示,包含4個DBC文件,共126個報文信息和1 220個信號信息。DbcManager校驗后生成的測試結果顯示共有43個信息存在數據值不正確,共3個報文信號存在Bit位重復定義,如圖7所示。
表 3 DbcManager校驗功能基本信息確認
測試人員測試項目數據來源基本信息 DbcManagerCAN網絡數據校驗D:/總線網絡協議.dbcChannel:4Msg:126Signal:1 220

在DbcManager中選擇兩份CAN網絡數據庫進行數據比對,基本信息如表4所示。點擊開始比對按鈕后,將分別遍歷兩份數據庫中Channel、Msg和Sig中各個字段的差異,自動生成的部分測試報告如圖8所示。
表4 DbcManager比對功能基本信息確認
測試人員測試項目數據來源A數據來源B DbcManagerCAN網絡數據比對D:/總線網絡協議.dbcD:/Project/BSW

圖8 DbcManager比對結果
本文研究了一種基于Python的DbcManager CAN網絡數據庫管理平臺,通過構建不同算法適配不同格式的CAN網絡數據庫信息導入,通過SQLite數據庫完成對CAN網絡數據信息的統一管理,開發桌面用戶端集成數據抓取、數據編輯、數據校驗以及CAN網絡數據庫文件的生成等功能。實踐表明,DbcManager人機界面友好易于使用,多種方式篩選CAN網絡數據庫數據,編輯數據方便快捷;自動校驗數據,自動比對數據,減少人為操作,降低出錯風險,極大地提高了工作效率,對CAN網絡的開發和CAN網絡各個節點控制器軟件的開發有高效的輔助作用。
[1] 陳穎,鐘成,李興華,等.自適應的車內CAN總線安全機制[J].信息安全研究,2019,5(12):1076-1088.
[2] 胡志云.基于CAN總線在車輛中的應用[J].山西電子技術,2020(1):59-60,64.
[3] 馬建輝,胡代榮,郭坤.一種汽車CAN總線網關的報文接收和發送方法[J].現代電子技術,2018,41(11):5- 7,12.
[4] 方遒,姜瑜濤,張曉先,等.汽車電子基礎軟件標準體系研究[J].信息技術與標準化,2011(8):30-33,38.
[5] 江永聰.基于DBC的汽車CAN報文遠程采集與分析系統設計[J].電子技術與軟件工程,2014(14):203-204.
[6] 陳琪晟.基于DSP的CAN總線通信程序[J].鐵路通信信號工程技術,2015,12(2):43-48.
[7] 王永輝.CANoe在整車系統開發測試中的應用[J].汽車實用技術,2019,44(16):85-87.
[8] 惲海,曹瑩.2011年CAN總線車身控制系統需求與行業發展分析[J].汽車工業研究, 2012(6):33-37.
[9] 何曄.CAN總線報文丟失故障及其判定方法[J].科技視界,2015(33):126.
[10] 江永聰.基于DBC的汽車CAN報文遠程采集與分析系統設計[J].電子技術與軟件工程,2014(14):203-204.
[11] International Organization for Standardization.Diag- nostics on Controller Area Networks (CAN) Part2: Network Layer Services:ISO 15765-2:2004[S].Genève: ISO,2004.
[12] Vector Informatik GmbH.User Manual Function Ver- son1.1[EB/OL].(2012-10-05)[2022-11-16].https://cdn. vector.com/cms/content/products/vtsystem/Docs/VT_System_Manual_VT7820_EN.pdf.
Analysis of CAN Network Database Management Based on Python
LAN Qiliang, WU Guangyao, WANG Shuai, CHEN Cong
( Product Planning and Automotive New Technology Research Institute, BYD Automobile Industry Company Limited, Shenzhen 518118, China )
In order to efficiently manage the controller area network(CAN) data of vehicle system, based on the research of CAN network data structure and the accumulation of experience in the development and testing of on-board embedded software, a method of CAN network database management platform based on Python is proposed to realize the import, data editing, data automatic verification, data automatic comparison and CAN network database file output of various formats. It solves the defects of low editing efficiency of the current mainstream CAN network database management tools and the error prone to manual verification and comparison of data, and effectively improves the efficiency of CAN network development and CAN network node controller software development.
CAN network database; Data capture;Python
U469.7
A
1671-7988(2023)17-42-07
10.16638/j.cnki.1671-7988.2023.017.008
藍啟亮(1993-),男,碩士,研究方向為嵌入式軟件開發與測試,E-mail:lamnas@126.com。