杜海賓,姜 正,于 健,陳廣泰,陳 雪
(中國(guó)中車股份有限公司 中車大連機(jī)車研究所有限公司,遼寧 大連 116000)
隨著我國(guó)經(jīng)濟(jì)不斷發(fā)展和行業(yè)內(nèi)互連互通程度的加深,作為經(jīng)濟(jì)發(fā)展必要助推劑的軌道交通行業(yè)也得到了迅速發(fā)展。鐵路機(jī)車作為軌道交通的重要組成部分,其車載系統(tǒng)、車載設(shè)備、監(jiān)控裝置等裝備的信息化程度得到不斷提升,這些系統(tǒng)和設(shè)備相互之間的通信數(shù)據(jù)量也越來(lái)越龐大。在既有通信模式下,如何更加簡(jiǎn)便、易懂、高效、快速地進(jìn)行大數(shù)據(jù)序列化處理已成為提高設(shè)備通信交互水平、增強(qiáng)數(shù)據(jù)峰值應(yīng)對(duì)能力的關(guān)鍵因素。
當(dāng)前鐵路機(jī)車的系統(tǒng)與系統(tǒng)之間、系統(tǒng)與設(shè)備之間、設(shè)備與設(shè)備之間進(jìn)行通信交互時(shí),數(shù)據(jù)處理的序列化方式多采用二進(jìn)制協(xié)議方式或文本傳輸協(xié)議方式。隨著機(jī)車系統(tǒng)種類的增加和設(shè)備數(shù)量的增大,設(shè)備間的互聯(lián)互通產(chǎn)生了更加龐大的交互數(shù)據(jù)信息量,這使得常用的2種序列化處理方式在數(shù)據(jù)序列化能力、數(shù)據(jù)可讀性、平臺(tái)兼容性、維護(hù)擴(kuò)展能力等方面顯得不足,如數(shù)據(jù)序列化占用資源多且時(shí)間長(zhǎng)、數(shù)據(jù)協(xié)議繁多復(fù)雜且不通用、數(shù)據(jù)交互帶寬需求高、較小的需求變更需要增加較大工作量等問(wèn)題,間接地增加了人力、物力和時(shí)間成本消耗。
因此,在數(shù)據(jù)處理方面,追求更加便捷高效、跨平臺(tái)、可讀性強(qiáng)、擴(kuò)展維護(hù)方便的通信數(shù)據(jù)序列化方式的需求日益強(qiáng)烈[1-2]。選用一種更為友好、高效、安全的數(shù)據(jù)序列化方式不僅能夠?qū)⒂脩魪耐ㄐ艛?shù)據(jù)結(jié)構(gòu)和通信協(xié)議繁瑣的應(yīng)用工作中解脫出來(lái),而且能夠增加通信交互效率、減小通信總線占用壓力,達(dá)到事半功倍的效果[3-5]。基于FlatBuffers的數(shù)據(jù)序列化技術(shù)以其更高效的數(shù)據(jù)處理速率與效率、更友好的接口封裝與調(diào)用、更便捷的數(shù)據(jù)移植與擴(kuò)展、更可靠的信息安全管理與保障等優(yōu)勢(shì)逐漸得到人們的更多關(guān)注。
數(shù)據(jù)序列化技術(shù)是指將數(shù)據(jù)以特定方式轉(zhuǎn)換成可以存儲(chǔ)或傳輸?shù)臄?shù)據(jù)信息的過(guò)程,一般涵蓋數(shù)據(jù)結(jié)構(gòu)組織、通信協(xié)議制定、數(shù)據(jù)序列化打包編碼和數(shù)據(jù)反序列化拆包解碼等多個(gè)數(shù)據(jù)處理環(huán)節(jié)?;贔latBuffers的數(shù)據(jù)序列化技術(shù)相對(duì)于常用的數(shù)據(jù)序列化技術(shù),如二進(jìn)制序列化技術(shù)、文本序列化技術(shù)等具有明顯的優(yōu)勢(shì)。
二進(jìn)制序列化技術(shù)對(duì)數(shù)據(jù)內(nèi)容不做特殊處理,發(fā)送端僅按照約定的數(shù)據(jù)結(jié)構(gòu)、通信協(xié)議組織數(shù)據(jù)信息的緩存、讀取、打包、編碼,并以原始二進(jìn)制數(shù)據(jù)流的形式通過(guò)通信介質(zhì)進(jìn)行傳輸;接收端依據(jù)與發(fā)送端相同的數(shù)據(jù)結(jié)構(gòu)、通信協(xié)議讀取緩存區(qū)中收到的數(shù)據(jù)并拆包、解碼后還原原始數(shù)據(jù)信息,二進(jìn)制序列化數(shù)據(jù)流程如圖1所示。這種序列化方式具有內(nèi)存空間占用小、加密校驗(yàn)靈活的優(yōu)點(diǎn),但其可讀性差、非跨平臺(tái)、擴(kuò)展維護(hù)性差等[6]方面的缺點(diǎn)給用戶帶來(lái)繁重的工作負(fù)擔(dān)。其中,可讀性差表現(xiàn)為數(shù)據(jù)信息必須參照詳細(xì)的數(shù)據(jù)結(jié)構(gòu)和通信協(xié)議才能準(zhǔn)確解讀;非跨平臺(tái)表現(xiàn)為不同硬件平臺(tái)和系統(tǒng)環(huán)境在機(jī)器字節(jié)序與對(duì)齊方式上的差異將導(dǎo)致數(shù)據(jù)信息無(wú)法正確解析;擴(kuò)展維護(hù)性差表現(xiàn)為除數(shù)據(jù)以追加處理方式外,任何數(shù)據(jù)結(jié)構(gòu)和通信協(xié)議的變更將導(dǎo)致原有數(shù)據(jù)處理方式無(wú)法繼續(xù)使用。
圖1 二進(jìn)制序列化數(shù)據(jù)流程Fig.1 Data processing flow of binary serialization
文本序列化技術(shù)是在二進(jìn)制序列化技術(shù)基礎(chǔ)上以一種更加友好的、可讀性的數(shù)據(jù)協(xié)議方式組織封裝數(shù)據(jù)的序列化技術(shù),目前使用最為廣泛的文本序列化技術(shù)有Json,Xml和Yaml[7-8]。文本序列化數(shù)據(jù)流程如圖2所示。這種方式的優(yōu)缺點(diǎn)同二進(jìn)制序列化方式的優(yōu)缺點(diǎn)相反,它具有可讀性強(qiáng)、跨平臺(tái)、跨語(yǔ)言、易擴(kuò)展等優(yōu)點(diǎn),但存在內(nèi)存和傳輸帶寬占用高等不足[9-10]。
圖2 文本序列化數(shù)據(jù)流程Fig.2 Data processing flow of textual serialization
FlatBuffers數(shù)據(jù)序列化技術(shù)是以類庫(kù)方式開(kāi)源發(fā)布的一種高性能、跨平臺(tái)、高安全、多語(yǔ)言支持的新一代數(shù)據(jù)序列化技術(shù),滿足了數(shù)據(jù)處理在實(shí)時(shí)性、高頻交互、大數(shù)據(jù)量等多個(gè)方面的苛刻要求。
FlatBuffers數(shù)據(jù)序列化技術(shù)在融合二進(jìn)制序列化技術(shù)和文本序列化技術(shù)優(yōu)點(diǎn)的基礎(chǔ)上,提供了更友好、完善的接口封裝數(shù)據(jù)處理服務(wù),以更加高效、便捷、安全的方式將用戶從數(shù)據(jù)結(jié)構(gòu)組織、通信協(xié)議制定等環(huán)節(jié)解放出來(lái)。FlatBuffers數(shù)據(jù)序列化流程如圖3所示。
圖3 Flatbuffers數(shù)據(jù)序列化流程Fig.3 Data processing flow of Flatbuffers-based serialization
FlatBuffers數(shù)據(jù)序列化技術(shù)具有以下特點(diǎn)。 ①自動(dòng)數(shù)據(jù)序列化。用戶只需組織數(shù)據(jù)結(jié)構(gòu),調(diào)用FlatBuffers標(biāo)準(zhǔn)接口即可自動(dòng)完成數(shù)據(jù)序列化,從而避免了繁瑣的通信協(xié)議制定、數(shù)據(jù)打包與拷貝、數(shù)據(jù)拆包與解碼等過(guò)程。②高效性。開(kāi)源類庫(kù)接口提供更少環(huán)節(jié)、更加高效的數(shù)據(jù)編碼和解碼過(guò)程。③高擴(kuò)展與靈活性。支持可選字段功能,為數(shù)據(jù)結(jié)構(gòu)與通信協(xié)議的增刪改預(yù)留彈性空間。 ④跨平臺(tái)。支持包括Windows,Linux在內(nèi)的多種系統(tǒng)與多種數(shù)據(jù)寬度位數(shù)的硬件平臺(tái),具有良好的編譯器兼容特性。⑤易于理解。面向用戶的數(shù)據(jù)是以原始數(shù)據(jù)結(jié)構(gòu)形式展現(xiàn)的(如struct,enum等),用戶不需要額外的協(xié)議文檔就能直觀地獲取數(shù)據(jù)字段含義。⑥最小代碼依賴。僅需要少量的自動(dòng)生成代碼文件依賴,方便軟件系統(tǒng)集成和應(yīng)用調(diào)用。
FlatBuffers數(shù)據(jù)序列化技術(shù)通過(guò)3步實(shí)現(xiàn)。
(1)構(gòu)建編譯器。Flatbuffers提供了獨(dú)特的編譯工具flatc,它能將指定的數(shù)據(jù)結(jié)構(gòu)文件轉(zhuǎn)換為用戶應(yīng)用開(kāi)發(fā)調(diào)用的目標(biāo)接口頭文件。flatc面向除C語(yǔ)言外的所有語(yǔ)言(Flatbuffers為C語(yǔ)言提供了專用的flatcc)。①確保機(jī)車設(shè)備的運(yùn)行環(huán)境或者其宿主設(shè)備的開(kāi)發(fā)環(huán)境中已經(jīng)安裝CMake工具,用以構(gòu)建Flatbuffers的編譯規(guī)則文件。②在機(jī)車設(shè)備環(huán)境指定的Flatbuffers工程根目錄下,依次執(zhí)行make和make install命令以完成flatc編譯器工具的編譯和安裝工作。③通過(guò)輸入命令flatc --version查看并確認(rèn)編譯器編譯工具是否安裝成功。
(2)編譯接口文件。schema文件(IDL文件)為原始數(shù)據(jù)結(jié)構(gòu)的組織文件,需要依據(jù)具體業(yè)務(wù)需要進(jìn)行組織編寫(xiě)。編寫(xiě)schema文件需要遵循一定的變量類型與語(yǔ)法要求(同C++/C語(yǔ)言類似),最終以“.fbs”的后綴形式保存。在當(dāng)前系統(tǒng)環(huán)境下使用flatc編譯工具編譯schema文件,編譯器將自動(dòng)生成指定目標(biāo)語(yǔ)言的含有豐富序列化接口函數(shù)的頭文件,如自動(dòng)生成C++使用的頭文件fb_api.hpp。
(3)接口調(diào)用。將生成的接口頭文件(如fb_api.hpp)提供給數(shù)據(jù)發(fā)送端和數(shù)據(jù)接收端以便于接口調(diào)用。①數(shù)據(jù)發(fā)送端實(shí)例化一個(gè)flatbuffers:: FlatBufferBuilder類,使用該類的實(shí)例調(diào)用指定頭文件(如fb_api.hpp)中提供的對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換接口函數(shù),即可完成自動(dòng)編碼并獲取原始數(shù)據(jù)結(jié)構(gòu)二進(jìn)制數(shù)據(jù)流。②數(shù)據(jù)接收端實(shí)例化一個(gè)flatbuffers::FlatBufferBuilder類,使用該類的實(shí)例調(diào)用指定頭文件(如fb_api.hpp)中提供的對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換接口函數(shù),以解碼反序列化接收的數(shù)據(jù)流,函數(shù)自動(dòng)解析并返回發(fā)送端的原始數(shù)據(jù)結(jié)構(gòu)體。
通過(guò)對(duì)FlatBuffers數(shù)據(jù)序列化技術(shù)優(yōu)勢(shì)分析,其更適合應(yīng)用于HXD2機(jī)車輔助駕駛系統(tǒng)(ATO)與列車控制管理系統(tǒng)(TCMS)及制動(dòng)控制單元(BCU)等機(jī)車主控系統(tǒng)間的通信交互中。ATO依據(jù)機(jī)車牽引與制動(dòng)特性,基于列車運(yùn)行線路數(shù)據(jù)、機(jī)車信號(hào)狀態(tài)、列車編組、運(yùn)行揭示等信息,結(jié)合運(yùn)行時(shí)間和速度限制要求,在線規(guī)劃最優(yōu)列車運(yùn)行速度及牽引制動(dòng)狀態(tài),實(shí)時(shí)控制列車按照規(guī)劃速度曲線運(yùn)行。該系統(tǒng)需要依據(jù)多種機(jī)車數(shù)據(jù)處理復(fù)雜的業(yè)務(wù)場(chǎng)景,系統(tǒng)各設(shè)備間數(shù)據(jù)通信交互頻繁,對(duì)通信數(shù)據(jù)的處理效率、通信響應(yīng)時(shí)延、通信數(shù)據(jù)安全、運(yùn)用擴(kuò)展維護(hù)等多個(gè)方面有著更高的要求,而基于FlatBuffers的數(shù)據(jù)序列化技術(shù)更為貼合該系統(tǒng)的通信數(shù)據(jù)處理需求。
TCMS作為機(jī)車網(wǎng)絡(luò)設(shè)備的主控系統(tǒng),主要實(shí)現(xiàn)對(duì)整車關(guān)鍵設(shè)備的運(yùn)行控制、運(yùn)行監(jiān)測(cè)、數(shù)據(jù)處理等;BCU是控制列車空氣制動(dòng)的主控單元,主要實(shí)現(xiàn)對(duì)列車自閥、單閥的空氣制動(dòng)施加、緩解、自監(jiān)測(cè)等。外部設(shè)備如果需要對(duì)機(jī)車網(wǎng)絡(luò)系統(tǒng)、空氣制動(dòng)系統(tǒng)進(jìn)行控制和監(jiān)測(cè)均需要通過(guò)連接TCMS和BCU來(lái)間接實(shí)現(xiàn),由于涉及列車運(yùn)行安全、運(yùn)行平穩(wěn)、運(yùn)行效能等因素,外部設(shè)備與TCMS和BCU通信的效率與時(shí)延成為一個(gè)重要的因素和衡量指標(biāo)。
ATO與TCMS、BCU之間進(jìn)行通信交互的數(shù)據(jù)主要分為3種:實(shí)時(shí)數(shù)據(jù)、消息數(shù)據(jù)和心跳校驗(yàn)數(shù)據(jù)。實(shí)時(shí)數(shù)據(jù)為表征當(dāng)前設(shè)備或機(jī)車狀態(tài)的數(shù)據(jù),采用基于UDP的異步校驗(yàn)通信方式,實(shí)時(shí)數(shù)據(jù)發(fā)送不需要應(yīng)答,以確保數(shù)據(jù)的高效高頻通信;消息數(shù)據(jù)為表征操作動(dòng)作的指令數(shù)據(jù),采用基于TCP的同步校驗(yàn)通信方式,消息事件需要應(yīng)答,以確保消息事件發(fā)送與接收的完整性和準(zhǔn)確性;心跳校驗(yàn)數(shù)據(jù)采用基于TCP的異步通信方式,用于確保設(shè)備之間連接的有效性和合法性。設(shè)備之間通信數(shù)據(jù)信息如表1所示。
表1 設(shè)備之間通信數(shù)據(jù)信息Tab.1 Communication data between equipment
基于FlatBuffers技術(shù)特定的數(shù)據(jù)組織方式,借助其靈活的應(yīng)用編譯服務(wù),用戶能夠簡(jiǎn)便快捷地獲得通用編程語(yǔ)言接口文件,從而為應(yīng)用軟件編寫(xiě)提供更加高效、友好的標(biāo)準(zhǔn)化數(shù)據(jù)處理接口調(diào)用。
步驟1:依據(jù)具體業(yè)務(wù)場(chǎng)景,組織創(chuàng)建原始數(shù)據(jù)結(jié)構(gòu),并匯總形成schema數(shù)據(jù)文件。以TCMS發(fā)送至ATO的部分實(shí)時(shí)數(shù)據(jù)為例,原始數(shù)據(jù)結(jié)構(gòu)與對(duì)應(yīng)的schema數(shù)據(jù)結(jié)構(gòu)如圖4所示。
圖4 原始數(shù)據(jù)結(jié)構(gòu)與對(duì)應(yīng)的schema數(shù)據(jù)結(jié)構(gòu)Fig.4 Original data structure and corresponding schema data structure
步驟2:編譯schema文件,自動(dòng)生成數(shù)據(jù)序列化與反序列化接口C++頭文件。
步驟3:ATO應(yīng)用軟件引用接口C++頭文件,依照原始數(shù)據(jù)結(jié)構(gòu)組織數(shù)據(jù)。調(diào)用數(shù)據(jù)序列化接口函數(shù)實(shí)現(xiàn)預(yù)發(fā)送數(shù)據(jù)的自動(dòng)序列化,調(diào)用數(shù)據(jù)反序列化接口函數(shù)實(shí)現(xiàn)接收數(shù)據(jù)自動(dòng)反序列化。
步驟4:TCMS應(yīng)用軟件引用接口C++頭文件,依照原始數(shù)據(jù)結(jié)構(gòu)組織數(shù)據(jù)。調(diào)用數(shù)據(jù)反序列化接口函數(shù)實(shí)現(xiàn)接收數(shù)據(jù)自動(dòng)反序列化;調(diào)用數(shù)據(jù)序列化接口函數(shù)實(shí)現(xiàn)預(yù)發(fā)送數(shù)據(jù)的自動(dòng)序列化。
步驟5:BCU應(yīng)用軟件引用接口C++頭文件,依照原始數(shù)據(jù)結(jié)構(gòu)組織數(shù)據(jù),調(diào)用方法與TCMS應(yīng)用軟件的處理方式相同。
ATO與TCMS、ATO與BCU間應(yīng)用調(diào)用流程如圖5所示。①ATO與TCMS通信交互調(diào)用。ATO作為T(mén)CP/UDP通信交互的客戶端,TCMS作為服務(wù)器端。②ATO與BCU通信交互調(diào)用。ATO作為T(mén)CP/UDP通信交互的客戶端,BCU作為服務(wù)器端。
圖5 ATO與TCMS、ATO與BCU應(yīng)用調(diào)用流程圖Fig.5 Flow charts for application calls of ATO with TCMS and BCU
基于相同硬件平臺(tái)(相同ATO,TCMS和BCU硬件設(shè)備)、相同網(wǎng)絡(luò)環(huán)境(同一帶寬的局域網(wǎng)內(nèi))、相同通信交互方式(均為T(mén)CP通信),將FlatBuffers數(shù)據(jù)序列化方式與二進(jìn)制序列化方式、文本序列化方式在數(shù)據(jù)序列化響應(yīng)延遲和數(shù)據(jù)序列化處理效率2個(gè)方面進(jìn)行性能對(duì)比。
(1)數(shù)據(jù)序列化響應(yīng)延遲體現(xiàn)了單位時(shí)間內(nèi)數(shù)據(jù)處理量的變化對(duì)數(shù)據(jù)序列化處理時(shí)間的總體變化趨勢(shì)情況,數(shù)據(jù)序列化響應(yīng)延遲對(duì)比示意圖如圖6所示。
圖6 數(shù)據(jù)序列化響應(yīng)延遲對(duì)比示意圖Fig.6 Time delay comparison of data serialization in different ways
式中:T數(shù)據(jù)序列化時(shí)延表示進(jìn)行數(shù)據(jù)序列化的時(shí)延,μs;T3為預(yù)傳輸數(shù)據(jù)序列化的完成時(shí)刻;T2為預(yù)傳輸數(shù)據(jù)開(kāi)始序列化的時(shí)刻。
式中:T數(shù)據(jù)反序列化時(shí)延表示進(jìn)行數(shù)據(jù)反序列化的時(shí)延,μs;T7為預(yù)接收數(shù)據(jù)開(kāi)始反序列化的時(shí)刻;T8為接收數(shù)據(jù)反序列化接收完成時(shí)刻。
由圖6可知,隨著不同設(shè)備之間通信交互數(shù)據(jù)量的增加,基于FlatBuffers序列化技術(shù)的數(shù)據(jù)通信響應(yīng)延遲基本保持不變;同時(shí),與使用基于二進(jìn)制序列化方式和基于Json的文本序列化方式的通信響應(yīng)延遲相比,基于FlatBuffers序列化技術(shù)的數(shù)據(jù)通信時(shí)延更低,更加符合機(jī)車外部設(shè)備與TCMS和BCU通信時(shí)對(duì)于通信穩(wěn)定性和低通信時(shí)延的要求。
(2)數(shù)據(jù)序列化處理效率體現(xiàn)在數(shù)據(jù)處理量的變化所帶來(lái)的總的數(shù)據(jù)處理時(shí)間的變化趨勢(shì)上,對(duì)比Flatbuffers序列化處理方式、二進(jìn)制序列化處理方式及文本序列化處理方式,數(shù)據(jù)序列化處理效率對(duì)比示意圖如圖7所示。
由圖7可知,相同通信時(shí)間內(nèi),相比基于二進(jìn)制序列化方式和基于Json的文本序列化方式,使用FlatBuffers序列化技術(shù)方式,在TCMS或BCU端所接收處理的原始數(shù)據(jù)量最大,即具有更高的通信效率。因此,F(xiàn)latBuffers序列化技術(shù)更加符合機(jī)車外部設(shè)備與TCMS或BCU通信時(shí)對(duì)于高通信效率的要求。
圖7 數(shù)據(jù)序列化處理效率對(duì)比示意圖Fig.7 Efficiency comparison of data serialization in different ways
經(jīng)過(guò)以上通信性能對(duì)比分析,應(yīng)用FlatBuffers數(shù)據(jù)序列化技術(shù)后,HXD2機(jī)車ATO與TCMS和ATO與BCU之間的通信交互在數(shù)據(jù)序列化方面的綜合性能得到一定的提升,提升效果為:響應(yīng)延遲率平均降低3%,處理效率平均提升5%。
此外,為了對(duì)比分析FlatBuffers技術(shù)在數(shù)據(jù)序列化中其他方面的性能,以64位Windows7環(huán)境作為共同的測(cè)試平臺(tái),以10個(gè)數(shù)值字段變量(1個(gè)struct、4個(gè)string或char數(shù)組、若干int/float標(biāo)量數(shù)據(jù))組成的數(shù)據(jù)流作為共同的處理對(duì)象分別進(jìn)行測(cè)試,相應(yīng)基準(zhǔn)測(cè)試Benchmark對(duì)比如表2所示。由表2可知,F(xiàn)latBuffers數(shù)據(jù)序列化技術(shù)方式較二進(jìn)制序列化方式、文本序列化技術(shù)方式等在跨平臺(tái)、可讀性、可維護(hù)性、便捷性、安全性、異常處理等多個(gè)方面均占有優(yōu)勢(shì)。
表2 基準(zhǔn)測(cè)試Benchmark對(duì)比Tab.2 Benchmark for performance comparison
作為提升數(shù)據(jù)處理速率和提高通信交互效率的一種數(shù)據(jù)應(yīng)用技術(shù),數(shù)據(jù)序列化技術(shù)一直受到技術(shù)人員的高度重視,而FlatBuffers數(shù)據(jù)序列化技術(shù)作為開(kāi)源的前沿技術(shù),以其更加高效、靈活、友好、安全的特性獲得了越來(lái)越多的認(rèn)可。通過(guò)共用平臺(tái)環(huán)境下的數(shù)據(jù)處理能力對(duì)比分析,以及在通信實(shí)時(shí)性要求較高的實(shí)際項(xiàng)目中的應(yīng)用驗(yàn)證可以得出,F(xiàn)latBuffers數(shù)據(jù)序列化技術(shù)較現(xiàn)行使用較為廣泛的技術(shù)具有更加突出的性能及功能優(yōu)勢(shì),在鐵路機(jī)車上的應(yīng)用與推廣能夠促進(jìn)軌道交通的互聯(lián)互通,并對(duì)提升鐵路運(yùn)用智能化、信息化、規(guī)范化水平起到了良好的推動(dòng)作用。