撰寫 SOME/IP 類型定義

在 VSIDL 中定義可擴充的服務導向中介軟體 (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 }
    }
  }
}