编写 SOME/IP 类型定义

在 VSIDL 中定义基于 IP 的可扩展面向服务的中间件 (SOME/IP) 映射时,您需要描述每个 SOME/IP 消息的线格式序列化和载荷编码。借助 SomeIpTypeSomeIpStruct 定义,您可以对与 AUTOSAR ARXML (SOMEIP-TRANSFORMATION-PROPS) 和 SOME/IP 堆栈载荷编码规则(包括 COVESA vsomeip)相匹配的基元、字符串、数组和嵌套结构体进行建模。

本页重点介绍如何编写 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 }
    }
  }
}

映射 AUTOSAR ARXML 和 Vsomeip 载荷编码

将 AAOS SDV 与外部 AUTOSAR 电子控制单元 (ECU) 或 SOME/IP 堆栈(例如 COVESA vsomeip)集成时,请确保您的 VSIDL type_definition 与系统 ARXML(SOMEIP-TRANSFORMATION-PROPSSOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS)或 vsomeip 配置中定义的有线序列化参数相匹配:

AUTOSAR ARXML 和 vsomeip 参数 VSIDL SomeIpType 等效项 有线序列化和载荷编码规则
sizeOfStructLengthField0124 字节) SomeIpStruct.length_field_sizeZEROONETWOFOUR 在序列化结构体载荷之前,添加一个明确的字节长度前缀。对于没有长度前缀的固定布局结构,设置为 ZERO
sizeOfArrayLengthField0124 字节) SomeIpArray.length_field_sizeZEROONETWOFOUR)或 fixed_length 动态数组需要一个长度字段前缀(ONETWOFOUR 字节),用于指示序列化数组元素的字节长度。
sizeOfStringLengthField 和编码(UTF-8UTF-16LEUTF-16BE SomeIpString.string_encodinglength_field_sizefixed_length 匹配可变长度和固定长度字符串的 AUTOSAR 字符串序列化规则(包括 BOM 和 null 终止处理)。
基本基元类型(uint8uint16uint32float32boolean SomeIpPrimitiveUINT8UINT16UINT32INT32FLOAT32BOOL 以网络字节顺序(根据 SOME/IP 规范,默认采用 Big-Endian)对原始值进行编码,以匹配目标 protobuf 字段。