เขียนไฟล์การแมป SOME/IP

เอกสารนี้จะแนะนำวิธีเขียนไฟล์การแมป SOME/IP ไฟล์การแมป SOME/IP จะกำหนดวิธีที่บริการ SDV แมปกับบริการ SOME/IP และในทางกลับกัน ซึ่งช่วยให้การสื่อสารระหว่าง ECU ของ SDV และที่ไม่ใช่ SDV เป็นไปได้

ฟิลด์ some_ip_mapping ภายในข้อความ VsidlEntry ในไฟล์ .vsidl มีข้อมูลการแมป SOME/IP ฟิลด์ some_ip_mapping ช่วยให้คุณกำหนดการแมป SOME/IP แยกจากการกำหนดบริการ SDV ได้

Proto SomeIp Mapping มีข้อมูลทั้งหมดที่โบรกเกอร์ SOME/IP ต้องการสำหรับการแปลงระหว่าง ECU ของ SDV และ SOME/IP Proto นี้สามารถแมปบริการ SOME/IP กับระบบนิเวศ SDV หรือหน่วยบริการ SDV กับระบบนิเวศ AUTOSAR

แนวคิดหลัก

ก่อนเขียนไฟล์การแมป โปรดทำความเข้าใจตัวระบุและแนวคิดหลักต่อไปนี้

  • ชื่ออินสแตนซ์แบบสมบูรณ์ (FQIN) ของ SDV: สตริงที่ไม่ซ้ำกันนี้จะระบุอินสแตนซ์บริการ SDV ซึ่งประกอบด้วยชื่อ VM, ชื่อแพ็กเกจ, ชื่อบริการ และชื่ออินสแตนซ์

  • ประเภท SDV: ชื่อนี้เป็นตัวระบุที่ไม่ซ้ำกันสำหรับรูปแบบข้อมูลของเพย์โหลดข้อความ SDV และสอดคล้องกับข้อความ proto

  • ServiceIdentifier (SOME/IP SID) ของ SOME/IP: ระบุบริการ SOME/IP ได้อย่างไม่ซ้ำกันด้วยการผสมผสานระหว่างรหัสบริการ (uint16), รหัสอินสแตนซ์ (uint16), เวอร์ชันหลัก (uint8) และเวอร์ชันย่อย (uint32)

  • SDV RPC: เมธอดที่บริการ SDV มีให้ ซึ่งระบุโดย method name (สตริง), Type ที่มี และชื่อ channel

  • SDV Pub/Sub: หัวข้อที่บริการ SDV เผยแพร่หรือสมัครใช้บริการ และ ระบุโดย Type และชื่อ Topic

  • SOME/IP RPC: ระบุโดยรหัสบริการ, รหัสอินสแตนซ์ และรหัสเมธอด (uint16)

  • เหตุการณ์ SOME/IP: เผยแพร่โดยบริการ SOME/IP สำหรับ Pub/Sub และระบุโดยรหัสบริการ, รหัสอินสแตนซ์, รหัสเหตุการณ์ (uint16) และเป็นของกลุ่มเหตุการณ์ (uint16)

  • โบรกเกอร์ SOME/IP: คอมโพเนนต์การเชื่อมต่อใน SDV ที่ใช้ไฟล์การแมป SOME/IP เพื่อเปิดใช้การสื่อสารระหว่างบริการ SDV และ SOME/IP

โครงสร้างและตำแหน่งไฟล์

ข้อมูลการแมป SOME/IP จะรวมอยู่ในฟิลด์ที่ทำซ้ำ some_ip_mapping ภายในข้อความ VsidlEntry ในไฟล์ .vsidl ซึ่งช่วยให้กำหนดการแมป SOME/IP แยกจากการกำหนดบริการ SDV ได้ ทำให้คุณจัดการการแมปในไฟล์เฉพาะได้

// The root message for VSIDL files.
message VsidlEntry {
  // Required. Package name for entities mentioned in the file.
  string package = 1;
  // List of SDV service bundles defined in the file.
  repeated ServiceBundle sdv_service_bundle = 2;
  // Enables custom extensions beyond the standard VSIDL model.
  repeated google.xml.Any extension = 3;

  // SOMEIP mapping rules.
  repeated sdv.someip.v1.SomeIpMapping some_ip_mapping = 4;
  // VHAL mapping rules.
  repeated VhalMapping vhal_mapping = 5;
}

สร้างไฟล์การแมป

