כתיבת קובץ מיפוי של 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.

SomeIp Mapping proto מכיל את כל המידע שנדרש למתווך SOME/IP כדי לבצע טרנספורמציות בין SDV לבין יחידות בקרה אלקטרוניות (ECU) של SOME/IP. פרוטוקול זה יכול למפות שירות SOME/IP למערכת האקולוגית של SDV או יחידות שירות של SDV למערכת האקולוגית של AUTOSAR.

מושגי ליבה

לפני שכותבים את קובץ המיפוי, חשוב להבין את המושגים והמזהים המרכזיים האלה:

  • שם מופע מלא (FQIN) של SDV: מחרוזת ייחודית שמזהה מופעים של שירות SDV. היא מורכבת משם המכונה הווירטואלית, שם החבילה, שם השירות ושם המופע.

  • סוג SDV: השם הזה הוא מזהה ייחודי של פורמט הנתונים של מטען ייעודי (payload) של הודעת SDV, והוא תואם להודעת פרוטו.

  • SOME/IP ServiceIdentifier (SOME/IP SID): מזהה באופן ייחודי שירותי 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 broker: רכיב גישור ב-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. אפשר להגדיר מיפויים בשתי דרכים עיקריות:

  • sdv_type_mapping: מיפוי של סוג SDV (כמו ממשק RPC או נושא פרסום) לשירות SOME/IP.
  • someip_service_mapping: מיפוי של שירות SOME/IP גולמי (והמופעים, האירועים או השיטות שלו) לנושאי Pub/Sub של SDV או לערוצי RPC.

קובץ מיפוי יחיד מורכב מהגדרה אחת או יותר של SomeIpMapping.

מיפוי סוגי 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 למופעים של 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 עבור מופעים ספציפיים של 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 כדי למפות את שמות השדות של מטען הייעודי (payload) הנכנס של 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

לשיטות SOME/IP fire and forget (F&F) אין מקבילה ישירה בממשקי SDV RPC. במקום זאת, הן מופעלות על ידי מיפוי של נושא SDV (פרסום) ל-method‏ F&F באמצעות publication_mapping. כשנתונים מתפרסמים בנושא SDV המתאים, הברוקר מתרגם אותם להפעלת method מסוג 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
        }
      }
    }
  }
}