במאמר הזה מוסבר איך לכתוב קובץ מיפוי של 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ו-TopicSOME/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/IPinstance_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
}
}
}
}
}