โดยปกติแล้ว ไฟล์การแมป SOME/IP จะมีการกำหนดที่แปลระหว่างระบบนิเวศ SDV กับโปรโตคอลเครือข่าย SOME/IP คุณสามารถกำหนดการแมปได้ 2 วิธีหลักๆ ดังนี้

  • sdv_type_mapping: แมปประเภท SDV (เช่น อินเทอร์เฟซ RPC หรือหัวข้อการเผยแพร่) กับบริการ SOME/IP
  • someip_service_mapping: แมปบริการ SOME/IP ดิบ (และอินสแตนซ์ เหตุการณ์ หรือเมธอดของบริการ) กับหัวข้อ Pub/Sub หรือแชแนล RPC ของ SDV

ไฟล์การแมปเดียวประกอบด้วยการกำหนด SomeIpMapping อย่างน้อย 1 รายการ

การแมปประเภท SDV

sdv_type_mapping ใช้สำหรับประเภท SDV ที่มีอยู่ซึ่งคุณต้องการแสดงในเครือข่าย SOME/IP

โครงสร้างการแมปประเภท SDV

คุณต้องระบุข้อมูลต่อไปนี้

  • unit_type: ประเภท SDV ที่กำลังแมป (ระบุโดย package_name และ type_name)
  • someip_service_id: รหัสบริการ SOME/IP ขนาด 16 บิต
  • version_major และ version_minor: การกำหนดเวอร์ชันของบริการ SOME/IP
  • service_oriented_mapping: กำหนดลักษณะการทำงานของการแมปที่เฉพาะเจาะจง (สำหรับอินเทอร์เฟซ RPC หรือการเผยแพร่)

ตัวอย่างการแมปการเผยแพร่

หากประเภท SDV เป็นหัวข้อ (การเผยแพร่) ให้ใช้ publication_mapping ซึ่งจะแมปโครงสร้างของข้อมูล (type_definition) และรหัสเหตุการณ์หรือรหัสกลุ่มเหตุการณ์ SOME/IP ตามด้วยการแมปหัวข้อ SDV ที่เฉพาะเจาะจงกับอินสแตนซ์ SOME/IP

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.samples"
    type_name: "SpeedData"
  }
  someip_service_id: 0x1001
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    publication_mapping {
      offered_topic {
        simple_mapping {
          group_id: 1
          event_id: 0x8001
        }
        # type_definition defines the structural mapping to SOME/IP payloads
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
      }
      # Maps the SDV topic name to a specific SOME/IP instance
      topic_mapping {
        topic: "vehicle_speed_topic"
        instance_id: 0x0001
      }
    }
  }
}

ตัวอย่างการแมปอินเทอร์เฟซ RPC

หากประเภท SDV เป็นอินเทอร์เฟซ RPC ให้ใช้ rpc_interface_mapping แมปชื่อขั้นตอน SDV กับอินสแตนซ์ method_id ของ SOME/IP และลิงก์แชแนล SDV กับอินสแตนซ์ SOME/IP

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.samples"
    type_name: "DoorControl"
  }
  someip_service_id: 0x2001
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    rpc_interface_mapping {
      offered_interface {
        method {
          procedure: "LockDoors"
          method_id: 0x0001
          # request_payload_mapping and response_payload_mapping can be defined here
        }
      }
      rpc_channel_mapping {
        channel: "front_doors"
        instance_id: 0x0001
      }
    }
  }
}

การแมปบริการ SOME/IP

someip_service_mapping จะกำหนดค่าวิธีที่บริการ SOME/IP ที่เฉพาะเจาะจง (ที่ค้นพบหรือเสนอในเครือข่าย) แมปกับหัวข้อและแชแนล SDV ซึ่งช่วยให้สามารถแมปเหตุการณ์และ RPC ที่มีพารามิเตอร์ซับซ้อนได้

โครงสร้างการแมปบริการ SOME/IP

  • someip_service_id, version_major, version_minor: ระบุบริการ SOME/IP
  • sd_behavior (ไม่บังคับ): กำหนดลักษณะการทำงานของ Service Discovery (EXACT_OR_ANY_MINOR_VERSION หรือ MINIMUM_MINOR_VERSION)

  • instance: กำหนดพารามิเตอร์หน่วยบริการและหัวข้อ SDV สำหรับอินสแตนซ์ instance_id ของ SOME/IP ที่เฉพาะเจาะจง

  • instance_impl: อธิบายการใช้งานอินสแตนซ์ โดยแมปเหตุการณ์หรือเมธอดกับหน่วยบริการที่มีพารามิเตอร์

ตัวอย่างการแมปเหตุการณ์

ตัวอย่างนี้จะแมปเหตุการณ์ SOME/IP กับหัวข้อ SDV โดยใช้ instance เพื่อแมปรหัส 1 กับสตริงตัวอักษร speed_sensor_unit

