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

หน้านี้จะแนะนำวิธีเขียนไฟล์การแมป SOME/IP ใน VSIDL ไฟล์การแมป SOME/IP จะกำหนดวิธีที่บริการ SDV ของ AAOS แมปกับอินเทอร์เฟซบริการ SOME/IP ของ AUTOSAR (service_id, instance_id, eventgroup_id และ method_id ที่กำหนดไว้ใน ARXML ของระบบหรือการกำหนดค่า vsomeip) ซึ่งจะช่วยให้การสื่อสารแบบ 2 ทิศทาง ระหว่างเครื่องเสมือน SDV และ ECU ของยานพาหนะภายนอกเป็นไปได้

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

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

แนวคิดหลัก

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

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

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

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

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

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

  • RPC ของ SOME/IP: ระบุโดยรหัสบริการ รหัสอินสแตนซ์ และรหัสเมธอด (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 ของ SDV หรือช่อง RPC

ไฟล์การแมปเดียวประกอบด้วย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 หรือ รหัส EventGroup ตามด้วยการแมปหัวข้อ 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 กับอินสแตนซ์ SOME/IP method_id และลิงก์แชแนล 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 สำหรับอินสแตนซ์ SOME/IP instance_id ที่เฉพาะเจาะจง

  • 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

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

การแมปแบบส่งแล้วไม่ต้องรอรับ

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

หากต้องการกำหนดค่านี้ คุณต้องตั้งค่า 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
        }
      }
    }
  }
}