SOME/IP背景
SOME/IP的全称是Scalable service-Oriented MiddlewarE over IP,为基于IP的可扩展的面向服务的中间件,由宝马的Lars Völker博士在2011年设计并提出。SOME/IP是车载网络的通信中间件,位于应用程序和传输层之间,可以为控制器提供一种面向服务的通信方式,适配多种操作系统(如FreeRTOS、RTA-OS、QNX、Linux、Android等),甚至在没有操作系统的嵌入式设备上也可以使用。
什么是SOME/IP?
SOME/IP是定义在传输层之上的一种面向服务的中间件协议. 是汽车以太网面向服务架构的SOA的重要内容.

SOME/IP功能:
- 序列化
- RPC远程调用
- 服务发现SD
- 发布 / 订阅
- SOME/IP传输协议
1. 序列化
SOME/IP协议对序列化的解释为数据在PDU(Protocol Data Units 协议数据单元), 展开来说就是将不同的数据结构转换为可在网络中传输的形式, 或者说是数据在网络上传输的封装和排列规则. 发送规则将数据一种特定的规则进行序列化, 接受方将数据以同样的规则进行反序列化, 从而得到发送方到接受方所发送的所有数据. 这部分定义既包含了报文头部也包含了载荷数据, 不仅定义了头部的格式 各字段的长度和含义, 还定义了各种数据结构在有效载荷中的排列规则.
2. RPC 远程调用
通过RPC来请求其他主机上面的服务, 基于Request / Response的模式来实现. 客户端发起请求, 服务端接受请求并处理, 并将结果返回给客户端. (当我们在调用服务的时候, 就像直接调用本地的服务一样)
在SOME/IP中除了同步的调用方式, 还支持异步调用的Fire/Forget, 客户端发起请求后,不需要等待服务器的处理请求, 可以直接执行后面的代码, 同时服务器也不需要返回结果
3. 服务发现
SOME/IP SD可以认为是SOME/IP协议的核心, 提供了一种可以动态的发现和获取服务的状态的机制. 所谓的面向服务的通信: 首先要知道哪些可以提供服务, 并且需要知道哪些服务的状态和提供方, 然后才可以使用和消费这个服务.
4. 发布 / 订阅功能
SOME/IP只会在需要的时候才发送数据, 这主要是通过发布 / 订阅的机制来实现的. 客户端在发现想要使用的服务后, 会对服务进行订阅, 当条件满足后, 服务器会将客户端所需要的服务发送出去.
5. SOME/IP 传输协议
主要解决了数据有可能被分片的问题. 在网络中, 数据都是通过IP协议传输的, 由于数据链路层MTU的限制, 导致可能会出现IP分片. 由于IP分片存在诸多的问题, 为了防止IP出现分片, 设计了SOME/IP TP(传输协议)
IP分片的问题
IP分片虽然能解决MTU限制, 但存在以下限制:
- 重组开销大: 接受端需缓存所有分片, 直到最后一个分片到达, 消耗内存和计算资源
- 分片丢失影响整体: 任一IP分片丢失会导致整个数据包无法重组, 需全部重传
所以有了SOME/IP在应用层实现分片和重组, 规避了IP分片, 在应用层自定义重传逻辑...
服务
服务是SOME/IP的核心,服务端提供服务,客户端使用服务.服务由零个或多个方法(Method)、事件(Event)以及字段(Fields)组成.
方法(Method)
客户端调用服务端的代码. 有两种形式:
- Request & Response:常规的客户端请求,服务端响应
- Fire & Forget(Request_NoReturn):单向客服端请求,服务端不响应
事件(Event)
客户端向服务端订阅事件组EventGroup,当事件组有更新的时候,服务端发布消息,通知所有订阅的客户端
字段(Field)
方法和事件的组合,提供Getter/Setter两个方法用于去获取和设置字段,以及Notification事件,当字段值发生变化的时候,服务端发布消息,通知订阅的客户端
消息格式
TCP/UDP 的 Payload 部分,由 SOME/IP Header 和 SOME/IP Payload 组成
各字段含义如上图,其中 Message Type 取值及含义如下表:
服务发现主要用于
- 定位服务实例
- 检测服务实例状态是否在运行
- 发布/订阅行为管理
SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。
参考博客