在 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(无长度字段)、ONE、TWO和FOUR。field(重复):构成结构体的字段列表。
定义结构体字段
SomeIpStruct 中的每个字段都需要:
field_name:字段的名称。此名称必须与 SDV protobuf 消息中定义的相应字段名称完全一致,以确保消息能够正确翻译。field_type:字段的 SOME/IP 数据类型 (SomeIpType)。可以是基本类型、字符串、数组或其他嵌套结构。
写入 SomeIpType 字段类型
field_type 块使用以下变体之一配置特定数据类型:
- 基本类型:使用
someip_primitive,其值可以是UINT8、UINT32、INT32、FLOAT32和BOOL。 - 字符串:使用
someip_string并指定编码(例如UTF_8、UTF_16_LE)和长度信息(fixed_length或length_field_size)。 - 数组:使用
someip_array并定义array_type(这是另一个递归SomeIpType),以及长度信息(fixed_length或length_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 }
}
}
}