someip_service_mapping {
  someip_service_id: 0x1001
  version_major: 1
  version_minor: 0
  # Parameterize instances
  instance {
    instance_id: 0x0001
    sdv_service_unit_parameterization {
      key: 1
      value: "speed_sensor_unit"
    }
    sdv_topic_parameterization {
      key: 1
      value {
        topic: "speed_topic"
        capacity: 10
      }
    }
  }
  # Description of all instances
  instance_impl {
    offered_event {
      group_id: 1
      event_id: 0x8001
      simple_event {
        sdv_unit_type {
          package_name: "com.android.sdv.samples"
          type_name: "SpeedData"
        }
        # Refers to key 1 in sdv_service_unit_parameterization. If unspecified,
        # service unit name will be automatically generated by the broker
        service_unit: 1
        topic: 1        # Refers to key 1 in sdv_topic_parameterization
        message_translation_mode: REFLECTION
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
      }
    }
  }
}

ตัวอย่างการแมป RPC

ตัวอย่างนี้จะแมปบริการ RPC ของ SOME/IP กับอินเทอร์เฟซ RPC ของ SDV บริการนี้ใช้ `instance` เพื่อกำหนดพารามิเตอร์ชื่อหน่วยบริการ ซึ่งคล้ายกับการแมปเหตุการณ์ ซึ่งสอดคล้องกับชื่อแชแนล RPC ใน SDV จากนั้นบล็อก instance_impl จะกำหนดอินสแตนซ์ของ offered_interface เพื่อลิงก์ method_id ของ SOME/IP กับชื่อขั้นตอน SDV ดังนี้

someip_service_mapping {
  someip_service_id: 0x2001
  version_major: 1
  version_minor: 0
  # Parameterize instances
  instance {
    instance_id: 0x0001
    sdv_service_unit_parameterization {
      key: 1
      value: "door_control_unit"
    }
  }
  instance_impl {
    offered_interface {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "DoorControl"
      }
      # Refers to key 1 in sdv_service_unit_parameterization. This corresponds
      # to the RPC channel name in SDV.
      service_unit: 1
      method {
        procedure: "LockDoors"
        method_id: 0x0001
     # request_payload_mapping and response_payload_mapping can be defined here
      }
    }
  }
}

ฟีเจอร์ขั้นสูง

ส่วนนี้อธิบายฟีเจอร์ขั้นสูงที่การแมป SOME/IP รองรับ

จัดกลุ่มเหตุการณ์

group_event ช่วยให้แยกและแมปเหตุการณ์ SOME/IP เดียวกับหัวข้อ SDV หลายรายการพร้อมกันได้ โดยระบุรายการ event_part หลายรายการและใช้ field_name_mapping เพื่อแมปชื่อฟิลด์เพย์โหลด SOME/IP ขาเข้าไปยังชื่อฟิลด์เพย์โหลด SDV

offered_event {
  group_id: 1
  event_id: 0x8002
  group_event {
    type_definition {
      # Definition of the complete SOME/IP payload
    }
    event_part {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "PartAData"
      }
      service_unit: 1
      topic: 1
      field_name_mapping {
        key: "someip_field_a"
        value: "sdv_field_a"
      }
    }
    event_part {
      sdv_unit_type {
        package_name: "com.android.sdv.samples"
        type_name: "PartBData"
      }
      service_unit: 2
      topic: 2
      field_name_mapping {
        key: "someip_field_b"
        value: "sdv_field_b"
      }
    }
  }
}

การแมปแบบ Fire and Forget

เมธอด Fire and Forget (F&F) ของ SOME/IP ไม่มีเมธอดที่เทียบเท่าโดยตรงในอินเทอร์เฟซ RPC ของ SDV แต่จะเรียกใช้โดยการแมปหัวข้อ SDV (การเผยแพร่) กับเมธอด F&F โดยใช้ publication_mapping เมื่อมีการเผยแพร่ข้อมูลไปยังหัวข้อ SDV ที่เกี่ยวข้อง โบรกเกอร์จะแปลข้อมูลนั้นเป็นการเรียกใช้เมธอด F&F ของ SOME/IP

หากต้องการกำหนดค่านี้ คุณต้องตั้งค่า someip_ff_methods: true ภายในบล็อก offered_topic และระบุรายละเอียดการกำหนดเส้นทาง fire_and_forget_method ปลายทางภายใน topic_mapping

sdv_type_mapping {
  unit_type {
    package_name: "com.android.sdv.sample.someip"
    type_name: "CounterLoad"
  }
  someip_service_id: 0x13
  version_major: 1
  version_minor: 0
  service_oriented_mapping {
    publication_mapping {
      offered_topic {
        type_definition {
          # ... (SomeIpStruct definition) ...
        }
        someip_ff_methods: true
      }
      topic_mapping {
        topic: "counter-load-start-counter"
        instance_id: 0x1
        fire_and_forget_method {
          service_id: 0x3700
          instance_id: 0x1000
          version_major: 1
          version_minor: 0
          method_id: 0x1000
        }
      }
    }
  }
}