| 编辑推荐: |
本文主要介绍了车载
SOA 中间件选型的胜利与边界相关内容。希望对你的学习有帮助。
本文来自于微信公众号机器人不喝咖啡 ,由火龙果软件Alice编辑,推荐。 |
|
有一种胜利,叫所有人选了同一张牌。但没人告诉你这张牌的背面印着什么。
第一章:信号死了吗?
2024 年,一辆高端智能电动车的中央计算平台上跑了大约 200 个软件服务。感知服务、定位服务、路径规划服务、车速服务、空调控制服务、灯光管理服务……它们有的每
10ms 就要交换一次数据,有的一分钟才说一句话,有的只在车启动时出现一次,然后就消失了。
你可能会问:CAN 总线不是也能通信吗?发个 Message ID 不就完了?
能。但不等于"够了"。
CAN 的通信模型建立在一个基本假设上:**"我提前知道这个世界上有哪些人,每个人会说什么,以及他们什么时候说。"**
这假设在 20 个 ECU、200 条信号的年代完全成立。DBC 文件就是这份"世界说明书"——每个
Message ID 的含义、周期、信号布局,白纸黑字写得清清楚楚。所有人照着同一本字典说话,20
年没出过问题。
但到了 200 个服务——其中一大半是在 OTA 更新中动态部署进来的新东西——世界从一个"已知的列表"变成了"不知道谁会来,也不知道谁会走"的开放集市。
想象一个具体的场景:你的车刚收到一个 OTA,新增了"记忆泊车"功能。这个功能需要调用摄像头服务(获取地下车库的图像)、定位服务(获取车辆在
B3 层的位置,这个位置是 CAN 总线上的轮速/方向盘组合推算出来的)、车身控制服务(控制方向盘、刹车、油门)。但这些服务之间的依赖关系——谁提供什么、谁需要什么、数据格式是什么——在上一个版本的
DBC 文件中根本不存在。
如果你还靠 DBC 文件来管理通信,你就得在每次 OTA 推送新功能时,重新发布一份"全车信号词典",并确保所有
ECU 都刷了最新版本。 这在一辆有 100+ ECU、来自 20 家不同 Tier1 的量产车上,等于每次
OTA 都要重新协调全供应链。
CAN 的字典装不下这个开放集市。
这不是 CAN 不够好。CAN 从来没有被设计来处理"动态发现、按需连接、运行时生命周期管理"这样的需求。CAN
是被设计来在发动机舱的电磁噪声里可靠地传送 8 个字节的短消息——它完成这个任务到今天仍然是世界上最好的方案。
问题变了,答案也得变。
所谓"从信号到服务",本质是:你不再预先把所有可能的对话写进一份永不更新的合同里,而是允许对话的关系在运行时被发现、建立、断开、重新建立。信号的字典关上了——服务的大门打开了。
第二章:为什么是 SOME/IP ——五个约束下的最优解
现在你是一个车企的 EEA 架构师。你决定:车里的软件要服务化。你需要选一个中间件协议。
什么叫中间件?就是在"网络能传包"(TCP/UDP/IP)和"业务能做事"(规划、控制、感知)之间的那一层。"我不需要知道对方的
IP 地址,不需要手动建立连接,不需要操心数据格式对不对——中间件帮我搞定。"
你打开市面上所有选项:SOME/IP、DDS、MQTT、gRPC、Zenoh……有些名字你可能在互联网后端听过,有些是军工行业用了
20 年的老兵。
你怎么选?
你的办公桌上其实已经放了五个无法讨价还价的前提条件。每个选中间件的人都知道它们在那,但很少有人把它们一起摊开来看。
第一道约束:AUTOSAR ——不是"选了"SOME/IP,而是"造了"SOME/IP
这个行业有一个事实标准叫 AUTOSAR。不管你对它什么感情,你的 ECU 供应商(博世、大陆、安波福……)的软件平台都是
AUTOSAR Classic 或 Adaptive 的。
AUTOSAR 有一整套方法论:用 ARXML 定义所有通信接口 → 工具链自动生成配置和代码 →
ECU 上电后按配置运行。这不是一个"协议选择",这是一个生态锁定。
但这里有一段关键的历史,很多人不知道:
SOME/IP 不是从一堆候选方案中被"选出来"的。它是 BMW 从 AUTOSAR
内部"造出来"的。
2011 年前后,BMW 面临一个具体工程问题:新一代车型(7 系、i 系列)要引入车载以太网做信息娱乐和
ADAS 数据传输,但 CAN 的信号模型无法支撑服务化架构。BMW 需要一个中间件协议——既要比
CAN 灵活(支持动态服务发现、RPC 调用),又要比 DDS 简单(状态机可控、能跑在资源受限的
ECU 上、能嵌入 AUTOSAR 工具链)。
当时 DDS 已经是 OMG 标准,军工和航天用了近十年。但 DDS 的商业实现(RTI Connext、PrismTech
OpenSplice)定价面向国防预算,单节点 License 费用高昂;更关键的是,DDS 社区对汽车行业的
AUTOSAR 方法论——模型驱动、ARXML 配置、编译时确定一切——兴趣不大。DDS 的哲学是"运行时发现一切",AUTOSAR
的哲学是"编译前决定一切"。这两个哲学在 2011 年没有人愿意花工程量做调和。
BMW 的解决方案是:自己设计一个"刚好够用"的协议。Lars Völker(BMW
工程师,后来成为 SOME/IP 规范的主要作者)主导了协议设计,目标极其明确——满足车载以太网上的服务通信需求,同时能无缝嵌入
AUTOSAR 的 ARXML 配置流程。不多做一件事。
2012 年,BMW 把 SOME/IP 带进 AUTOSAR 联盟。因为 BMW 是 AUTOSAR
的核心成员(Premium Member),协议直接进入标准化流程。2014 年 AUTOSAR R4.2
发布时,SOME/IP 已经是 Classic Platform 的正式通信协议。2017 年 Adaptive
AUTOSAR 发布时,SOME/IP 直接成为 ara::com(Adaptive 的服务通信模块)的默认传输绑定——不是"推荐使用",是默认就在那里。用了
Adaptive,就自动获得了 SOME/IP。
这不是一个"市场竞争中胜出"的故事。这是一个"在联盟内部从零造标准"的故事。
SOME/IP 生来就是 AUTOSAR 的一部分——它从第一天就被设计成能被 ARXML 描述、能被工具链生成代码、能被
Conformance Test 验证的形状。DDS 要做到这些,需要一层适配层把自己"削"成
AUTOSAR 能接受的形状。
DDS 正式进入 AUTOSAR 是 R20-11 版本(2020 年底),作为 ara::com
的另一种可选 network binding。比 SOME/IP 晚了 6 年。在汽车行业,6 年意味着两到三个整车开发周期。等你
2021 年能用 AUTOSAR 原生 DDS binding 的时候,SOME/IP 已经跑了十几款量产车型。
不是 DDS 不够好。是 DDS 来自另一个世界——一个不用 ARXML、不走 AUTOSAR 工具链、不需要跟
20 家 Tier1 签精确到 bit 的接口合同的世界。它来到汽车的门口时,门里已经有了一个从内部长出来的答案。
第二道约束:供应链不是一家人
你的 ECU 不是你自己做的。是 Tier1(博世/大陆/安波福/德赛西威)做的。
Tier1 拿到你的需求("这个 ECU 要提供路径规划服务,接收定位输入,输出轨迹给控制……")之后要完成开发、测试、交付。交付的不只是代码,还有一份"我保证这符合你说的每一项需求"的测试报告。
谁来验证这份测试报告?谁来判断"这个服务确实提供了路径规划能力"?这需要一个双方都认可的接口定义格式。
在 AUTOSAR 的世界里,这个格式叫 ARXML。它精确到 bit 级别——这个 Service
ID 下包含哪些 Method,每个 Method 的参数类型和序列化规则,Event 的触发条件和周期。OEM
定义了这份 ARXML,Tier1 照着做,交付时用工具链做 Conformance Test——自动对比"实际实现的服务行为"和"ARXML
里定义的预期行为"。
SOME/IP 的序列化规则是专为这种"编译前已精确知道所有数据结构、运行时不做 schema
动态变更"的场景设计的。你在 ARXML 里定义了一个 struct,工具链就能生成序列化代码——字节序固定、长度固定、格式固定。认证工程师可以逐行审计这份生成代码。
DDS 用的是 OMG IDL——它当然也能描述类型,但 DDS 的哲学是"数据为中心":类型是灵活的,QoS
是丰富的,发现是去中心化的。你会得到 22 种 QoS 策略的自由度——但 OEM-Tier1 之间的合同不需要
22 种自由,合同需要的是精确到 bit 的可审计性。
SOME/IP 给你的不是"最好的通信",而是"最好的接口合同"。
第三道约束:认证路径要可穷举
功能安全(ISO 26262)有一个基本要求:你必须列出所有可能的故障模式,并证明系统对每一种都有安全响应。
对 CAN 总线来说,这个清单是可控的:
- 消息丢了?下一帧在路上(周期发送)。
- BIT 位翻转了?CRC 校验会抓到(CAN 的 CRC-15 对错误有已知的漏检概率)。
- 节点不发了?Node Missing 监控会报故障。
- 总线短路了?Error Passive 机制会隔离故障节点。
CAN 的故障模式空间很小——因为协议本身的状态机小。物理层两根线,链路层一个控制器,应用层按 DBC
配死的信号位——每层只有一个状态机,状态机之间的交叉是有限的。
现在把 Ethernet + TCP/IP + UDP + SOME/IP-SD + Service
Discovery + Event + RPC 全栈摊开。每一层有独立的状态机:
- Ethernet MAC/PHY:自协商、链路断开/恢复、CRC 错误
- IP:路由表变化、TTL 过期、分片重组超时
- UDP:无连接、无确认——丢包了应用层才知道
- TCP(部分场景使用):重传超时、拥塞窗口、连接建立/断开
- SOME/IP-SD:Find/Offer/Subscribe/StopOffer 四个事件引发状态迁移
- SOME/IP 会话:Session ID 管理、序列化格式校验、超时
这些状态机的组合空间,**不是"每层状态数 × 层数",而是"每层状态数的乘积"**。一个
UDP 丢包 + SOME/IP-SD Subscribe 丢包 + Service 仍处于 Down
状态 = 客户端认为服务已订阅但服务端不知道。这种跨层故障组合,CAN 世界根本没有发生过,因为 CAN
只有一层。
ISO 26262 要求功能安全工程师把所有这些组合枚举清楚。如果组合空间太大了——不能穷举——你就不能声称这条链路是
ASIL 级别的。
这就是为什么 ASIL-D 的制动信号到今天仍然走 CAN-FD,不走 Ethernet + SOME/IP。不是
Ethernet 不可靠,是 Ethernet 协议栈的故障模式空间太大,目前的认证方法论还吃不下。
值得一提的是,行业正在推动这个边界的突破。冗余以太网链路 + SOME/IP E2E Protection
+ TSN 时间同步的方案,正在多个 Zonal Architecture 平台上进行 ASIL-D
级别的认证验证。以太网进入安全关键领域不是"能不能"的问题,而是"认证路径和工程验证还需要多久"的问题——但当下,CAN-FD
仍然是安全关键链路的默认答案。
SOME/IP 的选择在这里其实是一个妥协:它选择了比 DDS 简单得多的状态机(SOME/IP-SD
只有四个核心事件,RTPS 的发现协议有两阶段八卦式对等发现,远比 SOME/IP-SD 复杂),使得功能安全分析至少是"有可能逼近穷举"的。
SOME/IP 为什么比 DDS "简单"?因为它在每一个设计节点上都选择了
"够用即可" 而不是 **"提供所有选项"**。
- SOME/IP-SD:单播或多播发现,找到服务就结束。DDS RTPS:两阶段对等八卦式发现,每个参与者维护全局拓扑。
- SOME/IP 的 QoS:基本靠底层 TSN 配。DDS:22 种 QoS 策略,你可以配"持续性
+ 可靠性 + 活跃性 + 所有权 + 分区 + ……"——每一种组合都是一个新的状态空间维度。
- SOME/IP 的安全性:E2E Protection(CRC + Counter + Timeout),轻量但够用。DDS:DDS-Security
规范有认证、加密、访问控制三个插件——功能全,但组合了更多状态。
这就是为什么认证工程师对 SOME/IP 的态度是"虽然也不是完全可控,但至少我能搭一个逼近穷举的分析框架"。对
DDS 的态度是"你的 QoS 组合数大概是天文数字,你让我怎么穷举?"
第四道约束:车载网络的拓扑是"树",不是"云"
这是最容易被忽视的一道约束——因为汽车工程师觉得"当然是树"是理所当然的,而互联网工程师觉得"当然是云"是理所当然的。
在车里,ECU 是固定位置的。域控制器知道下面挂了多少个子控制器,每个控制器的 IP 地址是预先配置的,网络拓扑是出厂后不会变的。
CAN 的共享总线是"所有人在一条线上"——这叫物理层上的广播。车载以太网不是——它是交换机拓扑,点到点连接,每段线路只有两个端点。你没法像
CAN 那样"在总线上喊一嗓子所有人都听到",因为物理上不存在这条总线。
但车载以太网的拓扑是已知的、确定的、固定不变的。域控制器的位置你知道,子 ECU 的 MAC 地址你知道,交换机之间的布线你知道——所有东西在出厂时就已经定了。
这个约束意味着什么?
意味着你不需要 DDS 的全局分布式发现。DDS 的 RTPS 协议花了很多精力解决"在大规模分布式系统中,参与者动态加入/离开,如何处理全局拓扑一致性"——这个问题的前提是"拓扑随时在变化"。DDS
假设网络是一个不确定的云——节点来,节点走,节点之间可以自由地形成对等关系,没有一个中央调度器。
但在车里,网络是一棵树——层次分明,静态配置。你不需要八卦式发现来维护拓扑一致性,你只需要一个简单的注册机制:客户端问
"有没有路径规划服务?",域控制器上的 SD 多播或服务注册表返回 "有,地址是
192.168.1.10:30000"。结束。
SOME/IP 的设计假定了"我知道网络长什么样",而 DDS 的设计假定了"我不知道网络长什么样,而且它随时可能变"。这两个假设对应两个完全不同的复杂度起点。
车载树形拓扑 vs 机器人网状拓扑
车载以太网之所以能用 SOME/IP 这种相对简单的方式实现服务发现,是因为静态拓扑把很多复杂问题消解了。这就是在文章开头写到的:"车载以太网
+ 交换机拓扑 → 不需要 CAN 那种共享总线广播",但同样的交换机拓扑也意味着"不需要
DDS 那种去中心化发现"。
第五道约束:时间敏感——车不想"多等 5ms"
车里的时间尺度跟数据中心不一样。
数据中心里,一个 RPC 调用 100ms 算快。在车里,车速信号的端到端延迟如果超过 2ms,已经在挑战
ISO 26262 对特定功能的时间约束。SOME/IP 跑在 UDP 上(事件类通信几乎都走 UDP),没有连接建立开销,没有
TCP 重传风暴,没有拥塞控制——要么包到了,要么没到。没到就等下一帧。
DDS RTPS 也跑在 UDP 上——但它的"可靠性 QoS"会在应用层做重传。在数据中心这是优势(无线网络丢包率
10%),在车上这是劣势——车里的 Ethernet 丢包率极低(通常是物理链路噪声导致的 BER,不是网络拥塞导致的丢包),重传机制基本用不上,反而引入了协议处理开销。
第三章:SOME/IP 的四件套——车载 SOA 的最小必要集合
理解了约束,再来看 SOME/IP 的机制,你会看透它每个设计选择的来源。
但这章的重点不在于罗列四种消息类型和四次握手的细节——如果你需要协议层面的参考实现,去看 AUTOSAR
的 PRS_SOMEIP 规范文件即可。这里要讲的,是这四个设计选择背后的工程直觉,以及每个选择在"约束
vs 能力"之间的妥协。
Service Discovery:不需要八卦的"找到你"
在互联网后端的世界里,"服务发现"是一个被解决了的问题——丢一个 DNS 记录、搭一个
Etcd 集群、跑一个 Consul agent,服务注册、健康检查、负载均衡全都搞定。
在车上不行。为什么?因为你没有 etcd。车里没有"集群",车里是固定的物理拓扑,域控制器是天然的中央登记处,子
ECU 是不会动态迁移的。
所以 SOME/IP-SD 的设计是 **"不需要维护全局拓扑一致性的服务发现"**。协议只需要支持四个动作:
1.Find Service(客户端:我需要一个路径规划服务,有吗?)
2.Offer Service(服务端:我有路径规划服务,这是我的 IP 和端口)
3.Subscribe(客户端:好,请给我发每 100ms 一次的车道线数据,同时通知我目标列表的更新事件)
4.Stop Offer Service(服务端:我下线了,别找我了)
没有"所有节点之间定期交换拓扑视图"的八卦机制——不需要。没有"分布式一致性算法选举一个
Leader 来管理拓扑"——不需要。
SOME/IP-SD 做反的事:它不会去做 DDS 那种两阶段八卦式发现,不是因为做不到——而是因为不需要。车载网络是一棵树,树顶就是一个天然的中心节点,你不需要去维护一个你根本不在其中的分布式全局拓扑。
SOME/IP SD 状态机
Request/Response:二进制 RPC,但没有 REST 的包袱
SOME/IP 的 RPC 不是像 curl 一条 REST API 那样发个 JSON 请求收 HTTP
200。RPC 走的是请求-响应的基本语义——调用方发请求,提供方返回结果。具体到协议上,SOME/IP-PRC
采用的是直接基于 TCP 或 UDP 的一对一调用。
它选择二进制序列化而不是 JSON/XML/Protobuf——原因是 ARXML。所有数据类型在
ARXML 中编译前已知。工具链可以根据 ARXML 配置直接生成零拷贝级别的序列化代码,不需要运行时做
schema 动态反射。对功能安全审计来说,这是一条极大的好消息:你可以审计生成的代码,而不用审计一个通用的
JSON 解析器的状态机(JSON 解析器的状态机异常复杂——格式错误的输入、嵌套层级攻击、浮点数精度异常——都是故障模式)。
当消息长度超过 UDP 以太网帧的限制时(约 1400 字节的 payload),SOME/IP
会用 SOME/IP-TP(传输协议)做分段。大数据(比如地图 tile、固件升级包)可以被切分、传输、再组装——不牺牲二进制格式的确定性,同时在需要时扩展长度限制。
Event:订阅,但不需要 22 种 QoS
SOME/IP 的 Event 是一个简化版的发布-订阅——客户端订阅感兴趣的事件组,服务端在有新事件时通过通知推送数据。这就是第二章写到的"像车速这种每
10ms 变化一次的信号,SOME/IP 用的是 Event 模式"——客户端不轮询,订阅后等推。
它跟 DDS 的发布-订阅的核心区别不在于"发布-订阅"这个模式——两者都支持——而在于"DDS
的发布-订阅有 22 种 QoS 自由度":
- Reliability:可靠(有确认和重试机制)还是尽力(发完不管)?
- Durability:新订阅者能不能收到订阅前发的历史消息?
- Liveliness:如果发布者失联了,订阅者怎么知道?
- Ownership:同一个主题有多个发布者,订阅者接收谁的?
- Partition:在同一主题内,能不能在逻辑上进一步划分出不同的子域?
对于机器人编队——无人机之间在你追我赶的 3D 空间中飞行,网络是 WiFi/5G 无线,拓扑随时变化——这每一种
QoS 策略都是实际需要、会在通信中产生不同结果的执行行为。
对于汽车 EEA——Ethernet 有线网络,拓扑固定,丢包率极低,域控制器是天然的通信中枢——你不需要
Ownership(一个服务只有一个提供者),不需要 Durability(新订阅的客户端等到下一帧就行,不需要读历史),不需要复杂的
Liveliness(心跳就够了)。
SOME/IP 的 QoS 基本上是靠 TSN(Time-Sensitive Networking)在底层实现的——你不需要应用层重传(Reliability
= Best Effort),你只需要 TSN 保证帧按时到达。
这里有一个重要的洞见:在车上,QoS 由底层网络保证;在机器人集群里,QoS 必须由中间件保证。这是
SOME/IP 和 DDS 在"复杂度预算"分配上的根本分歧。
Field:被低估的设计
SOME/IP 有一个设计经常被忽略:Field。
Field 是 Getter、Setter 和 Notifier 的三合一。
- Getter:你想读取某个属性——比如当前的目标车速。一问一答。
- Setter:你想修改某个属性——比如把目标车速设为 120。一设一确认。
- Notifier:你关心这个属性的变化——"目标车速一旦变化,主动通知我"。事件式自动推送。
这三个访问模式合在一个 Field 上——而不是拆成三个独立的 API、三个独立的 IDL 定义。
为什么这个设计好? 因为一个物理量在车上天然就支持这三种访问模式。车速既是"可以被读取的状态",也是"可以被设定的目标",也是"变化时需要被推送的事件"。Field
的设计反映了物理世界的本质——一个物理量的访问模式和变更模式是同一种东西的两种视角,不是两个东西。
对比一下互联网的 API 设计惯式。你用 REST 获取温度——GET /temperature,你设置温度——POST
/temperature。想监控温度变化?你得自己写一个轮询循环,隔几秒 GET 一次。温度本身是一个东西,但你的代码里有三个不相关的
REST 端点。SOME/IP Field 把这三件事重新合并成一个东西——一个属性值、一个设置接口、一个变化通知——合在一起,就是一个属性的完整生命周期。
SOME/IP Field 三合一设计
第四章:同一道题,两个行业的相反答案
现在我们来回答那个最核心的问题。
前面讲了 SOME/IP 是 BMW 从 AUTOSAR 内部造出来的。但这只解释了"它怎么进来的",没有解释"为什么机器人行业没有选同样的路"。如果
DDS 在协议功能上比 SOME/IP 更强大——更丰富的 QoS、更灵活的拓扑、更完整的去中心化发现——那为什么汽车行业要费劲从头造一个"更弱"的协议,而不是直接用现成的
DDS?
或者反过来问:既然 SOME/IP 这么简单,为什么机器人行业不用它,非要选复杂得多的 DDS?
这里没有谁对谁错。两个行业面对的是同一道题,完全不同的约束条件。
DDS 的视角:给机器人一个"全局数据空间"
DDS(Data Distribution Service)的核心思想在一个词上:Data-Centric(以数据为中心)。
传统的面向服务通信是 **"谁有问题,问别人"**——A 需要路径,就问 B:"请帮我规划路径",B
返回结果。通信的主体是"请求-响应"关系。
DDS 做反的事:它创建一个全局数据空间(Global Data Space),每个节点把自己的数据发布到这个空间里——"我的位置是(x=10,
y=20, z=5),我的速度是 3m/s,我的电量是 80%"。其他节点不需要问"你的位置在哪?",因为它们已经订阅了这个主题,数据更新会自动到达。
通信的主体从"调用关系"转移到了"数据本身"。
这就是为什么 ROS2 选了 DDS。
ROS(Robot Operating System)是机器人领域的标准中间件框架。ROS1 有一个中央
Master 节点——所有节点启动后去 Master 注册,通信时向 Master 查询对端地址,然后建立
P2P 连接。
这个架构在单机器人上没问题。在多机器人集群中会出问题:如果 Master 挂了(比如无人机撞树了),所有节点失去注册中心,整个集群通信瘫痪。如果一组新机器人加入,它们需要先知道
WiFi 内网 Master 的 IP——在野外部属场景下,这个 IP 可能不存在。
DDS 解决了所有这些问题:
- 去中心化:没有 Master。节点之间通过 RTPS 协议自动发现对等体。
- 动态拓扑:节点加入,通过八卦式发现自动获知网络中所有主题和发布者。
- 不可靠网络:QoS = RELIABLE 模式在应用层补发丢包。WiFi 丢包 10%,补发就是了。
- 场景自由度:Partitions 可以把同一主题在不同物理区域(无人机编队 A 和编队 B)的通信隔离开;Ownership
可以在多冗余发布者(同一个传感器数据的两个发布者)之间切换。
DDS 提供了机器人行业需要的所有灵活性。而灵活性在车里不是首要命题。
车的反命题:我需要确定性,不需要自由度
把 DDS 放进一辆车里,你会发现它的每个优势都在跟车的约束条件对冲:
1. 去中心化 vs 集中式 EEA
车有中央计算平台。有域控制器。有 Zone Controller。通信层级是树状的——从中央计算平台往下到
Zone Controller,再到传感器和执行器。
你不需要八卦式发现来维护一个不存在的"对等拓扑"。域控制器是天然的服务注册中心——车出厂时每根
Ethernet 线接在哪里是已知的,不需要运行时去探测。
2. 动态拓扑 vs 固定拓扑
车上的网络拓扑在生产线上就焊死了。交换机的 MAC 表是预配的。ECU 不会热插拔(除了 OBD
诊断口,但那不是 SOA 的一部分)。
动态发现对机器人是生存需求——对车是多余功能。而且这个"多余"在功能安全审计中是有代价的:既然是动态发现,就意味着"可能有节点在你不知道的时候加入并发布了一个跟你冲突的
Service ID"——这种场景在车里不存在,但在安全分析中需要证明它不存在或无害。
3. 不可靠网络 vs Ethernet 有线
DDS 的可靠性 QoS 设计前提是"网络会丢包"。车载 Ethernet 的丢包率是
BER(Bit Error Rate)级别的——物理链路上的位错误,不是拥塞丢包。在 100BASE-T1
的 BER = 10^-9 级别下,丢包概率已经小到可以用 CRC + Counter + Timeout(SOME/IP
的 E2E Protection)来覆盖,不需要应用层的确认和重传协议。
4. 灵活性 vs 认证可行性
DDS 的 22 种 QoS 策略——每一种打开了都是新的状态空间维度。你跟功能安全工程师说"我们有
22 种 QoS 可以选择",功能安全工程师会说"你的组合空间大概是 2^22
级别,你怎么证明所有组合下系统行为都是安全的?"
ROS2 的设计文档的原话是:"DDS 的灵活性代价是复杂性"。这个代价在机器人行业(没有
ISO 26262 要求)可以承受——在汽车行业,不可承受。
同样的问题,不同的约束 → 不同的最优解
| 约束维度 |
机器人(ROS2/DDS) |
汽车(AUTOSAR/SOME/IP) |
| 拓扑 |
动态(节点随时加入/离开) |
静态(出厂固定,树状层级) |
| 网络 |
不可靠(WiFi/5G) |
可靠(Ethernet 有线) |
| 中心节点 |
不能有(单点故障) |
天然中心(域控制器) |
| 功能安全 |
没有 ISO 26262 |
ASIL-A 到 ASIL-D |
| 生态 |
开源社区 |
AUTOSAR 方法论 + 商业工具链 |
| 供应链 |
自研为主 |
Tier1/OEM 合同制交付 |
| QoS 需求 |
需要丰富的选择性 |
需要 TSN 保证确定性 |
结论:SOME/IP 不是"更好的 DDS"。SOME/IP 是 BMW 在五个硬约束下,从
AUTOSAR 内部造出来的"刚好够用"的协议——放弃了 DDS 的灵活性和功能丰富度,换取了认证可行性、供应链可操作性、和生态原生嵌入。
机器人行业选了 DDS 也不是"机器人不懂车"。机器人的约束条件跟车几乎完全相反——本质上是"无线、移动、无主节点、无安全认证",而车是"有线、固定、有主节点、有
ISO 26262"。两个行业各自造了(或选了)适合自己约束条件的答案。
SOME/IP 与 DDS 协议栈对比
第五章:其他竞争者为什么也没有赢
SOME/IP 的对手不只是 DDS。
MQTT:太轻
MQTT 是物联网的宠儿——发布-订阅,轻量,一个 Broker + 三个字节的最小协议开销。Facebook
Messenger 用它,AWS IoT Core 用它。
为什么没在车上成为 SOA 的主协议?
因为 MQTT 的设计哲学是 **"客户端足够傻,Broker 足够聪明"**。它解决了海量低功耗
IoT 设备的接入问题——这些设备连 TCP 栈都跑不完整,更不可能自己维护复杂的服务发现和调用关系。
但车上的 ECU 不是低功耗传感器。车上跑 Linux/QNX 的算力是够的。你不需要把复杂度推到
Broker 上——你需要的是 ECU 之间直接进行结构化服务调用。MQTT 的发布-订阅没有 RPC
语义(调用-响应),没有 Field 语义(Getter/Setter/Notifier),没有 Service
Discovery。它是最轻的发布-订阅协议,缺了 SOA 需要的太多东西。
MQTT 在物联网赢了,因为物联网需要"最轻的发布-订阅"。车上需要的是"完整的服务通信语义"。
gRPC/protobuf:太互联网
Google 的 gRPC + Protobuf 在数据中心是王者——HTTP/2 传输,IDL 定义服务,自动生成客户端和服务端
stub,支持流式调用。用在车载 SOA 上有什么不好?
三个问题:
1.没考虑功能安全。Protobuf 的动态反射(dynamic reflection)和变长编码在功能安全审计中是噩梦——你没法在编译前确定所有数据的内存布局。Auto
行业的 ARXML 是"编译时已知一切"的理念,protobuf 是"运行时也可以解析未知类型"的理念——两个理念在安全审计上是正交的。
2.HTTP/2 协议栈有更多状态机。TLS + HTTP/2 的 HPACK 头压缩、流优先级、流控制、PING
心跳……每一层都是新的状态空间,层层叠加后的故障模式空间比 SOME/IP + UDP 大得多。
3.没有车载的生态支持。AUTOSAR 不支持 gRPC。你的 Tier1 供应商不做 gRPC。你的工具链不生成
gRPC 接口文件。一切从头集成不是一个选项——在车上,生态比协议功能更重要。
Zenoh:太新
Zenoh 是一个相对较新的零开销发布-订阅/查询协议——由 Eclipse 基金会主导,理论设计上可以跑在从微控制器到云的任何东西上。延迟极低,吞吐极高,支持
P2P 和 Broker 混合拓扑。
它看起来很优雅——在理论上。但在今天的车厂 EEA 架构决策会议上,Zenoh 有三个做不到的事:
- 没有 AUTOSAR 集成(AUTOSAR 联盟没有采纳 Zenoh 的计划)
- 没有十年量产验证(第一个量产车型用 Zenoh 大概是 2027 年以后)
- 没有 Tier1 支持(你的供应商不会给你提供 Zenoh 的 ECU 中间件)
"太新"在互联网行业是一个加分项——用最新的技术就是竞争优势。在汽车行业,"太新"是一个暂停信号——你需要十年量产数据来通过
ASIL 认证的前提条件。
第六章:这场胜利的边界——SOME/IP 没赢的地方
到这里,SOME/IP 的胜利看似完整——但胜利有边界。
第一道边界:安全关键链路
ASIL-D 的制动、转向、安全气囊——这些信号不走 Ethernet + SOME/IP。
走的是 CAN/CAN-FD。原因在第二章第三道约束中已经解释过:Ethernet 全栈的故障模式空间太大,目前的功能安全方法论无法穷举。ASIL-D
要求"确定性保证"——CAN 能保证(可穷举的故障模式),Ethernet +
SOME/IP 只能保证"有逼近穷举的分析框架"。
SOME/IP 赢了 SOA 的"服务层",但它没有赢"安全关键执行层"。车载通信是两层的——服务层(SOME/IP)解决了灵活性问题,执行层(CAN/CAN-FD)解决了安全性问题。两层的共存不是因为技术做不到统一,是因为"灵活性"和"确定性"在物理上就不可兼得。
第二道边界:AI 原生管道
AIDV 时代的 E2E 端到端——从摄像头传感器进来的原始像素开始,到控制指令从网络出去——整条数据流的底层通信不走
SOME/IP。
NVIDIA DRIVE AGX 上的推理管线是这样的:摄像头数据经 ISP 处理后,通过 NvMedia
直接加载进 GPU 显存。推理过程中张量通过 NvSciStream 在 GPU、PVA(可编程视觉加速器)、DLA(深度学习加速器)之间零拷贝传递。整条路径从传感器输入到控制指令输出,始终留在异构计算单元的内存空间里,从不触碰
CPU 也不经过序列化/反序列化。
SOME/IP 需要的"序列化 → 加协议头 → UDP 封装 → 发送 → 接收 →
解析头 → 反序列化"七步——对 E2E 神经网络推理来说,每一步都是在浪费延迟。SOME/IP
在这里输不是因为它"不够好",而是因为它所在的抽象层面(结构化消息、服务调用)和
AI 管道的抽象层面(张量流、GPU 显存传输、零拷贝)不在同一层上。
所以 AIDV 时代的中间件正在分化出两条线:
- CPU 域:SOME/IP 继续处理配置、监控、诊断、OTA、座舱服务编排等——需要结构化语义的场景
- AI 域:私有栈(NVIDIA DriveOS、Tesla 自研、华为自研)处理张量搬运、传感器数据流、推理管线的
DMA 描述符——需要零拷贝的场景
SOME/IP 赢了服务化这一战。但 AI 来了,它发现这场战争的定义已经变了——从"如何组织服务"变成了"如何避免把张量序列化成消息"。
第三道边界:中国车企的绕过
中国的新势力(蔚来、小鹏、理想)和传统转型车企(比亚迪、吉利)走了另一条路。
他们大量选择了绕过 Adaptive AUTOSAR——直接用 QNX/Linux 做底层操作系统,用自研或开源中间件(vsomeip、自研
RPC 框架)做服务通信,自研整车通信框架。
注意:他们绕过的是 Adaptive 的 ara::com 封装,不是绕过 SOME/IP 协议本身。vsomeip
是 GENIVI/COVESA 维护的 SOME/IP 开源实现——换句话说,中国车企用的仍然是 SOME/IP
的消息格式、服务发现、通信序列化规范,只是不使用 AUTOSAR 的工具链和框架。
更深一层的原因是:中国车企的软件迭代速度要求(每月 OTA 推送新功能)和 Adaptive 的方法论(ARXML
模型驱动、强类型、编译时验证)存在节奏冲突。他们要的是一周内写一个服务然后上线——不是在 ARXML
里配完、等工具链生成代码、做 Conformance Test、再部署。自研框架给了他们速度。
所以,SOME/IP 协议本身在中国市场的渗透率可能比 AUTOSAR Adaptive 框架的渗透率高得多。
这是一个有趣的现象:协议标准赢了,但架构标准没赢。
收束:胜利,但不彻底
回到标题的那个问题:SOME/IP 赢了吗?
答案是:它赢了域集中时代。
SOME/IP 定义了从 2015 年到今天,车载 SOA 通信的"共同语言"——让
Tier1、OEM、工具链厂商、认证机构在同一个协议上达成共识。它在五个硬约束下(AUTOSAR 生态、供应链合同、认证可穷举、静态拓扑、确定性需求)给出了唯一可行的方案。这不是因为它是"最好的"——是因为它从
AUTOSAR 内部长出来,天生就是五个约束的形状。BMW 没有选择一个现成的协议来适配汽车的约束——而是在约束里直接把协议造了出来。
但 EEA 正在走向下一站。从域集中到中央计算+区域式,从基于服务的软件架构到 AI 原生的推理管线。在中央计算芯片上,通信瓶颈正在从"怎么让两个
CPU 上的服务互相调用"变成"怎么让 GPU 显存里的张量零拷贝地到达 PVA"——这个问题,SOME/IP
从来不是答案。
SOME/IP 教会了整个行业一件事:服务化通信可以用一种精确、可配置、可认证的方式实现。 它可能是第一个车载中间件标准——它不会是最后一个。
SOME/IP 的胜利是域集中时代的胜利。而下一场战争的规则,正在被 Thor 和 Blackwell
重写。 |