一、SOME/IP 介绍
在CAN总线的车载网络中,通信过程是面向信号的。当ECU的信号的值发生了变化,或者发送周期到了,就会发送消息,而不考虑接收者是否需要,这样就造成了总线上出现不必要的信息,占用了宽带。
some/ip(Scalable service-oriented middlewarE over IP),是一个面向服务(SOA,Service-oriented Architecture)的网络通信协议。


二、SOME/IP 协议格式详解
SOME/IP是一种提供服务的通信协议,我们就可以把请求服务的ECU看成是client,而提供服务的ECU就是server。
SOME/IP 协议的核心是数据帧结构,分为 “头部(Header)” 和 “负载(Payload)” 两部分,支持 UDP 和 TCP 两种传输协议绑定。所有头部字段默认采用网络字节序(大端序,Big Endian),确保不同 ECU(电子控制单元)间的兼容性。
SOME/IP 数据帧的基本结构如下,总长度随负载动态变化,UDP 传输时 payload 最大 1400 字节(避免分片),TCP 传输时无此限制(依赖 TCP 分段):Example for a Serialization Protocol (SOME/IP)

SOME/IP 协议的格式由 Header(头部)和 Payload(负载)构成,其中协议头部包含多个字段。具体如下:
Message ID:4 个字节,用于对应用程序方法的 RPC 调用或识别事件,由 Service ID 和 Method ID 组成。
Length:4 个字节,表示从 Request ID 开始一直到 Payload 结尾的字节数。
Request ID:4 个字节,由 Client ID 或 Session ID 组成。Client ID 是请求服务的 ECU 的唯一标识符,Session ID 用于区分来自同一发送者的消息,会随着请求 / 响应消息的增加而增加。
Protocol Version:1 个字节,为 SOME/IP 协议版本号。
Interface Version:1 个字节,是接口版本号。
Message Type:1 个字节,用于区分不同类型的消息,如 request(0x00)、response(0x80)、error(0x81)、没有响应消息的 request(0x01)、notification(0x02)等。
0x00:REQUEST(需响应)
0x01:REQUEST_NO_RETURN(Fire&Forget,无需响应)
0x02:NOTIFICATION(事件通知)
0x80:RESPONSE(正常响应)
0x81:ERROR(错误响应)
Return Code:1 个字节,返回码用来表示请求是否已成功处理。
0x00:E_OK(成功)
0x01:E_NOT_OK(未知错误)
0x02:E_UNKNOWN_SERVICE(服务不存在)
0x03:E_UNKNOWN_METHOD(方法不存在)
Payload:任意字节,负载
三、Payload的序列化数据类型
四、SOME/IP 服务发现(SOME/IP-SD)格式

SOME/IP-SD 用于服务实例定位、发布 / 订阅管理,基于 SOME/IP 基础格式扩展,仅支持 UDP 传输,默认端口 30490(可通过接口定义修改)。
SOME/IP-SD 的设计目标是解决车载网络中 “服务如何被找到”“服务状态如何同步”“事件如何订阅” 三大问题,其核心功能可归纳为以下 4 点:
服务实例定位:客户端(Client)通过 SOME/IP-SD 查找网络中可用的服务实例(如 “空调控制服务”“雷达感知服务”),服务器(Server)通过 SOME/IP-SD 主动宣告自身提供的服务实例。
服务状态同步:实时同步服务实例的 “可用(Up)/ 不可用(Down)” 状态,以及客户端对服务的 “需求(Required)/ 释放(Released)” 状态,避免无效通信。
事件组订阅管理:支持客户端订阅服务器的事件组(Eventgroup,一组相关事件的集合,如 “车身状态事件组” 包含 “车门开关”“车窗升降” 事件),并管理订阅的建立、维持与终止。
非 SOME/IP 服务宣告:支持通过 SOME/IP-SD 宣告非 SOME/IP 协议的服务(如网络管理、诊断服务),实现统一的服务发现机制。
4.1 SOME/IP-SD 头部结构
SOME/IP-SD 帧由 “基础 SOME/IP 头部 + SOME/IP-SD 扩展头部 + 条目数组(Entries Array) + 选项数组(Options Array)” 组成,核心字段如下:
4.1.1 基础 SOME/IP 头部(固定 16 字节)
需按以下规则配置:
Message ID:0xFFFF8100(0xFFFF 为 SOME/IP-SD 专用 Service ID,0x8100 为 Method ID)
Protocol Version:0x01
Interface Major Version:0x01
Message Type:0x02(NOTIFICATION)
Return Code:0x00(E_OK)
4.1.2 SOME/IP-SD 扩展头部(12 字节)
在基础 SOME/IP 头部后,需添加 SOME/IP-SD 专用扩展头部,用于携带服务发现的控制信息:
4.2 条目数组(Entries Array)
存储服务或事件组的状态信息,分为服务条目(Service Entry) 和事件组条目(Eventgroup Entry) 两类,均为 16 字节固定长度。
4.2.1 服务条目(Service Entry)
用于服务实例的 “查找(Find)”“提供(Offer)”“停止提供(Stop Offer)”,字段如下:
4.2.2 事件组条目(Eventgroup Entry)
用于事件组的 “订阅(Subscribe)”“停止订阅(Stop Subscribe)”“确认(Ack/Nack)”,字段如下:
4.3 选项数组(Options Array)
用于补充条目信息(如 IP 地址、端口、配置参数),每个选项由 “16bit 长度字段 + 8bit 类型字段 + 数据” 组成,核心选项类型如下:
五、关键约束与兼容性规则
传输协议选择:UDP 优先用于低延迟场景( payload ≤1400 字节),TCP 用于大尺寸数据(如超过 1400 字节),需在接口定义中指定。
版本兼容性:主版本号不兼容时拒绝通信;次版本号兼容时,新增参数需放在参数列表末尾,旧版本 ECU 可忽略超出部分。
保留标识:部分 Service ID(如 0x0000、0xFFFF)、Instance ID(如 0x0000、0xFFFF)、Method ID(如 0x0000、0xFFFF)为保留值,不可用于业务服务。