2. 整车电子电气架构与OTA相关ECU识别
任务目标
本案例基于某典型整车电子电气架构(EEA),完成两项工作:一是梳理域控制器与ECU的挂载关系,识别出具备OTA升级条件的ECU(IVI、T-Box、中央网关、座舱域控制器等);二是绘制OTA相关ECU的通信拓扑图,明确各节点间的物理链路与升级数据流向。
整车EEA与OTA相关ECU识别
以当前主流分布式+域集中式混合架构为例,整车网络分为动力、底盘、车身、座舱、智能驾驶五个功能域。各域控制器通过车载以太网(100/1000BASE-T1)连接至中央网关,域内ECU多沿用CAN/CAN FD总线。OTA升级需要ECU具备以下条件:足够的非易失存储空间、支持Bootloader刷新、具备安全认证能力,且其所在网段支持升级数据传输。
据此识别出本架构中与OTA直接相关的ECU清单如下:
- 中央网关(CGW):OTA升级的总代理,负责诊断会话控制、升级包分发与路由;
- T-Box(远程信息终端):连接车外云平台,接收升级包并缓存,是OTA的入口节点;
- IVI(车载信息娱乐主机):通常作为座舱域主节点,自身可升级,也承担部分就近ECU的升级代理;
- 座舱域控制器(CDC):管理仪表、HUD等,支持SOTA;
- 智能驾驶域控制器(ADCU):支持FOTA,需高带宽以太网升级;
- 车身域控制器(BCM):支持FOTA,通过CAN FD接入网关。
其余如发动机ECU、BMS等因安全等级高且升级场景少,本案例不纳入OTA范围。
OTA相关ECU拓扑图
上图展示了OTA升级的数据路径:云平台通过4G/5G将升级包推送至T-Box,T-Box经以太网将数据传至中央网关,网关再按目标ECU所在网段进行路由分发。IVI与座舱域控制器之间、ADCU与BCM之间均通过网关实现跨域通信。实际部署中,IVI也可直接从T-Box获取升级包(旁路网关),本图按典型配置绘制。
关键实现:ECU识别与拓扑生成
以下Python代码定义了一个最小可运行的EEA模型,能够根据ECU属性自动筛选OTA相关节点,并输出拓扑描述(JSON格式),便于后续可视化或测试。
import json
from dataclasses import dataclass, field
@dataclass
class ECU:
name: str
domain: str # 所属域:powertrain/chassis/body/cabin/ad
bus_type: str # 接入总线:eth/can/canfd
supports_ota: bool # 是否支持OTA
has_bootloader: bool = True
storage_mb: int = 0 # 可用升级存储空间
# 整车EEA节点定义(含非OTA节点用于对比)
ecus = [
ECU("CGW", "central", "eth", True, storage_mb=256),
ECU("T-Box", "telematics", "eth", True, storage_mb=512),
ECU("IVI", "cabin", "eth", True, storage_mb=2048),
ECU("CDC", "cabin", "eth", True, storage_mb=1024),
ECU("ADCU", "ad", "eth", True, storage_mb=4096),
ECU("BCM", "body", "canfd", True, storage_mb=128),
ECU("EMS", "powertrain", "can", False, storage_mb=64), # 发动机控制器,不支持OTA
ECU("BMS", "powertrain", "can", False, storage_mb=32), # 电池管理,不支持OTA
]
def identify_ota_ecus(ecu_list):
"""筛选支持OTA且满足硬件条件的ECU"""
return [e for e in ecu_list if e.supports_ota and e.has_bootloader and e.storage_mb >= 64]
def build_topology(ota_ecus):
"""构建OTA相关ECU拓扑(星型:网关为中心)"""
gateway = next(e for e in ota_ecus if e.name == "CGW")
others = [e for e in ota_ecus if e.name != "CGW"]
return {
"central_gateway": gateway.name,
"ethernet_backbone": [e.name for e in others if e.bus_type == "eth"],
"canfd_subnet": [e.name for e in others if e.bus_type == "canfd"],
"ota_flow": "cloud -> T-Box -> CGW -> target_ecu"
}
if __name__ == "__main__":
ota_list = identify_ota_ecus(ecus)
print("OTA相关ECU:", [e.name for e in ota_list])
topo = build_topology(ota_list)
print(json.dumps(topo, indent=2, ensure_ascii=False))
运行与验证
运行方式:将上述代码保存为 eea_ota_identify.py,在Python 3.8+环境直接执行:
python eea_ota_identify.py
预期输出:
OTA相关ECU: ['CGW', 'T-Box', 'IVI', 'CDC', 'ADCU', 'BCM']
{
"central_gateway": "CGW",
"ethernet_backbone": ["T-Box", "IVI", "CDC", "ADCU"],
"canfd_subnet": ["BCM"],
"ota_flow": "cloud -> T-Box -> CGW -> target_ecu"
}
通过条件:程序输出中OTA列表应包含CGW、T-Box、IVI、CDC、ADCU、BCM共6个节点,且不包含EMS与BMS;拓扑JSON中以太网骨干节点数量为4,CAN FD子网节点为BCM。若输出与上述一致,则说明ECU识别逻辑与拓扑构建正确。