SOME/IP 是一种汽车中间件解决方案,可用于控制消息。它从一开始就旨在完美地适应不同尺寸和不同操作系统的设备。这包括小型设备,如相机、AUTOSAR 设备,以及最高主机或远程信息处理设备。 还确保 SOME/IP 支持信息娱乐域的功能以及车辆中其他域的功能,允许 SOME/IP 用于 MOST 替换场景以及更传统的 CAN 场景。
SOME/IP 支持广泛的中间件功能:
- Serialization – transforming into and from on-wire representation.
- Remote Procedure Call (RPC) and Messaging –实现函数和其他消息的远程调用。
- Service Discovery (SD) – 动态查找和功能并配置其访问。
- Publish/Subscribe (Pub/Sub) – 动态配置需要哪些数据并将其发送给客户端。
- Segmentation of UDP messages – 允许通过 UDP 传输大型 SOME/IP 消息而无需分段。
Serialization
SOME/IP 序列化被设计为非常高效; 即它使用最少的 RAM 和 CPU 资源。这是通过使用二进制和非描述性格式来实现的。 基本上所有参数都写在彼此的后面。 消息的格式与消息的内存表示(打包结构)非常相似或在许多情况下完全相同。
SOME/IP 可以序列化以下基本数据类型(数据类型默认以网络字节顺序/大端编码,但也可以以小端编码):
- boolean: an 8bit field encoding False (0) or True (1). All other values are not allowed to be used.
- uint8: unsigned integer with 8 bit size.
- uint16: unsigned integer with 16 bit size.
- uint32: unsigned integer with 32 bit size.
- uint64: unsigned integer with 64 bit size.
- sint8: signed integer with 8 bit size.
- sint16: signed integer with 16 bit size.
- sint32: signed integer with 32 bit size.
- sint64: signed integer with 64 bit size.
- float32: floating point numbers with 32 bit size.
- float64: floating point numbers with 64 bit size.
SOME/IP 可以序列化以下复杂数据类型:
- struct: a parameter that combines a predefined list of parameters. A struct can start with an optional length field counting all bytes of the struct following the length field.
- string: fixed length or dynamic length character strings transporting ascii, UTF-8, or UTF-16 characters. For dynamic length strings, the string starts with a big-endian encoded length field counting the bytes the string characters use.
- array: a parameter that contains a repetition of the same parameter type. This can be predefined number or dynamic number of parameters. For arrays with dynamic length a length field is used.
- enumeration: an uint with the option of naming different values.
- bitfield: 8, 16, or 32bit parameter, with each bit representing a boolean. Each boolean can have a name as well as a name for the True and False value each.
- union: a parameter that can carry a parameter of a predefined parameter type, which is determined at the runtime. The serialization uses a length field, type field, and the data of the parameter.
长度和类型字段的大小为 32 位(默认),可配置为 0、8、16 或 32 位。 所有长度和类型字段都以网络字节顺序/大端编码。
Remote Procedure Call (RPC) and Messaging
SOME/IP服务支持以下消息:
Request/Response Methods: 从客户端发送到服务器的请求和从服务器发送回客户端的响应。 此外,SOME/IP 允许将错误响应从服务器发送回客户端,而不是常规响应。 此功能可用于在错误情况下实现不同的有效负载格式。
Fire and Forget Methods: 请求从客户端发送到服务器。
Event: 事件从服务器发送到相关客户端。 哪个客户端需要此事件将通过 SOME/IP-SD 确定。
Field: 一个字段可以有一个选项通知器(循环或更改时发送的事件)、一个可选的设置器(更新字段的请求/响应方法)和一个可选的获取器(读取当前值的请求/响应方法) 领域的。)
Proprietary extension to the SOME/IP serialization
SOME/IP 已经在消息序列化方面支持了很大的灵活性,比如稍后向消息或内部结构添加参数。
在后来的 AUTOSAR 版本中,专有扩展(最初被错误地称为 TLV 扩展)被添加到 SOME/IP 中,以支持更大的灵活性。 基本上参数和/或结构成员可以以数据 ID 和长度指示作为前缀。 虽然这会降低序列化的效率,但它增加了灵活性,例如从消息中删除参数或稍后重新排序参数。 要使用此功能,API 和应用程序也需要支持此功能。
由于有限的灵活性和高开销,这个扩展目前没有被广泛使用。
请记住,并非所有 SOME/IP 实现都支持此扩展,因为它不是原始 SOME/IP 的一部分。
AUTOSAR support
SOME/IP 是唯一已知的旨在集成到 AUTOSAR 4.x 版本中的中间件:
AUTOSAR 4.0 – 对已经存在的 SOME/IP 消息的基本支持。
AUTOSAR 4.1 – 添加了对 SOME/IP-SD 和发布/订阅的支持。
AUTOSAR 4.2 – 添加了转换器以进行序列化以及其他优化。
AUTOSAR 4.3 – 修复了一些转换器错误,增加了对带有 SOME/IP-TP 的大型 UDP 消息的支持以及 SOME/IP-SD 优化。