Cuando defines asignaciones de middleware escalable orientado a servicios sobre IP (SOME/IP) en VSIDL, describes la serialización del formato de cable y la codificación de la carga útil de cada mensaje de SOME/IP. Con las definiciones de SomeIpType y SomeIpStruct, puedes modelar primitivos, cadenas, arrays y structs anidados que coincidan con las reglas de codificación de carga útil de la pila AUTOSAR ARXML (SOMEIP-TRANSFORMATION-PROPS) y SOME/IP (incluido COVESA vsomeip).
En esta página, se explica cómo escribir una definición de tipo SomeIpStruct, que se usa en los bloques type_definition para las asignaciones de eventos y métodos.
Mensaje SomeIpStruct
Un mensaje SomeIpStruct representa una carga útil estructurada de SOME/IP que consta de varios campos. El agente de SOME/IP usa la estructura definida aquí para traducir entre bytes sin procesar de SOME/IP y los campos de un mensaje de protobuf de SDV.
Cuando defines un struct, configuras dos propiedades principales:
length_field_size(opcional): Especifica el tamaño (en bytes) del campo de longitud que precede a la struct en la carga útil serializada. Los valores usados del enumLengthFieldSizeincluyenZERO(sin campo de longitud),ONE,TWOyFOUR.field(repetido): Es una lista de campos que componen el struct.
Cómo definir campos de struct
Cada campo dentro de SomeIpStruct requiere lo siguiente:
field_name: Es el nombre del campo. Debe coincidir exactamente con el nombre del campo correspondiente definido en el mensaje .proto de SDV para garantizar la traducción correcta del mensaje.field_type: Es el tipo de datos de SOME/IP del campo (SomeIpType). Puede ser un tipo primitivo, una cadena, un array o alguna otra struct anidada.
Escribe tipos de campos de SomeIpType
El bloque field_type configura el tipo de datos específico con una de las siguientes variantes:
- Tipos primitivos: Usa
someip_primitivecon valores comoUINT8,UINT32,INT32,FLOAT32yBOOL. - Cadenas: Usa
someip_stringy especifica la codificación (por ejemplo,UTF_8oUTF_16_LE) y la información de longitud (fixed_lengtholength_field_size). - Arrays: Usa
someip_arrayy definearray_type(que es otroSomeIpTyperecursivo), junto con información de longitud (fixed_lengtholength_field_size). - Structs anidados: Usa
someip_structpara incorporar otra definición de struct de forma recursiva.
Ejemplo: Escribe una definición de tipo struct
A continuación, se muestra un ejemplo práctico de cómo escribir un SomeIpStruct dentro de un bloque type_definition. Esta carga útil contiene un número entero de 8 bits sin firma llamado interval y un número entero de 32 bits sin firma llamado 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
}
}
}
Cómo agregar tipos complejos
Para incluir un campo de cadena de longitud dinámica y un array dentro de la estructura, agrega campos como los siguientes:
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 }
}
}
}
Asigna la codificación de la carga útil de AUTOSAR ARXML y vsomeip
Cuando integres AAOS SDV con unidades de control electrónico (ECU) externas de AUTOSAR o pilas de SOME/IP, como COVESA vsomeip, asegúrate de que tu VSIDL type_definition coincida con los parámetros de serialización de cable definidos en la configuración de ARXML (SOMEIP-TRANSFORMATION-PROPS y SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) o vsomeip de tu sistema:
AUTOSAR ARXML y parámetro vsomeip |
Equivalente de VSIDL SomeIpType |
Regla de codificación de la carga útil y serialización de cable |
|---|---|---|
sizeOfStructLengthField (0, 1,
2, 4 bytes) |
SomeIpStruct.length_field_size (ZERO,
ONE, TWO, FOUR) |
Antepone un prefijo explícito de longitud en bytes antes de la carga útil de la struct serializada. Se establece en ZERO para structs de diseño fijo sin un prefijo de longitud. |
sizeOfArrayLengthField (0, 1,
2, 4 bytes) |
SomeIpArray.length_field_size (ZERO,
ONE, TWO, FOUR) o
fixed_length |
Los arrays dinámicos requieren un prefijo de campo de longitud (ONE, TWO o FOUR bytes) que indique la longitud en bytes de los elementos del array serializado. |
sizeOfStringLengthField y codificación (UTF-8, UTF-16LE, UTF-16BE) |
SomeIpString.string_encoding y
length_field_size o fixed_length |
Coincide con las reglas de serialización de cadenas de AUTOSAR (incluido el control de la marca de orden de bytes y la terminación nula) para cadenas de longitud variable y fija. |
Tipos básicos primitivos (uint8, uint16, uint32, float32, boolean) |
SomeIpPrimitive (UINT8,
UINT16, UINT32, INT32,
FLOAT32, BOOL) |
Codifica valores primitivos en orden de bytes de red (big-endian de forma predeterminada según la especificación de SOME/IP) que coinciden con el campo .proto de destino. |