Khi xác định các mối liên kết trung gian hướng dịch vụ có khả năng mở rộng qua IP (SOME/IP) trong VSIDL, bạn sẽ mô tả cấu trúc của tải trọng SOME/IP. Bạn mô tả cấu trúc bằng thông báo SomeIpType, cho phép bạn mô hình hoá các kiểu dữ liệu gốc, chuỗi, mảng và cấu trúc phức tạp.
Trang này tập trung vào cách viết định nghĩa loại SomeIpStruct, được dùng trong các khối type_definition cho các mối liên kết sự kiện và phương thức.
Thông báo SomeIpStruct
Thông báo SomeIpStruct đại diện cho 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 tuần tự hoá. 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 SDV protobuf để đảm bảo bản dịch thông báo phù hợp.field_type: Loại dữ liệu SOME/IP của trường (SomeIpType). Đây có thể là kiểu dữ liệu gốc, chuỗi, mảng hoặc một cấu trúc lồng nhau khác.
Viết các 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 loại dữ liệu gốc: 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 về mã hoá (ví dụ:UTF_8,UTF_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 loại cấu trúc
Dưới đây là ví dụ thực tế về cách viết SomeIpStruct bên trong 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 dữ liệu phức tạp
Để đưa trường chuỗi có độ dài động và 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 }
}
}
}