Wenn Sie in VSIDL SOME/IP-Zuweisungen (Scalable Service-Oriented Middleware over IP) definieren, beschreiben Sie die Serialisierung des Wire-Formats und die Nutzlastcodierung jeder SOME/IP-Nachricht. Mithilfe der Definitionen SomeIpType und SomeIpStruct können Sie Primitiven, Strings, Arrays und verschachtelte Strukturen modellieren, die den ARXML-Regeln von AUTOSAR (SOMEIP-TRANSFORMATION-PROPS) und den Regeln für die Nutzlastcodierung des SOME/IP-Stacks (einschließlich COVESA vsomeip) entsprechen.
Auf dieser Seite wird beschrieben, wie Sie eine Typdefinition vom Typ SomeIpStruct schreiben, die in type_definition-Blöcken für Ereignis- und Methodenzuordnungen verwendet wird.
SomeIpStruct-Nachricht
Eine SomeIpStruct-Nachricht stellt eine strukturierte SOME/IP-Nutzlast dar, die aus mehreren Feldern besteht. Die hier definierte Struktur wird vom SOME/IP-Broker verwendet, um zwischen unformatierten SOME/IP-Bytes und den Feldern einer SDV-Protobuf-Nachricht zu übersetzen.
Beim Definieren einer Struktur konfigurieren Sie zwei Haupteigenschaften:
length_field_size(optional): Gibt die Größe (in Byte) des Längenfelds an, das dem Struct in der serialisierten Nutzlast vorangestellt ist. Verwendete Werte aus derLengthFieldSize-Aufzählung sindZERO(kein Längenfeld),ONE,TWOundFOUR.field(wiederholt): Eine Liste der Felder, aus denen das Struct besteht.
STRUCT-Felder definieren
Für jedes Feld in SomeIpStruct ist Folgendes erforderlich:
field_name: Der Name des Felds. Dieser Name muss genau mit dem entsprechenden Feldnamen übereinstimmen, der in der SDV-Protobuf-Nachricht definiert ist, damit die Nachricht richtig übersetzt wird.field_type: Der SOME/IP-Datentyp des Felds (SomeIpType). Dies kann ein primitiver Datentyp, ein String, ein Array oder eine andere verschachtelte Struktur sein.
SomeIpType-Feldtypen schreiben
Mit dem Block field_type wird der jeweilige Datentyp mit einer der folgenden Varianten konfiguriert:
- Einfache Typen:Verwenden Sie
someip_primitivemit Werten wieUINT8,UINT32,INT32,FLOAT32undBOOL. - Strings:Verwenden Sie
someip_stringund geben Sie die Codierung (z. B.UTF_8oderUTF_16_LE) und Längeninformationen (entwederfixed_lengthoderlength_field_size) an. - Arrays:Verwenden Sie
someip_arrayund definieren Siearray_type(eine weitere rekursiveSomeIpType) sowie Längeninformationen (fixed_lengthoderlength_field_size). - Geschachtelte Strukturen:Verwenden Sie
someip_struct, um rekursiv eine weitere Strukturdefinition einzubetten.
Beispiel: Struct-Typdefinition schreiben
Hier ist ein praktisches Beispiel dafür, wie Sie eine SomeIpStruct in einem type_definition-Block schreiben. Diese Nutzlast enthält eine vorzeichenlose 8-Bit-Ganzzahl namens interval und eine vorzeichenlose 32-Bit-Ganzzahl namens counter:
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
}
}
}
Komplexe Typen hinzufügen
Wenn Sie ein Stringfeld mit dynamischer Länge und ein Array in das Struct einfügen möchten, fügen Sie Felder wie dieses hinzu:
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 und vsomeip-Nutzlastcodierung zuordnen
Wenn Sie AAOS SDV in externe AUTOSAR-Steuergeräte (ECUs) oder SOME/IP-Stacks wie COVESA vsomeip einbinden, muss Ihr VSIDL type_definition mit den in der ARXML (SOMEIP-TRANSFORMATION-PROPS und SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) oder der vsomeip-Konfiguration Ihres Systems definierten Wire-Serialisierungsparametern übereinstimmen:
AUTOSAR ARXML und vsomeip-Parameter |
VSIDL-Entsprechung SomeIpType |
Regel für die Serialisierung und Nutzlastcodierung |
|---|---|---|
sizeOfStructLengthField (0, 1,
2, 4 Bytes) |
SomeIpStruct.length_field_size (ZERO,
ONE, TWO, FOUR) |
Stellt der serialisierten Nutzlast der Struktur ein explizites Präfix für die Bytelänge voran. Legen Sie diese Option auf ZERO fest, wenn Sie Strukturen mit festem Layout ohne Längenpräfix verwenden. |
sizeOfArrayLengthField (0, 1,
2, 4 Bytes) |
SomeIpArray.length_field_size (ZERO,
ONE, TWO, FOUR) oder
fixed_length |
Für dynamische Arrays ist ein Längenfeldpräfix (ONE, TWO oder FOUR Bytes) erforderlich, das die Bytelänge der serialisierten Arrayelemente angibt. |
sizeOfStringLengthField und Codierung (UTF-8, UTF-16LE, UTF-16BE) |
SomeIpString.string_encoding und
length_field_size oder fixed_length |
Entspricht den AUTOSAR-Regeln für die String-Serialisierung (einschließlich der Verarbeitung von Byte Order Mark und Null-Terminierung) für Strings mit variabler und fester Länge. |
Einfache Basistypen (uint8, uint16, uint32, float32, boolean) |
SomeIpPrimitive (UINT8,
UINT16, UINT32, INT32,
FLOAT32, BOOL) |
Codiert einfache Werte in Netzwerkbyte-Reihenfolge (standardmäßig Big-Endian gemäß SOME/IP-Spezifikation), die dem Ziel-Protobuf-Feld entsprechen. |