zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

译:SOME/IP 技术细节

IP some 技术细节
2023-09-27 14:29:24 时间

译:SOME/IP 技术细节

原文: SOME/IP technical details


SOME/IP, Scalable service-Oriented MiddlewarE over IP (基于 IP 可扩展面向服务中间件)

概述

SOME/IP 是一种可用于“控制消息”的汽车中间件解决方案。它从一开始就被设计为完美地适合不同大小和不同操作系统的设备,包括小型设备如摄像机、AUTOSAR 设备,上至头部单元或远程信息处理设备,SOME/IP 还确保支持信息娱乐域的功能以及汽车中其他域的功能,允许 SOME/IP 用于大多数替换场景以及更传统的 CAN 场景。

SOME/IP 支持广泛的中间件功能:

  • Serialization —— 序列化与反序列化。
  • Remote Procedure Call (RPC) and Messaging —— 实现对函数以及其他消息的远程调用。
  • Service Discovery (SD) —— 服务发现,动态查找并配置其访问。
  • Publish/Subscribe (Pub/Sub) —— 发布与订阅,动态配置哪些数据是需要的以及应该发送给客户端的。
  • Segmentation of UDP messages —— UDP 消息分包,允许通过 UDP 传输 SOME/IP 大型消息而无需分段。

序列化

SOME/IP 序列化被设计为高效,比如它使用最小的 RAM 和 CPU 资源。这是通过使用二进制和非描述性格式实现的,基本上,所有的数据都写在彼此后面,消息的格式与消息的内存表示(打包结构)非常相似,或者在许多情况下完全相同。

SOME/IP 可以序列化以下基本数据类型(默认情况下,数据类型以网络字节序/大端序编码,但也可以以小端序编码):

  • boolean: 8 位字段编码 False(0) 或 True(1),不允许使用其他值。
  • uint8: 8 位大小的无符号整数。
  • uint16: 16 位大小的无符号整数。
  • uint32: 32 位大小的无符号整数。
  • uint64: 64 位大小的无符号整数。
  • sint8: 8 位大小的有符号整数。
  • sint16: 16 位大小的有符号整数。
  • sint32: 32 位大小的有符号整数。
  • sint64: 64 位大小的有符号整数。
  • float32: 32 位大小的浮点数字。
  • float64: 64 位大小的浮点数字。

SOME/IP 可以序列化以下复杂数据类型:

  • struct: 组合预定义参数列表的参数。一个结构体可以从一个可选的长度字段开始,计算长度字段后面结构的所有字节。
  • string: 固定长度或动态长度字符串传输 ascii, UTF-8 或者 UTF-16 字符,对于动态长度字符串,字符串以一个大端序编码的长度字段开始,该字段计算字符串所使用的字节数。
  • array: 包含相同数据类型的重复的数据。这可以是参数的预定义数量或动态数量,对于具有动态长度的数组则使用长度字段。
  • enumeration: 具有命名不同值选项的 uint。
  • bitfield: 8、16 或 32 位参数,每个位表示布尔值。每个布尔值可以有一个名称以及每个值的真值和假值的名称。
  • union: 可以携带预定义参数类型的参数的参数,该参数在运行时确定,序列化使用长度字段、类型字段和参数的数据。

长度和类型字段的大小为 32 位(默认值),可以配置为 0、8、16 或 32 位,所有长度和类型字段都以网络字节序/大端序编码。

远程过程调用和消息传递

SOME/IP 服务支持以下消息:

  • Request/Response Methods: 从客户端发送到服务器的请求 (Request) 和从服务器发送回客户的响应 (Response)。此外,SOME/IP 允许将错误响应从服务器发送回客户端,而不是常规响应,此功能可用于在错误情况下实现不同的 payload 格式。
  • Fire and Forget Methods: 从客户端向服务器发送请求。
  • Event: 事件 (Event) 从服务器发送到相关客户端,通过 SOME/IP-SD 确认哪个客户端需要此事件。
  • Field: 字段 (Field) 可以有一个可选的通知器 notifier(事件循环发送或更改时发送),一个可选的 setter(更新字段的请求/响应方法)和一个可选的 getter(读取字段当前值的请求/应答方法)。

SOME/IP 序列化的专有扩展

SOME/IP 已经在消息的序列化中支持了很多灵活性,比如延后向消息或者结构体内部添加参数。

在后面的 AUTOSAR 版本中,SOME/IP 添加了专有扩展(最初错误地称为 TLV 扩展)以支持更多的灵活性,基本上,参数和/或结构成员可以以数据 ID 和长度指示作为前缀。虽然这使序列化效率大大降低,但它增加了灵活性,如从消息中删除参数或稍后重新排序参数。要使用此功能,API 和应用程序也需要支持此功能。

由于灵活性有限和高开销,这种扩展目前没有广泛使用。

请记住,并非所有的 SOME/IP 实现都支持此扩展,因为它不是原始 SOME/IP 的一部分。

AUTOSAR 支持

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 优化。

有关 AUTOSAR 规范,请参阅标准

参考

http://www.some-ip.com
http://www.some-ip.com/details.shtml
http://www.some-ip.com/standards.shtml

欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景


▽ \bigtriangledown 译:vsomeip 10 分钟阅读