SOME/IP初试
SOME/IP介绍SOME/IP 全称是 Scalable service-Oriented MiddlewarE over IP是车载以太网里常见的一种服务通信协议。它的核心思想是把车内 ECU 提供的能力抽象成“服务”其他 ECU 或进程通过服务 ID、实例 ID、方法 ID 去调用这些能力。它不像传统 CAN 信号那样主要按固定报文广播而是更接近“服务调用模型”。典型通信对象可以理解为Application -Service -Instance -Method / Event / Field对应到 hello_world 示例hello_world_service application: 0x4444 hello_world_client application: 0x5555serviceid: 0x1111 instance id: 0x2222 method id: 0x3333也就是客户端调用服务端的Service 0x1111 Instance 0x2222 Method 0x3333发送 “World”服务端返回 “Hello World”。SOME/IP 提供什么SOME/IP 主要支持几类交互模式Request / Response客户端调用服务端方法服务端返回结果。hello_world 就是这个模式client -service: request(World)service-client: response(Hello World)Fire and Forget客户端发送请求但不要求服务端返回 response。Event / Notification服务端周期性或按条件发布事件客户端订阅后接收通知。比如车速、温度、传感器状态变化。Field类似一个带 getter、setter、notification 的属性。get currentSpeedsettargetTemperature notify currentSpeedChangedSOME/IP Service DiscoverySOME/IP 通常还会配合 SOME/IP-SD也就是 Service Discovery。它解决的问题是某个服务现在在哪台 ECU 上它是否在线IP/端口是多少客户端什么时候可以调用常见 SD 消息包括OfferService服务端声明“我提供这个服务”。FindService客户端查询“谁提供这个服务”。SubscribeEventgroup客户端订阅事件组。StopOfferService服务端停止提供服务。vSomeIP 和 SOME/IP 的关系SOME/IP 是协议规范vSomeIP 是一个 C 实现库。vSomeIP 帮你处理application 注册routing managerservice offer / requestmessage 编解码payload 传输service availability 回调method/event handler 分发本地 UDS 或网络 UDP/TCP 传输SOME/IP-SD 支持应用开发者主要写app_-offer_service(service_id, instance_id);app_-request_service(service_id, instance_id);app_-register_message_handler(...);app_-send(message);SOME/IP 报文里有什么一个 SOME/IP 消息大体包含字段作用Service ID标识服务Method ID / Event ID标识方法或事件Length后续数据长度Client ID客户端应用 IDSession ID会话 ID用于匹配 request/responseProtocol VersionSOME/IP 协议版本Interface Version服务接口版本Message Typerequest、response、notification 等Return Code调用结果Payload业务数据在 hello_world 中payload 很简单就是字符串request payload: World response payload: Hello World实际车载项目里payload 通常是按 AUTOSAR、ARXML、IDL 或项目约定序列化后的结构体数据。SOME/IP 的几个关键概念Service ID标识一个服务类型例如“车身控制服务”“诊断服务”“空调服务”。Instance ID标识服务实例。一个 service 可以有多个 instance比如左门控制器和右门控制器可能是同一种 service 的不同 instance。Method ID标识服务里的某个 RPC 方法。Event ID标识服务发布的某个事件。Eventgroup事件组。客户端通常订阅 eventgroup而不是单个 event。Client ID标识调用方 application。Session ID用于区分不同请求帮助把 response 对回 request。HelloWorld解析演示的是 vSomeIP 的最小 request/response 通信流程服务端 hello_world_service 提供 0x1111.0x2222 服务客户端 hello_world_client 等待服务可用后调用 method 0x3333发送 payload World服务端回复 Hello World。它覆盖了 runtime/application 初始化、handler 注册、offer service、request service、服务可用通知、SOME/IP message/payload 构造、本地 routing manager 通信和优雅停止流程。对象关系图## 时序图SOME/IP vs Fast-DDSSOME/IP 更像“车载服务调用协议”核心是 service / instance / method / eventFast-DDS 更像“分布式数据总线”核心是 topic / publisher / subscriber / data type / QoS。在车载里可以粗略理解为SOME/IP: 谁提供某个服务我调用它的方法或订阅它的事件。 Fast-DDS: 谁在发布某类数据我订阅这个 Topic持续接收数据流。核心模型对比维度SOME/IPFast-DDS标准/协议AUTOSAR 常用服务通信协议DDS 标准的一种实现底层常用 RTPS通信模型面向服务 Service-Oriented面向数据 Data-Centric Publish/Subscribe基本对象Service、Instance、Method、Event、FieldDomain、Topic、DataWriter、DataReader、Participant常见交互Request/Response、Event Notification、Fire-and-ForgetPublish/Subscribe也支持 Request/Reply 模式但不是主模型接口标识数字 IDService ID、Instance ID、Method IDTopic 名称 数据类型数据契约通常来自 AUTOSAR ARXML、接口文档、手写协议通常来自 IDL生成强类型代码发现机制SOME/IP-SDOfferService、FindService、SubscribeEventgroupDDS DiscoveryParticipant、Endpoint、Topic 自动发现QoS 能力相对有限更多依赖应用和配置很强可靠性、持久性、历史深度、deadline、liveliness 等序列化SOME/IP payload 本身偏字节载荷业务自定义DDS/CDR 序列化强类型数据典型场景AUTOSAR Adaptive、车载服务调用、ECU 间 RPCROS 2、机器人、中间件数据总线、复杂分布式系统实时性如果只谈“能不能做实时通信”SOME/IP 和 Fast-DDS 都可以用于实时或准实时系统但它们的实时性侧重点不同SOME/IP: 更偏确定的服务调用路径适合车载控制服务、状态服务、RPC/事件通知。 Fast-DDS: 更偏高频数据分发适合多订阅者、大量数据流、复杂 QoS 控制。更直白一点低频/中频服务调用、车载 ECU 服务接口 -SOME/IP 更自然 高频数据流、多消费者、QoS 细粒度控制 -Fast-DDS 更强延迟对比维度SOME/IPFast-DDS通信模型服务调用、事件通知Topic 发布订阅典型延迟低但依赖 routing、传输、序列化和服务发现配置低RTPS/DDS 实现可针对低延迟优化本地进程间通信vSomeIP 可走 Unix Domain Socket本机很快Fast-DDS 可用共享内存传输进程间大数据优势明显网络通信UDP/TCPUDP/RTPS部分实现支持 TCP/共享内存大数据传输不是强项payload 自己管理更强尤其配合共享内存和零拷贝能力小 RPC 调用很适合可以做但不是最原生模型高频流式数据可以用 event但 QoS 和数据总线能力较弱适合高频发布订阅是强项抖动对比实时系统不只看平均延迟还要看抖动也就是每次通信耗时是否稳定。维度SOME/IPFast-DDS抖动来源routing manager、线程调度、TCP/UDP、服务端处理时间discovery、QoS、可靠传输重发、队列深度、线程调度可控性配置相对简单路径清晰QoS 很强但配置不当会引入额外抖动可靠模式影响TCP 或应用层处理可能增加等待Reliable QoS、History、Durability 可能增加延迟和抖动Best effort 模式UDP event 可较轻BestEffort KeepLast 可做到很低延迟Fast-DDS 的 QoS 是双刃剑配置得好可以更贴近实时需求配置得重比如可靠传输、历史缓存、持久化、较大队列会让延迟和抖动上升。编译vsomeipboost 1.75.0$ ./bootstrap.sh $ ./b2 $sudo./b2install编译vsome/ip$gitclone https://github.com/COVESA/vsomeip.git $gitcheckout-b3.6.43.6.4 $mkdirbuildcdbuild $ cmake..$make-j4中间会有编译错误 注释掉-Werror和-Wno-inconsistent-missing-override为什么选择3.6.4版本系统使用Ubuntu 20.04 gcc版本是9.4.0, 支持的C标准是C17, 而master最新依赖C20.