كتابة ملف ربط SOME/IP

يرشدك هذا المستند إلى كيفية كتابة ملف ربط SOME/IP. يحدّد ملف ربط SOME/IP كيفية ربط خدمات SDV بخدمات SOME/IP والعكس، ما يسهّل التواصل بين وحدات التحكّم الإلكترونية (ECU) المتوافقة مع SDV وغير المتوافقة معها.

يحتوي some_ip_mapping الحقل ضمن الرسالة VsidlEntry في ملف .vsidl على معلومات الربط SOME/IP. يتيح لك الحقل some_ip_mapping تحديد عمليات ربط SOME/IP بشكل منفصل عن تعريفات خدمة SDV.

يحتوي SomeIp Mapping proto على جميع المعلومات التي يحتاجها وسيط SOME/IP لإجراء عمليات التحويل بين وحدات التحكّم الإلكترونية (ECU) المستندة إلى SOME/IP والمركبات المحدّدة بالبرامج (SDV). ويمكن أن يربط هذا البروتوكول إما خدمة SOME/IP بنظام SDV المتكامل أو وحدات خدمة SDV بنظام AUTOSAR المتكامل.

المفاهيم الأساسية

قبل كتابة ملف الربط، تعرَّف على هذه المعرّفات والمفاهيم الأساسية:

  • اسم مثيل مؤهَّل بالكامل (FQIN) لخدمة SDV: تحدّد هذه السلسلة الفريدة مثيلات خدمة SDV، وهي تتألف من اسم الجهاز الافتراضي واسم الحزمة واسم الخدمة واسم المثيل.

  • نوع SDV: هذا الاسم هو معرّف فريد لتنسيق بيانات حمولة رسالة SDV ويتوافق مع رسالة أولية.

  • SOME/IP ServiceIdentifier (SOME/IP SID): يحدّد بشكل فريد خدمات SOME/IP من خلال مجموعة من معرّف الخدمة (uint16) ومعرّف المثيل (uint16) ورقم الإصدار الرئيسي (uint8) ورقم الإصدار الثانوي (uint32).

  • استدعاء الإجراء عن بُعد (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 وSDV كحقل متكرّر، some_ip_mapping، ضمن رسالة VsidlEntry في ملف .vsidl. يتيح ذلك تحديد عمليات الربط بين SOME/IP وSDV بشكل منفصل عن تعريفات خدمة 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. يمكنك تحديد عمليات الربط بطريقتَين أساسيتَين:

  • sdv_type_mapping: يربط نوع SDV (مثل واجهة RPC أو موضوع نشر) بخدمة SOME/IP.
  • someip_service_mapping: يربط خدمة SOME/IP أولية (ومثيلاتها أو أحداثها أو طرقها) بمواضيع SDV Pub/Sub أو قنوات RPC.

يتكوّن ملف الربط الفردي من تعريف واحد أو أكثر من تعريفات SomeIpMapping.

ربط أنواع SDV

يُستخدَم sdv_type_mapping مع أنواع SDV الحالية التي تريد عرضها على شبكة SOME/IP.

بنية ربط نوع القيم الحساسة

عليك تحديد ما يلي:

  • 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 (اختياري): يحدّد سلوك اكتشاف الخدمة (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

يقدّم هذا المثال عملية ربط بين خدمة SOME/IP RPC وواجهة SDV RPC. على غرار عمليات ربط الأحداث، تستخدم الخدمة مثيلاً لتحديد اسم وحدة الخدمة. يتوافق ذلك مع اسم قناة 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"
      }
    }
  }
}

عمليات الربط التي لا تتطلّب ردًا

لا تتوفّر طرق 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
        }
      }
    }
  }
}