เอกสารนี้จะแนะนำวิธีเขียนไฟล์การแมป 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ที่มี และชื่อchannelSDV Pub/Sub: หัวข้อที่บริการ SDV เผยแพร่หรือสมัครใช้บริการ และ ระบุโดย
Typeและชื่อTopicSOME/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/IPsomeip_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/IPservice_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/IPsd_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
}
}
}
}
}