Menulis file pemetaan SOME/IP

Dokumen ini memandu Anda menulis file pemetaan SOME/IP. File pemetaan SOME/IP menentukan cara layanan SDV dipetakan ke layanan SOME/IP dan sebaliknya, sehingga memfasilitasi komunikasi antara ECU SDV dan non-SDV.

Kolom some_ip_mapping dalam pesan VsidlEntry di file .vsidl berisi informasi pemetaan SOME/IP. Kolom some_ip_mapping memungkinkan Anda menentukan pemetaan SOME/IP secara terpisah dari definisi layanan SDV.

SomeIp Mapping Proto berisi semua informasi yang dibutuhkan broker SOME/IP untuk transformasi antara SDV dan ECU SOME/IP. Proto ini dapat memetakan layanan SOME/IP ke ekosistem SDV atau unit layanan SDV ke ekosistem AUTOSAR.

Konsep inti

Sebelum menulis file pemetaan, pahami konsep dan ID utama berikut:

  • Nama Instance yang Sepenuhnya Memenuhi Syarat SDV (FQIN): String unik ini mengidentifikasi instance layanan SDV. ID ini terdiri dari nama VM, nama paket, nama layanan, dan nama instance.

  • Jenis SDV: Nama ini adalah ID unik untuk format data payload pesan SDV dan sesuai dengan pesan proto.

  • SOME/IP ServiceIdentifier (SOME/IP SID): Mengidentifikasi layanan SOME/IP secara unik dengan kombinasi ID layanan (uint16), ID instance (uint16), versi utama (uint8), dan versi minor (uint32).

  • RPC SDV: Metode yang ditawarkan oleh layanan SDV, yang diidentifikasi oleh method name (string), Type yang berisi, dan nama channel.

  • Pub/Sub SDV: Topik yang dipublikasikan atau dilanggan oleh layanan SDV dan diidentifikasi oleh nama Type dan Topic

  • RPC SOME/IP: Diidentifikasi berdasarkan ID layanan, ID instance, dan ID metode (uint16).

  • Peristiwa SOME/IP: Dipublikasikan oleh layanan SOME/IP untuk Pub/Sub dan diidentifikasi berdasarkan ID layanan, ID instance, ID peristiwa (uint16), dan termasuk dalam grup peristiwa (uint16).

  • Broker SOME/IP: Komponen penghubung di SDV yang menggunakan file pemetaan SOME/IP untuk mengaktifkan komunikasi antara SDV dan layanan SOME/IP.

Struktur dan lokasi file

Informasi pemetaan SOME/IP disertakan sebagai kolom berulang, some_ip_mapping, dalam pesan VsidlEntry di file .vsidl Anda. Hal ini memungkinkan pemetaan SOME/IP ditentukan secara terpisah dari definisi layanan SDV, sehingga Anda dapat mengelola pemetaan dalam file khusus.

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

Membuat file pemetaan

File pemetaan SOME/IP biasanya berisi definisi yang menerjemahkan antara ekosistem SDV dan protokol jaringan SOME/IP. Anda dapat menentukan pemetaan dengan dua cara utama:

  • sdv_type_mapping: Memetakan jenis SDV (seperti antarmuka RPC atau topik publikasi) ke layanan SOME/IP.
  • someip_service_mapping: Memetakan layanan SOME/IP mentah (dan instance, peristiwa, atau metodenya) ke topik Pub/Sub SDV atau saluran RPC.

Satu file pemetaan terdiri dari satu atau beberapa definisi SomeIpMapping.

Pemetaan jenis SDV

sdv_type_mapping adalah untuk jenis SDV yang ada yang ingin Anda ekspos ke jaringan SOME/IP.

Struktur pemetaan jenis SDV

Anda harus menentukan:

  • unit_type: Jenis SDV yang dipetakan (diidentifikasi oleh package_name dan type_name).
  • someip_service_id: ID layanan SOME/IP 16-bit.
  • version_major dan version_minor: Versi layanan SOME/IP.
  • service_oriented_mapping: Menentukan perilaku pemetaan tertentu (baik untuk antarmuka RPC atau publikasi).

Contoh pemetaan publikasi

Jika jenis SDV Anda adalah topik (publikasi), gunakan publication_mapping. Hal ini memetakan struktur data (type_definition) dan ID Peristiwa SOME/IP atau ID EventGroup, diikuti dengan memetakan topik SDV tertentu ke instance 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
      }
    }
  }
}

Contoh pemetaan antarmuka RPC

Jika jenis SDV Anda adalah antarmuka RPC, gunakan rpc_interface_mapping. Petakan nama prosedur SDV ke instance method_id SOME/IP, dan tautkan saluran SDV ke instance 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
      }
    }
  }
}

Pemetaan layanan SOME/IP

someip_service_mapping mengonfigurasi cara pemetaan layanan SOME/IP tertentu (yang ditemukan atau ditawarkan di jaringan) ke topik dan saluran SDV. Hal ini memungkinkan pemetaan berparameter kompleks dari peristiwa dan RPC.

Struktur pemetaan layanan SOME/IP

  • someip_service_id, version_major, version_minor: Mengidentifikasi layanan SOME/IP.
  • sd_behavior (opsional): Menentukan perilaku penemuan layanan (EXACT_OR_ANY_MINOR_VERSION atau MINIMUM_MINOR_VERSION)

  • instance: Memparameterkan unit dan topik layanan SDV untuk instance instance_id SOME/IP tertentu.

  • instance_impl: Mendeskripsikan penerapan instance, memetakan peristiwa atau metode ke unit layanan berparameter.

Contoh pemetaan peristiwa

Contoh ini memetakan peristiwa SOME/IP ke topik SDV. Contoh ini menggunakan instance untuk memetakan ID 1 ke string literal 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) ...
        }
      }
    }
  }
}

Contoh pemetaan RPC

Contoh ini memetakan layanan RPC SOME/IP ke antarmuka RPC SDV. Mirip dengan pemetaan peristiwa, layanan menggunakan instance untuk memparameterisasi nama unit layanan. Ini sesuai dengan nama channel RPC di SDV. Blok instance_impl kemudian menentukan instance offered_interface untuk menautkan method_id SOME/IP ke nama prosedur 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
      }
    }
  }
}

Fitur lanjutan

Bagian ini menjelaskan fitur lanjutan yang didukung oleh pemetaan SOME/IP.

Acara kelompok

group_event memungkinkan satu peristiwa SOME/IP dibagi dan dipetakan ke beberapa topik SDV secara bersamaan. Hal ini dilakukan dengan menentukan beberapa entri event_part dan menggunakan field_name_mapping untuk memetakan nama kolom payload SOME/IP masuk ke nama kolom payload 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"
      }
    }
  }
}

Pemetaan sekali pakai

Metode fire and forget (F&F) SOME/IP tidak memiliki padanan langsung di antarmuka SDV RPC. Sebagai gantinya, metode ini dipanggil dengan memetakan topik SDV (publikasi) ke metode F&F menggunakan publication_mapping. Saat data dipublikasikan ke topik SDV yang sesuai, broker akan menerjemahkannya ke panggilan metode F&F SOME/IP.

Untuk mengonfigurasi ini, Anda harus menyetel someip_ff_methods: true dalam blok offered_topic, dan memberikan detail perutean fire_and_forget_method tujuan di dalam 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
        }
      }
    }
  }
}