在 VSIDL 中定義 Scalable service-Oriented MiddlewarE over IP (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 字串序列化規則 (包括 BOM 和空值終止處理)。 |
原始基本型別 (uint8、uint16、uint32、float32、boolean) |
SomeIpPrimitive (UINT8、UINT16、UINT32、INT32、FLOAT32、BOOL) |
以網路位元組順序 (根據 SOME/IP 規格,預設為 Big-Endian) 編碼原始值,與目標 protobuf 欄位相符。 |