เขียนคำจำกัดความประเภท SOME/IP

เมื่อกำหนดการแมปมิดเดิลแวร์ที่มุ่งเน้นบริการที่ปรับขนาดได้ผ่าน IP (SOME/IP) ใน VSIDL คุณจะอธิบายโครงสร้างของเพย์โหลด SOME/IP คุณอธิบายโครงสร้างโดยใช้ SomeIpType message ซึ่งช่วยให้คุณสร้างโมเดลของ Primitive, สตริง, อาร์เรย์ และโครงสร้างที่ซับซ้อนได้

หน้านี้มุ่งเน้นที่วิธีเขียนคำจำกัดความประเภท SomeIpStruct ซึ่งใช้ในบล็อก type_definition สำหรับการแมปเหตุการณ์และวิธีการ

ข้อความ SomeIpStruct

SomeIpStructข้อความแสดงถึงเพย์โหลด SOME/IP ที่มีโครงสร้างซึ่งประกอบด้วย หลายฟิลด์ โครงสร้างที่กำหนดไว้ที่นี่จะใช้โดยโบรกเกอร์ SOME/IP เพื่อ แปลระหว่างไบต์ SOME/IP ดิบกับฟิลด์ของข้อความ SDV protobuf

เมื่อกำหนดโครงสร้าง คุณจะกำหนดค่าพร็อพเพอร์ตี้หลัก 2 รายการ ได้แก่

  • length_field_size (ไม่บังคับ): ระบุขนาด (เป็นไบต์) ของ ฟิลด์ความยาวที่อยู่ก่อนโครงสร้างในเพย์โหลดที่แปลงเป็นรูปแบบข้อมูล ค่าที่ใช้จาก Enum LengthFieldSize ได้แก่ ZERO (ไม่มีฟิลด์ความยาว), ONE, TWO และ FOUR
  • field (ซ้ำ): รายการฟิลด์ที่ประกอบกันเป็นโครงสร้าง

กำหนดฟิลด์ของโครงสร้าง

แต่ละฟิลด์ภายใน SomeIpStruct ต้องมีข้อมูลต่อไปนี้

  • field_name: ชื่อฟิลด์ ต้องตรงกันทุกประการกับ ชื่อฟิลด์ที่เกี่ยวข้องซึ่งกำหนดไว้ในข้อความ SDV protobuf เพื่อให้มั่นใจว่าข้อความจะได้รับการแปลอย่างถูกต้อง
  • field_type: ประเภทข้อมูล SOME/IP ของฟิลด์ (SomeIpType) ซึ่งอาจเป็น Primitive, สตริง, อาร์เรย์ หรือโครงสร้างที่ซ้อนกันอีก

เขียนประเภทฟิลด์ SomeIpType

บล็อก field_type จะกำหนดค่าประเภทข้อมูลที่เฉพาะเจาะจงโดยใช้ตัวแปรใดตัวแปรหนึ่งต่อไปนี้

  • ประเภทดั้งเดิม: ใช้ someip_primitive กับค่าต่างๆ เช่น UINT8, UINT32, INT32, FLOAT32 และ BOOL
  • สตริง: ใช้ someip_string และระบุการเข้ารหัส (เช่น UTF_8, UTF_16_LE) และข้อมูลความยาว (fixed_length หรือ length_field_size)
  • อาร์เรย์: ใช้ someip_array และกำหนด array_type (ซึ่งเป็น SomeIpType แบบเรียกซ้ำอีกรายการ) พร้อมกับข้อมูลความยาว (fixed_length หรือ length_field_size)
  • โครงสร้างที่ซ้อนกัน: ใช้ someip_struct เพื่อฝังคำจำกัดความของโครงสร้างอื่นแบบเรียกซ้ำ

ตัวอย่าง: เขียนคำจำกัดความประเภทโครงสร้าง

ต่อไปนี้เป็นตัวอย่างการเขียน SomeIpStruct ภายในบล็อก type_definition เพย์โหลดนี้มีจำนวนเต็มแบบ 8 บิตที่ไม่ใช่ค่าลบชื่อ interval และจำนวนเต็มแบบ 32 บิตที่ไม่ใช่ค่าลบชื่อ 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
    }
  }
}

เพิ่มประเภทที่ซับซ้อน

หากต้องการรวมฟิลด์สตริงแบบความยาวแบบไดนามิกและอาร์เรย์ภายใน struct ให้เพิ่มฟิลด์ดังนี้

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 }
    }
  }
}