SOME/IP协议
编程 协议 Linux 24

一、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)等。

  1. 0x00:REQUEST(需响应)

  2. 0x01:REQUEST_NO_RETURN(Fire&Forget,无需响应)

  3. 0x02:NOTIFICATION(事件通知)

  4. 0x80:RESPONSE(正常响应)

  5. 0x81:ERROR(错误响应)

  • Return Code:1 个字节,返回码用来表示请求是否已成功处理。

  1. 0x00:E_OK(成功)

  2. 0x01:E_NOT_OK(未知错误)

  3. 0x02:E_UNKNOWN_SERVICE(服务不存在)

  4. 0x03:E_UNKNOWN_METHOD(方法不存在)

  • Payload:任意字节,负载

三、Payload的序列化数据类型

boolean

8

0 表示 FALSE,1 表示 TRUE(AUTOSAR 中布尔型为最小无符号整数,SOME/IP 固定 8bit)

uint8/uint16/uint32

8/16/32

无符号整数

sint8/sint16/sint32

8/16/32

有符号整数

float32/float64

32/64

浮点型,遵循 IEEE 754 标准(单精度 / 双精度)

uint64/sint64

64

可选支持的 64 位整数

四、SOME/IP 服务发现(SOME/IP-SD)格式

SOME/IP-SD 用于服务实例定位、发布 / 订阅管理,基于 SOME/IP 基础格式扩展,仅支持 UDP 传输,默认端口 30490(可通过接口定义修改)。

SOME/IP-SD 的设计目标是解决车载网络中 “服务如何被找到”“服务状态如何同步”“事件如何订阅” 三大问题,其核心功能可归纳为以下 4 点:

  1. 服务实例定位:客户端(Client)通过 SOME/IP-SD 查找网络中可用的服务实例(如 “空调控制服务”“雷达感知服务”),服务器(Server)通过 SOME/IP-SD 主动宣告自身提供的服务实例。

  2. 服务状态同步:实时同步服务实例的 “可用(Up)/ 不可用(Down)” 状态,以及客户端对服务的 “需求(Required)/ 释放(Released)” 状态,避免无效通信。

  3. 事件组订阅管理:支持客户端订阅服务器的事件组(Eventgroup,一组相关事件的集合,如 “车身状态事件组” 包含 “车门开关”“车窗升降” 事件),并管理订阅的建立、维持与终止。

  4. 非 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 专用扩展头部,用于携带服务发现的控制信息:

字段名称

长度(bit)

核心功能

Flags

8

位 0(最高位):Reboot Flag(重启后设为 1,Session ID 循环后设为 0);位 1:Unicast Flag(是否支持单播接收)

Reserved

24

保留字段,固定为 0x000000

Length of Entries Array

32

条目数组的总字节数

Length of Options Array

32

选项数组的总字节数

4.2 条目数组(Entries Array)

存储服务或事件组的状态信息,分为服务条目(Service Entry)事件组条目(Eventgroup Entry) 两类,均为 16 字节固定长度。

4.2.1 服务条目(Service Entry)

用于服务实例的 “查找(Find)”“提供(Offer)”“停止提供(Stop Offer)”,字段如下:

字段名称

长度(bit)

规则

Type

8

0x00:FindService(查找服务);0x01:OfferService(提供服务);0x00+TTL=0:StopOffer(停止提供)

Index First/Second Option Run

8/8

选项数组中第一个 / 第二个选项的索引(0 表示起始)

Number of Options 1/2

4/4

第一个 / 第二个选项组的选项数量(0 表示无选项)

Service ID

16

服务唯一标识(0xFFFE 用于非 SOME/IP 服务,0xFFFF 为专用服务)

Instance ID

16

服务实例标识(0xFFFF 表示所有实例)

Major Version

8

服务主版本号(0xFF 表示任意版本)

TTL

24

条目有效期(秒),0xFFFFFF 表示永久有效,0x000000 表示停止(仅 Stop Offer 用)

Minor Version

32

服务次版本号(0xFFFFFFFF 表示任意版本)

4.2.2 事件组条目(Eventgroup Entry)

用于事件组的 “订阅(Subscribe)”“停止订阅(Stop Subscribe)”“确认(Ack/Nack)”,字段如下:

字段名称

长度(bit)

规则

Type

8

0x06:SubscribeEventgroup(订阅);0x07:SubscribeEventgroupAck(确认);0x07+TTL=0:Nack(拒绝)

Index First/Second Option Run

8/8

同服务条目

Number of Options 1/2

4/4

同服务条目

Service ID/Instance ID

16/16

所属服务的 ID 和实例 ID

Major Version

8

服务主版本号

TTL

24

同服务条目(0x000000 表示停止订阅)

Reserved

16

固定为 0x0000

Eventgroup ID

16

事件组唯一标识(0x0000/0xFFFF 为保留值)

4.3 选项数组(Options Array)

用于补充条目信息(如 IP 地址、端口、配置参数),每个选项由 “16bit 长度字段 + 8bit 类型字段 + 数据” 组成,核心选项类型如下:

选项类型

类型值(Type)

核心功能与格式

配置选项(Configuration)

0x01

传输键值对配置(如 “otherserv=internaldiag” 标识非 SOME/IP 服务),格式为 “保留字节(0x00) + 动态长度字符串”

IPv4 端点选项(IPv4 Endpoint)

0x04

标识服务端点(IP + 端口 + 传输协议),格式:
- 32bit IPv4 地址
- 8bit 保留(0x00)
- 8bit L4 协议(0x06=TCP,0x11=UDP)
- 16bit 端口号

IPv4 组播选项(IPv4 Multicast)

0x14

标识组播事件端点,格式同 IPv4 Endpoint(仅支持 UDP)

IPv6 端点 / 组播选项

0x06/0x16

同 IPv4 选项,仅 IP 地址为 128bit IPv6 地址

五、关键约束与兼容性规则

  1. 传输协议选择:UDP 优先用于低延迟场景( payload ≤1400 字节),TCP 用于大尺寸数据(如超过 1400 字节),需在接口定义中指定。

  2. 版本兼容性:主版本号不兼容时拒绝通信;次版本号兼容时,新增参数需放在参数列表末尾,旧版本 ECU 可忽略超出部分。

  3. 保留标识:部分 Service ID(如 0x0000、0xFFFF)、Instance ID(如 0x0000、0xFFFF)、Method ID(如 0x0000、0xFFFF)为保留值,不可用于业务服务。

SOME/IP协议
https://www.bytecanvas.top/archives/gRnMW4w6
作者
禧语许
发布于
更新于
许可