编写 SOME/IP 类型定义

在 VSIDL 中定义基于 IP 的可扩展面向服务的中间件 (SOME/IP) 映射时,您需要描述 SOME/IP 载荷的结构。您可以使用 SomeIpType 消息来描述结构,该消息可让您对原始类型、字符串、数组和复杂结构体进行建模。

本页重点介绍如何编写 SomeIpStruct 类型定义,该定义用于 type_definition 块中的事件和方法映射。

SomeIpStruct 消息

SomeIpStruct 消息表示由多个字段组成的结构化 SOME/IP 载荷。此处定义的结构由 SOME/IP 代理用于在原始 SOME/IP 字节和 SDV protobuf 消息的字段之间进行转换。

定义结构体时,您需要配置两个主要属性:

  • length_field_size(可选):指定序列化载荷中位于结构体之前的长度字段的大小(以字节为单位)。LengthFieldSize 枚举中的可用值包括 ZERO(无长度字段)、ONETWOFOUR
  • field(重复):构成结构体的字段列表。

定义结构体字段

SomeIpStruct 中的每个字段都需要:

  • field_name:字段的名称。此名称必须与 SDV protobuf 消息中定义的相应字段名称完全一致,以确保消息能够正确翻译。
  • field_type:字段的 SOME/IP 数据类型 (SomeIpType)。可以是基本类型、字符串、数组或其他嵌套结构。

写入 SomeIpType 字段类型

field_type 块使用以下变体之一配置特定数据类型:

  • 基本类型:使用 someip_primitive,其值可以是 UINT8UINT32INT32FLOAT32BOOL
  • 字符串:使用 someip_string 并指定编码(例如 UTF_8UTF_16_LE)和长度信息(fixed_lengthlength_field_size)。
  • 数组:使用 someip_array 并定义 array_type(这是另一个递归 SomeIpType),以及长度信息(fixed_lengthlength_field_size)。
  • 嵌套结构体:使用 someip_struct 以递归方式嵌入另一个结构体定义。

示例:编写结构体类型定义

下面是一个实用示例,展示了如何在 type_definition 块内编写 SomeIpStruct。此载荷包含一个名为 interval 的 8 位无符号整数和一个名为 counter 的 32 位无符号整数:

type_definition {
  # No length field precedes this struct
  length_field_size: ZERO

  # First field: interval
  field {
    field_name: "interval"
    field_type {
      someip_primitive: UINT8
    }
  }

  # Second field: counter
  field {
    field_name: "counter"
    field_type {
      someip_primitive: UINT32
    }
  }
}

添加复杂类型

如需在结构体中包含动态长度的字符串字段和数组,请添加如下字段:

field {
  field_name: "status_message"
  field_type {
    someip_string {
      string_encoding: UTF_8
      length_field_size: FOUR
    }
  }
}
field {
  field_name: "measurements"
  field_type {
    someip_array {
      length_field_size: FOUR
      array_type { someip_primitive: FLOAT32 }
    }
  }
}