撰寫 SOME/IP 類型定義

在 VSIDL 中定義可擴充的服務導向中介軟體 (SOME/IP) 對應時,您會描述每個 SOME/IP 訊息的線路格式序列化和酬載編碼。使用 SomeIpType 和 SomeIpStruct 定義,您可以模擬符合 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 (無長度欄位)、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 }
    }
  }
}

對應 AUTOSAR ARXML 和 vsomeip 酬載編碼

將 AAOS SDV 與外部 AUTOSAR 電子控制單元 (ECU) 或 SOME/IP 堆疊 (例如 COVESA vsomeip) 整合時,請確保 VSIDL type_definition 符合系統 ARXML (SOMEIP-TRANSFORMATION-PROPS 和 SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) 或 vsomeip 設定中定義的線路序列化參數:

AUTOSAR ARXML 和 vsomeip 參數 VSIDL SomeIpType 對等項目 線路序列化和酬載編碼規則
sizeOfStructLengthField (0、1、 2、4 個位元組) SomeIpStruct.length_field_size (ZERO、 ONE、TWO、FOUR) 在序列化結構體酬載之前,預先加入明確的位元組長度前置字串。如果是不含長度前置字元的固定版面配置結構體,請設為 ZERO。
sizeOfArrayLengthField (0、1、 2、4 個位元組) SomeIpArray.length_field_size (ZERO、ONE、TWO、FOUR) 或 fixed_length 動態陣列需要長度欄位前置字元 (ONE、TWO 或 FOUR 個位元組),指出序列化陣列元素的位元組長度。
sizeOfStringLengthField 和編碼 (UTF-8、 UTF-16LE、UTF-16BE) SomeIpString.string_encoding 和 length_field_size 或 fixed_length 符合 AUTOSAR 字串序列化規則 (包括位元組順序標記和空值終止處理),適用於變數長度和固定長度的字串。
原始基本型別 (uint8、uint16、uint32、float32、boolean) SomeIpPrimitive (UINT8、 UINT16、UINT32、INT32、 FLOAT32、BOOL) 以網路位元組順序 (根據 SOME/IP 規格,預設為大端序) 編碼原始值,與目標 protobuf 欄位相符。