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

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ừ enum LengthFieldSize bao gồm ZERO (không có trường độ dài), ONE, TWOFOUR.
  • 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_primitive với các giá trị như UINT8, UINT32, INT32, FLOAT32BOOL.
  • Chuỗi: Sử dụng someip_string và chỉ định thông tin về mã hoá (ví dụ: UTF_8, 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 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 }
    }
  }
}