Khi xác định các ánh xạ phần mềm trung gian hướng dịch vụ có thể mở rộng qua IP (SOME/IP) trong VSIDL, bạn sẽ mô tả quá trình chuyển đổi tuần tự định dạng truyền dữ liệu và mã hoá tải trọng của từng thông báo SOME/IP. Bằng cách sử dụng các định nghĩa SomeIpType và SomeIpStruct, bạn có thể mô hình hoá các kiểu dữ liệu nguyên thuỷ, chuỗi, mảng và cấu trúc lồng nhau khớp với AUTOSAR ARXML (SOMEIP-TRANSFORMATION-PROPS) và các quy tắc mã hoá tải trọng ngăn xếp SOME/IP (bao gồm cả COVESA vsomeip).
Trang này tập trung vào cách viết định nghĩa loại SomeIpStruct. Định nghĩa này được dùng trong các khối type_definition để liên kết sự kiện và phương thức.
Thông báo SomeIpStruct
Thông báo SomeIpStruct biểu thị một tải trọng SOME/IP có cấu trúc bao gồm nhiều trường. Cấu trúc được xác định ở đây được trình môi giới SOME/IP dùng để dịch giữa các byte SOME/IP thô và các trường của thông báo SDV protobuf.
Khi xác định một cấu trúc, bạn sẽ định cấu hình 2 thuộc tính chính:
length_field_size(không bắt buộc): Chỉ định kích thước (tính bằng byte) của trường độ dài đứng trước cấu trúc trong tải trọng được chuyển đổi tuần tự. Các giá trị được dùng từ enumLengthFieldSizebao gồmZERO(không có trường độ dài),ONE,TWOvàFOUR.field(lặp lại): Danh sách các trường tạo nên cấu trúc.
Xác định các trường cấu trúc
Mỗi trường bên trong SomeIpStruct đều yêu cầu:
field_name: Tên của trường. Tên này phải khớp chính xác với tên trường tương ứng được xác định trong thông báo protobuf SDV để đảm bảo bản dịch thông báo phù hợp.field_type: Kiểu dữ liệu SOME/IP của trường (SomeIpType). Đây có thể là một kiểu nguyên thuỷ, chuỗi, mảng hoặc một cấu trúc lồng nhau khác.
Viết một số loại trường SomeIpType
Khối field_type định cấu hình loại dữ liệu cụ thể bằng một trong các biến thể sau:
- Các kiểu nguyên thuỷ: Sử dụng
someip_primitivevới các giá trị nhưUINT8,UINT32,INT32,FLOAT32vàBOOL. - Chuỗi: Sử dụng
someip_stringvà chỉ định thông tin mã hoá (ví dụ:UTF_8hoặcUTF_16_LE) và độ dài (fixed_lengthhoặclength_field_size). - Mảng: Sử dụng
someip_arrayvà xác địnharray_type(là mộtSomeIpTypeđệ quy khác), cùng với thông tin về độ dài (fixed_lengthhoặclength_field_size). - Cấu trúc lồng nhau: Sử dụng
someip_structđể nhúng một định nghĩa cấu trúc khác một cách đệ quy.
Ví dụ: Viết định nghĩa kiểu cấu trúc
Sau đây là ví dụ thực tế về cách viết SomeIpStruct bên trong một khối type_definition. Tải trọng này chứa một số nguyên không dấu 8 bit có tên là interval và một số nguyên không dấu 32 bit có tên là 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
}
}
}
Thêm các loại phức tạp
Để đưa một trường chuỗi có độ dài linh hoạt và một mảng vào bên trong cấu trúc, hãy thêm các trường như sau:
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 }
}
}
}
Ánh xạ AUTOSAR ARXML và mã hoá tải trọng vsomeip
Khi tích hợp AAOS SDV với các bộ điều khiển điện tử (ECU) AUTOSAR bên ngoài hoặc các ngăn xếp SOME/IP như COVESA vsomeip, hãy đảm bảo VSIDL type_definition của bạn khớp với các tham số tuần tự hoá dây được xác định trong ARXML (SOMEIP-TRANSFORMATION-PROPS và SOMEIP-DATA-PROTOTYPE-TRANSFORMATION-PROPS) hoặc cấu hình vsomeip của hệ thống:
AUTOSAR ARXML và tham số vsomeip |
Tương đương với VSIDL SomeIpType |
Quy tắc chuyển đổi tuần tự và mã hoá tải trọng |
|---|---|---|
sizeOfStructLengthField (0, 1,
2, 4 byte) |
SomeIpStruct.length_field_size (ZERO,
ONE, TWO, FOUR) |
Thêm một tiền tố có độ dài byte rõ ràng trước tải trọng cấu trúc được tuần tự hoá. Đặt thành ZERO cho các cấu trúc bố cục cố định mà không có tiền tố độ dài. |
sizeOfArrayLengthField (0, 1, 2, 4 byte) |
SomeIpArray.length_field_size (ZERO, ONE, TWO, FOUR) hoặc fixed_length |
Mảng động yêu cầu phải có tiền tố trường độ dài (ONE, TWO hoặc FOUR byte) cho biết độ dài byte của các phần tử mảng được chuyển đổi tuần tự. |
sizeOfStringLengthField và bộ mã hoá (UTF-8, UTF-16LE, UTF-16BE) |
SomeIpString.string_encoding và length_field_size hoặc fixed_length |
Khớp các quy tắc chuyển đổi tuần tự chuỗi AUTOSAR (bao gồm cả dấu thứ tự byte và cách xử lý việc kết thúc bằng giá trị rỗng) cho các chuỗi có độ dài thay đổi và độ dài cố định. |
Các kiểu cơ sở nguyên thuỷ (uint8, uint16, uint32, float32, boolean) |
SomeIpPrimitive (UINT8,
UINT16, UINT32, INT32,
FLOAT32, BOOL) |
Mã hoá các giá trị nguyên thuỷ theo thứ tự byte mạng (theo mặc định là big-endian theo quy cách SOME/IP) khớp với trường protobuf đích. |