隨著行業(yè)的 SOA 理念大火,帶著一系列的解讀和思考觀點橫行于世,筆者大多仔細研讀過,雖然增加了很多碎片化知識和曾經(jīng)的盲點,但也同樣帶來了更多的疑惑,本文撰寫初衷是基于車廠的角度思考,如何在現(xiàn)有整車架構(gòu)和軟件資產(chǎn)下,進行 SOA 的設(shè)計開發(fā),并從工具鏈和操作方法上給出案例。
1. 分布式 ECU-基于信號的架構(gòu)設(shè)計
現(xiàn)在我們來看,在域控制器開發(fā)階段,針對傳統(tǒng)車廠,在分布式 ECU,或區(qū)域控制器集成,已經(jīng)有了深厚的架構(gòu)開發(fā)和經(jīng)驗積累的前提條件下,如何轉(zhuǎn)型并進行中央域控的服務(wù)設(shè)計。
本章節(jié)描述現(xiàn)階段,面對分布式 ECU,如何進行基于信號的整車電子電器架構(gòu)開發(fā)。如下為介紹 MBSE 理論的較為經(jīng)典文章。 服務(wù)設(shè)計相對軟件架構(gòu)設(shè)計影響較大,接下來著重分析 SOA 服務(wù)設(shè)計。
2. 中央域控架構(gòu)-基于 SOA 服務(wù)設(shè)計
為了后續(xù)方便理解,我們大致把國內(nèi)的整車電子電器架構(gòu)分為三個階段:
1.0 架構(gòu): 以逆向分析為主,整合現(xiàn)階段市面上供應(yīng)商的零部件,實現(xiàn)整車功能(典型代表 比亞迪 F3)
2.0 架構(gòu): 以正向開發(fā)為主,融合國內(nèi)外先進經(jīng)驗技術(shù),進行整車多車型的架構(gòu)開發(fā)(典型代表 吉利 CMA 架構(gòu))
3.0 架構(gòu):硬件上從分布式 ECU 變?yōu)檎囉蚩丶軜?gòu),軟件上由基于 signal 變?yōu)?SOA ,能夠大幅降低車輛上 ECU 數(shù)量,軟件迭代速度也由質(zhì)的飛躍(典型代表 特斯拉)
2.1. 服務(wù)設(shè)計依據(jù)
總體采用自上而下與自下而上想結(jié)合的形式進行服務(wù)定義。
針對網(wǎng)絡(luò)上全拓補硬件,進行自下而上設(shè)計,將其分為傳感器,執(zhí)行器,與單功能 ECU 三類,分別針對硬件進行設(shè)備抽象 api 設(shè)定,與原子服務(wù)抽象。
針對整車功能定義 FR 與 FDR ,進行自上而下設(shè)計,首先使用面向?qū)ο蟮乃季S進行整車的類抽象,然后設(shè)計類的方法與屬性,其中屬性盡量與 原子服務(wù)進行映射,方法需要使用一個或多個原子服務(wù)進行實現(xiàn)
最終進行原子服務(wù),與整車類的屬性與方法進行映射,找出無法實現(xiàn)的類,以及沒有使用到的原子服務(wù),此部分進行服務(wù)代理設(shè)計,及使用傳統(tǒng) SWC 軟件模塊實現(xiàn)部分功能,然后代理成組合服務(wù)形式,參與整車架構(gòu)設(shè)計。
?
2.2. SOA 設(shè)計區(qū)別
3.0 架構(gòu)全面采用 SOA(service-oriented Architecture)設(shè)計思想進行構(gòu)建,上一代 2.0 架構(gòu)采用的是 POP(procedure oriented programming)面向過程的設(shè)計思想,需要注意的是,在 SOA 設(shè)計中,自上而下的設(shè)計方法中引入了 OOP(object oriented programming)面向?qū)ο蟮某橄笈c封裝概念,這是為了在 2.0 現(xiàn)有架構(gòu)基礎(chǔ)上,能夠繼承原有 FR,FDR,LC,然后進行迭代開發(fā)。
也就是說通過 Class 的抽象,在原有 LC 一層新添加了類圖的設(shè)計,通過抽象的類進行用例設(shè)計進行功能鏈路實現(xiàn)。后續(xù)進行服務(wù)化設(shè)計,只要滿足類中的屬性和方法能夠?qū)崿F(xiàn)即可,而不必去關(guān)心設(shè)計的服務(wù)如何支撐整個子系統(tǒng)及功能鏈路的實現(xiàn)。
POP 面向過程設(shè)計
在 2.0 架構(gòu)中,首先要進行 Composition 功能組合的劃分,然后在進行 Component 功能組件的劃分,每個組件都有相應(yīng)的輸入和輸出信號,依據(jù)這些來實現(xiàn)高內(nèi)聚,低耦合的功能點實現(xiàn),設(shè)計好組件/組合之后,然后進行模塊間接口信號的設(shè)計,每個模塊平均有 20 個左后的輸入和輸出信號
SOA 面向服務(wù)設(shè)計
在 3.0 架構(gòu)中,首先要進行服務(wù)的劃分和設(shè)計,每個服務(wù)是松耦合的,也就是分治的設(shè)計理念,及服務(wù)里包含的方法、event、field 具備高扇入,合理的扇出,而服務(wù)所抽象的數(shù)據(jù)要與處理的業(yè)務(wù)邏輯、流程、功能實現(xiàn)三方解耦,所設(shè)計的基礎(chǔ)服務(wù)也要與操作系統(tǒng)解耦。
對比 2.0 中的設(shè)計,可以類似的理解為 2.0 先設(shè)計軟件模塊,然后設(shè)計信號接口,而 3.0 soa 后先設(shè)計服務(wù)接口(此接口不僅包含類似信號的 event,還包含類似函數(shù)的 method 方法),有了服務(wù)之后,在設(shè)計哪些模塊提供這些服務(wù),哪些模塊訂閱服務(wù)。
需要注意,SOA 后里的軟件模塊需要嚴格的區(qū)分 server 與 client,也就是一個模塊要不就是提供某個或多個服務(wù),要不就是訂閱了一個或多個服務(wù),不存在既訂閱了一些服務(wù)又提供了一些服務(wù)的情況,這與 2.0 架構(gòu)中的 swc 軟件模塊既有輸入又有輸出完全不一樣。
OOP 面向?qū)ο笤O(shè)計
在 3.0 架構(gòu)中,需要借助面向?qū)ο蟮脑O(shè)計方法來輔助支撐,也就是依托現(xiàn)有 2.0 架構(gòu),不進行大范圍重構(gòu)的前提條件下,使用類抽象出所有 LC 模塊,并且通過設(shè)計不同類的用例圖來實現(xiàn)原 LC 處理的功能。
?
2.0 架構(gòu)上 MBSE 設(shè)計圖上 LC 映射實現(xiàn)
?
3.0 架構(gòu)上 MBSE 設(shè)計圖上 LC 映射實現(xiàn)
2.3. 接口命名規(guī)范
在進行 SOA 服務(wù)設(shè)計時,需要遵循如下命名規(guī)范
2.3.1. 基礎(chǔ)規(guī)范
盡量采用單詞全稱,名稱過長后才使用縮寫
名稱不包含特殊字符?,./~
名稱如果過長,需要參考常用單詞縮寫表中內(nèi)容進行縮寫
考慮服務(wù)和參數(shù)的復(fù)用性,各類命名中不應(yīng)帶有拓補節(jié)點信息
不同層級的各類名稱不能重復(fù)
命名中不能使用如下系統(tǒng)關(guān)鍵字:
skeleton
proxy
internal
resources
method
event
field
input/output
amsr
ara
com
someip
base
vac
std
serialization
2.3.2. Service Instance 服務(wù)實例
服務(wù)實例及指代定義的服務(wù)實現(xiàn),后文若單獨寫服務(wù),則意為服務(wù)實例
服務(wù)名采用首字母大寫,全英文名稱
服務(wù)名不能有下劃線
服務(wù)名后綴需要以?Srv?結(jié)尾
eg. LedControlSrv
2.3.3. Service Interface 服務(wù)接口
SOA 平臺上服務(wù)之間通信接口有 Event、Method 和 Field 三種形式, ServiceInterface 用于定義 Event/Method/Field 消息類型和具體的命名空間,與具體的通信協(xié)議無關(guān)。
服務(wù)接口名采用首字母大寫,全英文名稱
服務(wù)接口名不能有下劃線
服務(wù)接口名需要以?SrvIf?結(jié)尾
eg. LedControlSrvIf
2.3.4. Event
Event 接口表示實際傳輸?shù)臄?shù)據(jù),以數(shù)據(jù)為操作對象,只要能夠清晰的表達數(shù)據(jù)的含義即可,命名規(guī)范遵循基礎(chǔ)規(guī)范,后綴要以?Evt?結(jié)尾。 eg. CurrentVleEvt : 電流值 Event 消息傳遞方式如下圖所示,為服務(wù)端主動向客戶端發(fā)送,并且會觸發(fā)客戶端的 callback 函數(shù)進行數(shù)據(jù)處理。 ?
2.3.5. Method
Mehtod 接口表示某種控制,通訊方式采用 RPC 遠程調(diào)用,通常有動詞行為,比如控制,狀態(tài)查詢,傳輸,注冊,設(shè)置等。其中 Method 又分為 F&F,與 R&R 兩類,F(xiàn)F 為單次調(diào)用,不需要反饋,RR 為 request resoponse,需要反饋。
請求-響應(yīng)(request/response): R&R
請求-響應(yīng)流(request/stream)
發(fā)后不管(fire-and-forget) : F&F
通道模式(channel)
整體設(shè)計依據(jù)遵循?CURD/REST?這類成熟的互聯(lián)網(wǎng)通用接口概念 CURD
REST
接口名稱需要表達清楚該方法的含義,推薦使用動名詞進行命名,采用駝峰命名規(guī)范,基于如上 CURD/REST 參考,命名要以后綴?Mtd?作為結(jié)束,設(shè)計如下基礎(chǔ)命名范式:
get 獲取狀態(tài)
set 設(shè)置狀態(tài)
report 傳遞信息
judge 判斷事件,返回 boolean
create 創(chuàng)建線程/進程/動態(tài)服務(wù)/文件/事件 等
delete 刪除線程/進程/文件 等
eg. setSoundOnMtd : 鳴響喇叭
judgeVehMovingMtd : 判斷車輛是否移動
getCarCfgMtd : 獲取 car config 值
reportComponentStsMtd : 上報 component 狀態(tài)信息
createXTaskUsrLightShowSrvMtd : 創(chuàng)建用戶自定義的燈光 show 服務(wù)
deleteDebugClass0MsgMtd : 刪除 debug 等級為 0 的所有 msg 調(diào)試文件 Method 消息傳遞方式如下圖所示,為客戶端主動向服務(wù)端請求,可以設(shè)定是否有服務(wù)端的返回值。
2.3.6. Field
Field 表示一種屬性,通常指狀態(tài)值或某種信息,名稱應(yīng)該清楚的表達該屬性的含義。 Field 包含如下三類信息:
getter : 只讀接口,原型為 method,獲取服務(wù)端信息
notifier : 只讀接口,原型為 event,接收服務(wù)端的數(shù)據(jù)
setter : 寫入接口,原型為 method,設(shè)置/修改服務(wù)端相關(guān)信息
eg. VehMoveFld : 車輛移動控制 Field 消息傳遞方式如下圖所示
3. 服務(wù)設(shè)計方法
針對大部分 OEM,需要在現(xiàn)有整車架構(gòu)上進行服務(wù)設(shè)計升級,也就是已有 base 的 LC 需求,和工程級的軟件 swc,需要依據(jù)這兩類已有資產(chǎn),使用 OOP 面向?qū)ο蟮某橄笈c封裝手段,進行 SOA 服務(wù)化重構(gòu)。 本章節(jié)以車身控制器中?危險報警?軟件模塊為例,說明如何在已有 LC 需求和軟件模塊前提下,使用 gitee,進行 SOA 設(shè)計。
需要注意的是,在設(shè)計服務(wù)接口時,要清楚的知道不同接口的實際特性和性能消耗。Event 為 服務(wù)端主動向客戶端 發(fā)送請求,而 Method 恰好相反,為 客戶端主動向服務(wù)端 進行請求調(diào)用。根據(jù)如上接口描述,整體服務(wù)設(shè)計遵循如下方案要點。
原 2.0 平臺中信號盡量保留,作為 Event 接口類型進行預(yù)留
服務(wù)設(shè)計包括 類抽象-服務(wù)接口設(shè)計-服務(wù)實例設(shè)計-設(shè)計具體的進程/線程 運行此服務(wù)實例
每個抽象好的類,對應(yīng)一個服務(wù)接口 : XX_Class -> XX_SrvIf
類中的屬性對應(yīng) Event 接口類型 XX_Class::value -> XX_SrvIf-valueEvt
類中的方法對應(yīng) Method 接口類型 XX_Class::fuction -> XX_SrvIf-valueMtd
盡量不要設(shè)計 Field 接口
每個服務(wù)接口由一個具體的服務(wù)進行實例化 : XX_SrvIf -> XX_Srv
每個實例化的服務(wù),都要設(shè)計哪個進程/線程/軟件模塊/ECU 來提供,哪些 App 會訂閱
App 使用/設(shè)定服務(wù)里的數(shù)據(jù)/功能,需要通過 CM 通訊管理進行服務(wù)的訂閱
實例化的服務(wù)之間,數(shù)據(jù)/功能 傳遞,則直接調(diào)用相互暴露的 api,可以不用 CM 參與(即組合服務(wù)和原子服務(wù)的關(guān)系)
App 之間不能直接進行數(shù)據(jù)傳輸,需要調(diào)用專有的服務(wù)進行數(shù)據(jù)傳遞(即服務(wù)代理模塊)
3.1. 需求分析
示例軟件模塊主要實現(xiàn)危險警報功能,在整車條件允許的情況下,如果按下手機 app 上的警報按鈕,則會觸發(fā)車輛進行聲光報警。
需要注意?針對 VFC/PNC 相關(guān)軟件邏輯,雖然在 3.0 架構(gòu)上已經(jīng)不復(fù)存在,但是需要保留功能分區(qū)劃域的思想,也就是針對不同場景需要觸發(fā)不同的軟件組件來執(zhí)行完成,針對不同的 PNC,在 3.0 架構(gòu)上可以作為 VLAN 劃分的設(shè)計參考。 使用 gitee 進行需求編寫,與原 LC 中需求進行追溯
3.2. 類的抽象和封裝
使用 OOP 手段,根據(jù)需求和已有的軟件模塊,進行類的抽象,并將有可能被多次調(diào)用的軟件邏輯進行類方法的封裝,后續(xù)多次執(zhí)行的代碼邏輯,僅在實例化的類中執(zhí)行一次即可。
類抽象,將整車從多個角度抽象成不同的類,每個類都可以映射成一個 service 的實體,不同的軟件模塊調(diào)用相同邏輯時,可以直接訂閱此 service,使用 service 中的 method、event、field。
類方法封裝,將接口進行泛化,封裝成通用類的方法,達到松耦合的效果
類圖:
? ?
時序圖:
?
3.3. 服務(wù)設(shè)計
上一章推導(dǎo)出,所設(shè)計的類就是一個需要實現(xiàn)服務(wù),根據(jù)此原則,在 gitee 中進行服務(wù)設(shè)計。 服務(wù)設(shè)計包含如下步驟和要素:
服務(wù)接口設(shè)計(method/event/field)
接口變量設(shè)計(method 的入?yún)⒊鰠⒓皵?shù)據(jù)類型,event 變量名及數(shù)據(jù)類型)
服務(wù)實例設(shè)計(發(fā)布者,服務(wù) ID 等信息)
3.3.1. 數(shù)據(jù)類型設(shè)計
在?Gitee-數(shù)據(jù)類型?中進行數(shù)據(jù)類型設(shè)計 ?
3.3.2. 服務(wù)接口設(shè)計
在?Gitee-Service 接口?中進行 service 接口設(shè)計 ?
3.3.3. 服務(wù)實例設(shè)計
在?Gitee-Service 實例?中進行服務(wù)實例設(shè)計 ?
3.3.4. 配置文件導(dǎo)出以及代碼框架生成
通過 gitee 能夠?qū)С鏊蟹?wù) list 的 csv 文件,基于此開發(fā)工具進行 arxml 文件和代碼框架的轉(zhuǎn)換生成,最終進行基于 SOA 服務(wù)化的軟件開發(fā)。 代碼框架可以參考筆者之前的回答。
4. 小結(jié)
針對已有歷史軟件資產(chǎn)的廠商,進行 SOA 架構(gòu)升級的方法大致如上,此處借用了 gitee 企業(yè)版輔助進行架構(gòu)設(shè)計,也希望大家意識到,軟件定義汽車,不僅僅是軟件產(chǎn)品,甚至整車研發(fā)的工具鏈和開發(fā)流程也都會慢慢靠向軟件開發(fā)的生態(tài)工具鏈,抱殘守缺,是注定要被時代淘汰的,此處諾基亞和柯達會深有感觸。?
審核編輯:劉清
評論
查看更多