Viết định nghĩa loại SOME/IP

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ừ enum LengthFieldSize bao gồm ZERO (không có trường độ dài), ONE, TWO và 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_primitive với các giá trị như UINT8, UINT32, INT32, FLOAT32 và BOOL.
  • Chuỗi: Sử dụng someip_string và chỉ định thông tin mã hoá (ví dụ: UTF_8 hoặc UTF_16_LE) và độ dài (fixed_length hoặc length_field_size).
  • Mảng: Sử dụng someip_array và xác định array_type (là một SomeIpType đệ quy khác), cùng với thông tin về độ dài (fixed_length hoặc length_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.