هنگام تعریف نگاشتهای میانافزار سرویسگرای مقیاسپذیر روی IP (SOME/IP) در VSIDL، شما ساختار بار داده 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(تکرار شده): فهرستی از فیلدهایی که ساختار را تشکیل میدهند.
تعریف فیلدهای ساختار
هر فیلد درون SomeIpStruct نیاز دارد به:
-
field_name: نام فیلد. این نام باید دقیقاً با نام فیلد مربوطه که در پیام SDV protobuf تعریف شده است، مطابقت داشته باشد تا ترجمه صحیح پیام تضمین شود. -
field_type: نوع داده SOME/IP فیلد (SomeIpType). این میتواند یک نوع داده اولیه، رشته، آرایه یا یک ساختار تو در تو باشد.
نوشتن انواع فیلد 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برای جاسازی تعریف ساختار دیگر به صورت بازگشتی استفاده کنید.
مثال: تعریف نوع ساختار را بنویسید
در اینجا یک مثال عملی از نحوه نوشتن یک SomeIpStruct درون یک بلوک type_definition آورده شده است. این payload شامل یک عدد صحیح بدون علامت ۸ بیتی به نام interval و یک عدد صحیح بدون علامت ۳۲ بیتی به نام 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 }
}
}
}