撰寫 SOME/IP 類型定義

在 VSIDL 中定義 Scalable service-Oriented MiddlewarE over 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 對等項目 線路序列化和酬載編碼規則
sizeOfStructLengthField (0124 位元組) SomeIpStruct.length_field_size (ZEROONETWOFOUR) 在序列化結構體酬載之前,預先加入明確的位元組長度前置字串。如果是不含長度前置字元的固定版面配置結構體,請將這個屬性的值設為 ZERO
sizeOfArrayLengthField (0124 位元組) SomeIpArray.length_field_size (ZEROONETWOFOUR) 或 fixed_length 動態陣列需要長度欄位前置字元 (ONETWOFOUR 個位元組),指出序列化陣列元素的位元組長度。
sizeOfStringLengthField 和編碼 (UTF-8UTF-16LEUTF-16BE) SomeIpString.string_encodinglength_field_sizefixed_length 符合可變長度和固定長度字串的 AUTOSAR 字串序列化規則 (包括 BOM 和空值終止處理)。
原始基本型別 (uint8uint16uint32float32boolean) SomeIpPrimitive (UINT8UINT16UINT32INT32FLOAT32BOOL) 以網路位元組順序 (根據 SOME/IP 規格,預設為 Big-Endian) 編碼原始值,與目標 protobuf 欄位相符。