כשמגדירים מיפויים של תוכנת ביניים מבוססת-שירות וניתנת להרחבה על גבי IP (SOME/IP) ב-VSIDL, מתארים את המבנה של מטען הייעודי (payload) של SOME/IP. אתם מתארים את המבנה באמצעות ההודעה SomeIpType, שמאפשרת לכם ליצור מודלים של פרימיטיבים, מחרוזות, מערכים ומבנים מורכבים.
בדף הזה נסביר איך לכתוב הגדרת סוג SomeIpStruct, שמשמשת בבלוקים type_definition למיפוי אירועים ושיטות.
הודעה מסוג SomeIpStruct
הודעת SomeIpStruct מייצגת מטען ייעודי (payload) מובנה של SOME/IP שמורכב מכמה שדות. המבנה שמוגדר כאן משמש את מתווך SOME/IP כדי לתרגם בין בייטים גולמיים של SOME/IP לבין השדות של הודעת SDV protobuf.
כשמגדירים struct, קובעים שני מאפיינים עיקריים:
-
length_field_size(אופציונלי): מציין את הגודל (בבייטים) של שדה האורך שקודם למבנה ב-payload שעבר סריאליזציה. הערכים שבהם נעשה שימוש מתוך enumLengthFieldSizeכוללים אתZERO(ללא שדה אורך),ONE,TWOו-FOUR. -
field(repeated): רשימה של שדות שמרכיבים את המבנה.
הגדרת שדות של מבנה
כל שדה בתוך SomeIpStruct צריך לכלול:
-
field_name: שם השדה. השם הזה חייב להיות זהה לשם השדה התואם שהוגדר בהודעת ה-protobuf של SDV, כדי להבטיח תרגום נכון של ההודעה. -
field_type: סוג הנתונים של השדה (SomeIpType) ב-SOME/IP. יכול להיות שזהו סוג נתונים פרימיטיבי, מחרוזת, מערך או מבנה מקונן אחר.
כתיבה של סוגי השדות SomeIpType
הבלוק field_type מגדיר את סוג הנתונים הספציפי באמצעות אחת מהאפשרויות הבאות:
- סוגים פרימיטיביים: משתמשים ב-
someip_primitiveעם ערכים כמוUINT8, UINT32, INT32, FLOAT32ו-BOOL. - מחרוזות: משתמשים ב-
someip_stringומציינים את הקידוד (לדוגמה,UTF_8, UTF_16_LE) ואת פרטי האורך (fixed_lengthאוlength_field_size). - מערכים: משתמשים ב-
someip_arrayומגדירים אתarray_type(שהוא עודSomeIpTypeרקורסיבי), יחד עם מידע על האורך (fixed_lengthאוlength_field_size). - מבני נתונים מוטמעים: אפשר להשתמש ב-
someip_structכדי להטמיע הגדרה אחרת של מבנה נתונים באופן רקורסיבי.
דוגמה: כתיבת הגדרה של סוג struct
הנה דוגמה מעשית לאופן הכתיבה של SomeIpStruct בתוך בלוק type_definition. המטען הייעודי (payload) הזה מכיל מספר שלם לא מסומן בן 8 ביט בשם interval ומספר שלם לא מסומן בן 32 ביט בשם counter:
type_definition {
# No length field precedes this struct
length_field_size: ZERO
# First field: interval
field {
field_name: "interval"
field_type {
someip_primitive: UINT8
}
}
# Second field: counter
field {
field_name: "counter"
field_type {
someip_primitive: UINT32
}
}
}
הוספת סוגים מורכבים
כדי לכלול שדה מחרוזת באורך דינמי ומערך בתוך המבנה, מוסיפים שדות כמו אלה:
field {
field_name: "status_message"
field_type {
someip_string {
string_encoding: UTF_8
length_field_size: FOUR
}
}
}
field {
field_name: "measurements"
field_type {
someip_array {
length_field_size: FOUR
array_type { someip_primitive: FLOAT32 }
}
}
}